Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Retrieve the Bottom Center Pivot of an Object?

    Cinema 4D SDK
    r21 python
    3
    5
    661
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      bentraje
      last edited by

      Hi,

      Is there a way I can retrieve the bottom pivot of an object both in local and world space?

      You can see the illustration of the problem here:
      https://www.dropbox.com/s/km43npmh6j7sddm/c4d178_python_get_bottom_center_pivot.jpg?dl=0

      Thank you for looking at my problem.

      1 Reply Last reply Reply Quote 0
      • ferdinandF
        ferdinand
        last edited by ferdinand

        Hi,

        ignoring the fact, that you are using the term "bottom" in your diagram - which would hint at a much harder and not yet properly solved problem: giving computers a sense of human shape recognition -, I assume you are just after the minima and maxima of the vertex positions of an object in a reference frame. First of all: Note, that there is the slightly confusingly named BaseObject.GetRad(), which will give you the bounding box vector for an object.

        If you are after the bounding box of an object in a reference frame, that is not the associated frame (local matrix) of that object, you simply have have to iterate through all points in that frame and figure out the minima and maxima, i.e. compute its bounding box in that frame. In pseudo code for just the minimum y-axis case of your example:

        min_y = None
        for p in my_objects.GetAllPoints():
            _p = p * my_transform_matrix
            min_y = _p.y if not min_y else min(_p.y, min_y)
        

        If you are unsure on how matrix transforms work, this thread might help you out.

        Cheers
        zipit

        MAXON SDK Specialist
        developers.maxon.net

        1 Reply Last reply Reply Quote 1
        • B
          bentraje
          last edited by

          Hi @zipit

          Thanks again for the response.

          RE: this thread might help you out
          Yes, I'm trying to reperform the Axis Center manager but through code. However, unlike in the thread you referred to where the axis is arbitrary, I wanted the bottom center pivot. (Or Bottom Center Axis? In Maya, it's called a Pivot)

          RE: Pseudo Code
          I'm assuming the aforementioned code is in bottom world space (i.e. the bottom center world space and the bottom center local space is a different solution). Correct me if I'm wrong.

          Your code works for world space other than 0. But not if its in 0. See illustration here:
          https://www.dropbox.com/s/4rk3cdu83wydnn8/c4d178_python_get_bottom_center_pivot02.jpg?dl=0

          RE: _p.y
          Just wondering where is the .y referred? I can't see it in the documentation. The only way I would be able to retrieve it previously is through GetMg().off[1]

          1 Reply Last reply Reply Quote 0
          • ferdinandF
            ferdinand
            last edited by

            Hi,

            the code was meant to be just in a an arbitrary frame of reference, that is why I did link the matrix stuff, which you probably can ignore otherwise. The _p.y stuff is the y component of a vector. When you multiply a vector by a (transform) matrix you get the point transformed by that matrix, usually denoted as p' = M * p.

            Anyways, wrote this dry (here in the forum editor) too and I made a little oopsie here too, as I did not think of the special case you did encounter, the fixed code could look like this (again dry, no c4d here).

            import sys
            
            min_y = sys.maxint
            for p in my_object.GetAllPoints():
                _p = p * my_object.GetMg()
                min_y = min(_p.y, min_y)
            

            Cheers
            zipit

            MAXON SDK Specialist
            developers.maxon.net

            1 Reply Last reply Reply Quote 1
            • M
              m_adam
              last edited by

              Hi @bentraje beside zipit said which is indeed correct you may found interesting a plugin I made a long time ago when I started python, which has exactly this purpose but also supports specific objects such as sweep, spline and so on.

              https://github.com/gr4ph0s/graph_bottom_center_axis/blob/master/bottom_axis_center.pyp

              Cheers,
              Maxime.

              MAXON SDK Specialist

              Development Blog, MAXON Registered Developer

              1 Reply Last reply Reply Quote 0
              • First post
                Last post