On 6/28/07, Robert Osfield <[EMAIL PROTECTED]> wrote:
On 6/28/07, Morné Pistorius <[EMAIL PROTECTED]> wrote:
This looks wrong...
> LookAt = LookAt * Xform;
Also use ^ to get the cross product rather than * which gives you the
dot product,
Eh? Now I'm even more confused :) Xform is the 4x4 Transformation
matrix computed with
osg::computeLocalToWorld(). LookAt is the point I want the camera to
face in local object coordinates. I do
LookAt = LookAt * Xform;
to convert LookAt to world coordinates. As I understood things, this
is just a pre-multiplication. Why is that wrong? Similarly, I convert
the up vector to world coordinates.
I thought that would work, but it seems I have to compute the up
vector using cross products. Thanks for the tip, Robert!
This is the code that I used and works for me - I paste it here for
newbies with the same problem:
// get the node path from this node to the scene root
osg::NodePathList paths = i_pNode->getParentalNodePaths();
osg::NodePath & nodePath = paths[0];
// accumulate all the transforms in the node path to get to the
// world coordinate transform for this node
osg::Matrix Xform = osg::computeLocalToWorld( nodePath );
// transform the local viewpoint to world coordinates
osg::Vec3 LookFrom, LookAt, Up;
i_pNode->BestView( LookFrom, LookAt );
LookFrom = LookFrom * Xform;
LookAt = LookAt * Xform;
// compute up vector
osg::Vec3 v1 = LookAt - LookFrom;
// vector between object and viewpoint (world coords)
osg::Vec3 v2 = Xform.getTrans() - (osg::Vec3(-1,0,0) * Xform);
// vector in object's xy plane (world coords)
Up = v1^v2;
m_Viewer->getCameraManipulator()->setHomePosition( LookFrom, LookAt, Up );
Thanks again,
Morne
_______________________________________________
osg-users mailing list
[email protected]
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/