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
    • Recent
    • Tags
    • Users
    • Login

    Rotate Point around Axis

    Scheduled Pinned Locked Moved PYTHON Development
    5 Posts 0 Posters 443 Views
    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.
    • H Offline
      Helper
      last edited by

      On 05/06/2015 at 02:14, xxxxxxxx wrote:

      I guess this is a simple and very common function. But I cant figure out how to do so in python. And I am stupid.

      I want to rotate a Point selection around the modelling axis.

      Question 1:
      How do I calculate the rotation? I need a deffiniton which includes Point, RotationAxisMatrix,Rotation as parameter. I have tried to figure that out without luck till now.

      Question 2: Is there a python function to get the Matrix of the Modelling-Axis in componentsmode?

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 05/06/2015 at 08:15, xxxxxxxx wrote:

        Hi,

        This is isn't a so simple and common question 🙂.

        Originally posted by xxxxxxxx

        Question 1:
        How do I calculate the rotation? I need a definiton which includes Point, RotationAxisMatrix, Rotation as parameter. I have tried to figure that out without luck till now.

        First you should first have a good understanding of how matrices work in Cinema. See Matrix Fundamentals in the Python documentation.

        Originally posted by xxxxxxxx

        Question 2:
        Is there a python function to get the Matrix of the Modelling-Axis in componentsmode?

        There's no direct function for this. Here's some code:

        def GetModelingAxis(op) :
          tool = plugins.FindPlugin(c4d.ID_MODELING_AXIS, c4d.PLUGINTYPE_TOOL)
          
          # Get modeling axis bounds
          posx = tool[c4d.MDATA_AXIS_BOUNDS_X]
          posy = tool[c4d.MDATA_AXIS_BOUNDS_Y]
          posz = tool[c4d.MDATA_AXIS_BOUNDS_Z]
          
          # Get center and bounding box of object
          mp = op.GetMp()
          rad = op.GetRad()
          
          # Initialize modeling axis with center of object
          maxis = c4d.Matrix()
          maxis.off = mp
          
          # Change offset of modeling axis according to bounds
          maxis.off.x += rad.x*posx;
          maxis.off.y += rad.y*posy;
          maxis.off.z += rad.z*posz;
          
          return maxis
        
        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 08/06/2015 at 03:34, xxxxxxxx wrote:

          Thanks a lot Yannick. I think this will help me.

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            On 18/12/2015 at 16:17, xxxxxxxx wrote:

            Hi Yanick, I have tried the Code you posted but it returns allways zero.
            Is it possible that this function is broken?
            Can you get it to work?

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              On 19/12/2015 at 14:11, xxxxxxxx wrote:

              Hey,

              here are some lines to rotate selected points around the object axis. Hope it helps.

              import c4d  
              #Welcome to the world of Python  
                
                
              def main() :  
                ref = op.GetDown()  
                clone = ref.GetClone()  
                ref_mg = ref.GetMg() #reference matrix  
                rot = op[c4d.ID_USERDATA,1] #vector  
                  
                rot_mat = ref_mg*c4d.utils.MatrixRotX(rot.x)*c4d.utils.MatrixRotY(rot.y)*c4d.utils.MatrixRotZ(rot.z) #new rotation matrix about X,Y,Z  
                  
                for i, sel in enumerate(ref.GetPointS().GetAll(ref.GetPointCount())) : #iterate all points  
                    if sel: #check if point is selected  
                        p = ref.GetPoint(i) #local position of point[i]  
                        p_rot = p*~rot_mat #global position of point[i] out of the rotation matrix   
                        new_p = ref_mg*p_rot #global position of point[i] into reference matrix to get the new local position  
                        clone.SetPoint(i, new_p)  
                clone.Message(c4d.MSG_UPDATE)  
                          
                ref.Touch()  
                return clone
              
              1 Reply Last reply Reply Quote 0
              • First post
                Last post