Rotate Point around Axis



  • 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?



  • 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
    


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

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



  • 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?



  • 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
    

Log in to reply