# How to rotate just the axis?

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 21/03/2011 at 04:09, xxxxxxxx wrote:

Hi,

How can I rotate a polygon?
I think I know how to get the selected polygon(s) from BaseSelect, but how then do I rotate it?

I want to try and recreate the move/rotate object axis functionality, e.g. moving the pivot/object axis independently of the model and I think for this I need to modify the polygon(s) directly and not the local or global matrix.... or is this not the case?

Andre

Edit: And of course the post title should be "How to rotate a polygon?" - apologies for the misspelling.
Edit2: Changed title to "How to rotate just the axis?" because it reflects better on what I was trying to do.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 21/03/2011 at 06:39, xxxxxxxx wrote:

Sorry, what exactly do you want to do ?
To rotate its points positions, or the indieces ?

Here's some code for rotating indieces:

``````import c4d
from c4d import gui
#Welcome to the world of Python
import c4d

def rotate_polygon(poly,rotation) :
if not isinstance(poly,c4d.CPolygon) :
raise TypeError, "CPolygon expected"
if not isinstance(rotation,(int or float)) :
raise TypeError, "int expected"
poly = PolyToList(poly)
ln = len(poly)
rotation = (rotation % ln)
print "rotation = " + str(rotation)
print poly
poly = [poly[((i+rotation) % ln)] for i in range(ln)]
print poly
return ListToPoly(poly)

def PolyToList(p) :
if not isinstance(p,c4d.CPolygon) :
raise TypeError, "CPolygon expected"
if p.c == p.d: return [p.a,p.b,p.c]
return [p.a,p.b,p.c,p.d]

def ListToPoly(l) :
if not isinstance(l,list) : raise TypeError, "list or dict expected"
ln = len(l)
if   ln < 3:
raise IndexError, "lst must have at least 3 indieces"
elif ln == 3:
return c4d.CPolygon(l,l,l)
else:
return c4d.CPolygon(l,l,l,l)

def main() :
poly = op.GetAllPolygons()
print poly
poly = rotate_polygon(poly,1)
op.SetPolygon(1,poly)
op.Message(c4d.MSG_UPDATE)

if __name__=='__main__':
main()
``````

CPolygon(1,2,3,4) will be rotated like this, with rotation of 1: CPolygon(2,3,4,1)

Cheers, nux

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 21/03/2011 at 07:28, xxxxxxxx wrote:

I guess it's the point positions, I don't really know.

As I said I am trying to do the same as "Objekt-Ache bearbeiten" / transform object axis tool.

Because SetMg and SetMl didn't seem to do what I want (they rotate the full object and not just the object axis) I figured maybe I need to rotate the points/polygons itself.

But it feels like I am missing something I just don't know what.

Edit: maybe I need to rotate the object using SetMg/SetMl but then rotate/transform back all the point/polygons in the opposite by the same amount so that they points/polygons resume their original position/orientation, thus giving the impression that just the object axis was tranformed.

But then how do I transform points/polygons? I guess I am missing something like SetMg/SetMl for polygons...

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 24/03/2011 at 08:14, xxxxxxxx wrote:

Yay, it seems I am getting somewhere. Here's my implementation so far for a clone of the coordinate manager HPB entry field functionality while having the "Use Object Axis Tool" mode active instead of the "Use Model Tool" mode.

``````

def SetAxisRotation(obj, rot, local=False, iterations=10, depth=0) :
"""
Set the rotation of the object axis (i.e. keeping points in place).

obj   object
rot   vector
"""
# unfortunately tail recursion and depth guard
# seem needed because of the MatrixToHPB(HPBToMatrix(Rad(angle))
# roundtrip round-off error, so we need to improve
# our solution with each recursion level
depth += 1
if obj is None: return False
if not isinstance(rot, c4d.Vector) :
raise TypeError("expected c4d.Vector, got %s" % type(rot))
if local is False:
getfn = obj.GetMg
setfn = obj.SetMg
else:
getfn = obj.GetMl
setfn = obj.SetMl
mo = getfn()
# calc difference to current orientation
# (we want absolute value opposed to relative increment)
currot = MatrixToHPB(mo)
diff = rot-currot
if VectorEqual(rot, currot) or depth >= iterations:
return False
else:
if DEBUG:
print "%d: rot = %s, currot = %s, diff = %s" % (depth, rot, currot, diff)
mat = HPBToMatrix(diff)
# orient whole object (axis + points)
setfn(mo * mat)
# get inverse rotation matrix for the points
pntsrm = mat.__invert__()
allpnts = obj.GetAllPoints()
newpnts = []
for pnt in allpnts:
# write back points to previous positions
# by applying the inverse matrix
newpnts.append(pntsrm * pnt)
obj.SetAllPoints(newpnts)
obj.Message(c4d.MSG_UPDATE)
if DEBUG:
currot = MatrixToHPB(getfn())
diff = rot-currot
print "%d: rot = %s, currot = %s, diff = %s" % (depth, rot, currot, diff)
return SetAxisRotation(obj, rot, local, iterations, depth)
``````

However, I am wondering, if the recursion solution isn't a bit excessive, although it is more than fast enough for my purposes...