Hi, Robert,
I'm doing some object rotation and translation stuff on my own so I
looked at the OSG math code for inspiration. From what I read before
OSG uses post multiplication, meaning if I want to transform a vector I
need to do a V * M or, in OSG functions, M.preMult(V), where V is the
vector and M is the transformation matrix. This multiplication order seems
to be supported by how a translation matrix is created, by assigning the
translation values to the bottom row of the matrix. But, I got confused
when examining the method of setting the matrix by look at values. In
Matrix_implementation::makeLookAt(eye, center, up), it calculates the
forward, up and side vectors f, u, and s. I assume it used the OpenGL
convention of -z as the default forward direction and +y the default up
direction. Then, it sets the rotation matrix R as:
s[0] u[0] -f[0] 0
s[1] u[1] -f[1] 0
s[2] u[2] -f[2] 0
0 0 0 1
But, with this matrix, if I apply it to the default forward vector F0 of
(0, 0, -1, 1) via post multiplication, i.e. doing an F0 * R, I get (s[0],
u[0], f[0], 1), instead of the correct value of the current forward vector
(f[0], f[1], f[2], 1). I need to do a pre multiplication or R * F0 to get
the correct value.
Is my understanding of makeLookAt() wrong? Does the matrix generated
by makeLookAt() mean something else? Or, does OSG use a clever way of
setting translation in the post mult convention by rotation in the pre
mult convention, and always separating them out when applying the
transformation? Can some OSGers help me clear my head on this? Thanks!
Best Regards,
Yefei
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org