Move polygon along normal

On 28/03/2013 at 11:26, xxxxxxxx wrote:
I want to move a polygon along its normal (normal move).
So I calculate the cross vector of the polygon using two sides as vector.
However, when I compare my result with the result of the Xpresso' polygon node  polygon normal' it is different. But the point normal from the Point node is the same as the cross vector I calculate.
Strange?Is the point normal different then the polygon normal?
Also when I start moving the polygon, my calculation seems to go wrong.
I expect that my calculation of the cross vector is wrong.I get all the polygon points, normalize them and use them to calculate the vectors.
This might be wrong, because I do not include the starting point?Note: There is only one polygon in my polygon object.
I do not want to use the cinema 4d 'move normal' command.import c4d from c4d import utils import random # # move polygon along its normal # def main() : polyobject = doc.SearchObject("MyObject") polys = polyobject.GetAllPolygons() p1 = polyobject.GetPoint(polys[0].a) p2 = polyobject.GetPoint(polys[0].b) p3 = polyobject.GetPoint(polys[0].c) p4 = polyobject.GetPoint(polys[0].d) print p1,p2,p3,p4 np1 = p1.GetNormalized() np2 = p2.GetNormalized() np3 = p3.GetNormalized() np4 = p4.GetNormalized() p1p2 = (np2np1) p1p3 = (np3np1) pcross = p1p2.Cross(p1p3) pcross = pcross.GetNormalized() print "cross: ", pcross

On 28/03/2013 at 11:37, xxxxxxxx wrote:
cpoly = polygonObject.GetPolygon(id)
nrm = ((cpoly.a  cpoly.b) % (cpoly.a  cpoly.d)).GetNormalized()

On 28/03/2013 at 11:44, xxxxxxxx wrote:
For a cube, I get Vector(0, 0, 1) which is correct. Btw, a bit shorter:
def main() : p = op.GetPolygon(0) points = op.GetAllPoints() p1, p2, p4 = points[p.a], points[p.b], points[p.d] print (p2  p1).Cross(p4  p1).GetNormalized() main()
Note that you need to take the forth point into account instead of the third, which might
be the cause why you get "wrong values".

On 28/03/2013 at 11:47, xxxxxxxx wrote:
lol, i forgot to access the vectors, cpolys just contains the ids , doh, i am a it dizzy, just
follow nikklas :)

On 28/03/2013 at 11:49, xxxxxxxx wrote:
I just checked the polygonnode in XPresso and it gives the same result.
@Ferdinand: You also computed the inversed normal. :) It's (B  A) cross (D  A) to compute
the correct normal.
Ehrm wait, I thought that it would be.. but it isn't? Just checked.. Gonna think about that

On 28/03/2013 at 13:49, xxxxxxxx wrote:
Originally posted by xxxxxxxx
For a cube, I get Vector(0, 0, 1) which is correct. Btw, a bit shorter:
def main() : p = op.GetPolygon(0) points = op.GetAllPoints() p1, p2, p4 = points[p.a], points[p.b], points[p.d] print (p2  p1).Cross(p4  p1).GetNormalized() main()
Note that you need to take the forth point into account instead of the third, which might
be the cause why you get "wrong values".Brilliant again, thanks.
Indeed using p4, I do not get 'wrong values'.Here the code to get the polygon moving along the normal.
Just add it to all the points of the polygon and do an update.Note: the calculated cross is now the same as the Xpresso one and Xpresso point normal is the same as the polygon normal.
import c4d from c4d import utils import random # # move polygon along its normal # def main() : frame = doc.GetTime().GetFrame(doc.GetFps()) if (frame >= 5) : polyobject = doc.SearchObject("MyObject") p = polyobject.GetPolygon(0) #get polygon points = polyobject.GetAllPoints() #get all points p1, p2, p3, p4 = points[p.a], points[p.b], points[p.c], points[p.d] pcross = (p2  p1).Cross(p4  p1).GetNormalized() print pcross p1 = p1 + pcross p2 = p2 + pcross p3 = p3 + pcross p4 = p4 + pcross #print p1,p2,p3,p4 p1 = polyobject.SetPoint(p.a,p1) p2 = polyobject.SetPoint(p.b,p2) p3 = polyobject.SetPoint(p.c,p3) p4 = polyobject.SetPoint(p.d,p4) polyobject.Message (c4d.MSG_UPDATE) c4d.EventAdd()