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