[osg-users] Camera on a PAT?

Robert Osfield robert.osfield at gmail.com
Sat Sep 6 00:45:10 PDT 2008


Hi Ben,

On Sat, Sep 6, 2008 at 8:28 AM, benben <benhongh at gmail.com> wrote:
> Can I add an osg::Camera to an osg::PositionAttitudeTransform node to render
> the scene? The idea is to use the transform node to move and orientate the
> camera.

The Camera isn't an ordinary object like a car or house that you
position in the scene, the relationship is that the Camera sits above
the scene that you wish to render, this applies to high level Viewe
Camera's just as it does to ones in the scene graph.  The next special
relationship is that the OpenGL modelview matrix the world underneath
the camera positions the world in the local coordinates of the camera,
rather than positioning the camera in world coordinates - this is just
how OpenGL works and OSG works with.

In your own application you need to Camera to contain the scene you
want to render, if it was a leaf of your scene graph then it wouldn't
have anything to render.  You could add you scene to the Camera but
this would cause a circular cycle in the scene graph and bag you'd end
up reccursing till your memory blows... so that certainly work either.

Second you want to set the Camera's view matrix to be the inverse of
the model matrix, rather than the the model matrix that will be
inherited down to the Camera that you have in your setup.  So again we
are getting the opposite of what you want by placing the Camera as a
leaf.

So this brings us to how do you solve the task of following nodes in
the scene?  The osgGA::NodeTrackerManipulator is one solution, as is
holding the NodePath from the root of your scene to the node you want
to set the position by, and then computing the world to local
transform using osg::computeWorldToLocal(NodePath) (this is what
NodeTracker does internally).  If you set the viewer's Camera's view
matrix yourself don't attach a camera manipulator, and just set the
view matrix each frame like:


   while(!viewer.done())
   {
       // break frame into it's constituent parts
       viewer.advance();
       viewer.updateTraversal();
       viewer.eventTraversals();

       viewer.getCamera()->setViewMatrix(osg::computeWorldToLocal(myNodePath);

       viewer.renderingTraversals();
   }


Or just write your own version of NodeTrackerManipulator.

Robert.



More information about the osg-users mailing list