Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
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 = (np2-np1) p1p3 = (np3-np1) 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 polygon-node 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".
Originally posted by xxxxxxxx
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()