Selected polygon rotation [SOLVED]

On 23/03/2015 at 09:28, xxxxxxxx wrote:

Is it possible to get the selected polygon rotation and position?

Kinda like if u select a polygon in polygon-mode then u will get a new axis that represents the center position and rotation of the selected polygon. In the coordinates dialog u can see the values i need to get.

For example a sphere object: 

I tried disconnecting all polygons and convert poly-groups to objects but then the axis stays on the rotation and position of the parent object

Also found GetModelingAxis() but that's C++ is there any workaround to get this working? 
Or is it possible to get the rotation i need in another more mathematically way?


On 24/03/2015 at 05:07, xxxxxxxx wrote:

I created a workaround to get the data. Its only a bit slow with a lot of polygons.

After mesh object is triangulated, disconnected without preserving groups and poly-groups to objects i run this script per triangle. It gives me what i was searching for. With some editing it will also work for non exploded poly-groups.

def triangleModelingAxis(object) :
	object.SetBit(c4d.BIT_ACTIVE);  	# sets active object
	doc.SetMode(c4d.Mpolygons)      	# sets editing mode
	sel = object.GetPolygonS();     		# get selected polygons
	sel.DeselectAll();              			# deselect them
	sel.Select(0);                  			# select first poly
	c4d.CallCommand(431000009);     	# Align Workplane to Selection
	c4d.CallCommand(5168);          	# Add Plane   
	c4d.CallCommand(1027593);       	# Locked Workplane
	c4d.CallCommand(431000007);     	# Reset Workplane to Y
	plane  = doc.GetActiveObject(); 	# Get the plane object
	absRot = plane.GetAbsRot();     		# Get plane rotation
	absPos = plane.GetAbsPos();    		# Get plane position
	plane.Remove();                 		# remove te plane from scene
	sel.DeselectAll();              			# deselect all polygons
	plane.DelBit(c4d.BIT_ACTIVE);   	# deselect plane
	object.SetBit(c4d.BIT_ACTIVE);  	# select object
	doc.SetMode(c4d.Mobject);       		# sets editing mode
	return absRot, absPos           		# returns data


On 24/03/2015 at 06:41, xxxxxxxx wrote:

Hello Gianni,

this might be a faster approach.
The first is with calculating a new matrix for the polygon, the second takes advantage of the euler angles.
Hope this helps?
Best wishes

import c4d  
from c4d import utils  
def main() :  
  #validate object  
  if not op : return  
  if not op.IsInstanceOf(c4d.Opolygon) : return  
  #work on triangulated clone  
  obj = op.GetClone()     
  #choose a polygon  
  poly = op.GetPolygon(80)  
  if not poly : return  
  print poly  
  #points edges in global space  
  matr = op.GetMg()  
  p0 = obj.GetPoint(poly.a)*matr  
  p1 = obj.GetPoint(poly.b)*matr  
  p2 = obj.GetPoint(poly.c)*matr     
  e0 = p1 - p0  
  e1 = p2 - p1  
  #calculate polygon specific matrix  
  zfn = e0.Cross(e1).GetNormalized()  
  xfn = c4d.Vector(0,1,0).Cross(zfn).GetNormalized()  
  yfn = xfn.Cross(zfn).GetNormalized()  
  newmatr = c4d.Matrix()  
  newmatr.v1 = xfn  
  newmatr.v2 = yfn  
  newmatr.v3 = zfn = (p0 + p1 + p2)/3  
  #or use euler angle for the rotation  
  position = (p0 + p1 + p2)/3  
  zfn = e0.Cross(e1).GetNormalized()  
  rotation = c4d.utils.VectorToHPB(zfn)  
  #test it  
  cube = doc.SearchObject("Cube")  
  ##set the new matrix  
  ##or set rotation and position  
if __name__=='__main__':  

On 25/03/2015 at 04:05, xxxxxxxx wrote:

Thanks Martin i'm incorporating your code now and its indeed alot faster ;)

On 27/03/2015 at 10:13, xxxxxxxx wrote:


I'll assume that the issue is solved, and will set the topic as such.  However, I'll leave the topic open to new postings, in case any follow up is required.

Joey Gaspe
SDK Support Engineer