Hi users,

I have a problem with my scene shaking. I have simplied the problem to the
code below. A short description- the code find the position in the scene
where the center of screen is projected onto a plane. This position is given
to a PositionAttitudeTransform so the "box" is transformed to that position.

You will notice when the application starts it shakes. (why?)
You will also notice when panning the camera the scene shakes (why?)

anyone?,
Peter Wraae Marino


#include <osgViewer/Viewer>
#include <osg/ShapeDrawable>
#include <osgManipulator/Projector>

class CMyCallback : public osg::NodeCallback
{
public:
 void operator()( osg::Node* node, osg::NodeVisitor* nv )
 {
  osg::Camera* pCam = 0;
  osg::Node* p = node;
  while ( p )
  {
   pCam = dynamic_cast<osg::Camera*>(p);
   if ( pCam )
   {
    osg::PositionAttitudeTransform* pPat =
dynamic_cast<osg::PositionAttitudeTransform*>(node);
    osg::Plane plane( osg::Vec3(0,0,1), osg::Vec3(0,0,0) );
    osg::ref_ptr<osgManipulator::PlaneProjector> rPlaneProj = new
osgManipulator::PlaneProjector;
    rPlaneProj->setPlane( plane );
    osg::Vec3 v;
    osgManipulator::PointerInfo pi;

    pi.reset();
    pi.setCamera( pCam );
    pi.setMousePosition( 256, 256 ); // center of 512x512 window
    rPlaneProj->project( pi, v );
    pPat->setPosition( v );
    break;
   }
   p = p->getParent( 0 );
  }
  NodeCallback::traverse(node,nv);
 }
};

osg::Node* CreateScene()
{
 osg::PositionAttitudeTransform* pPat = new osg::PositionAttitudeTransform;
 osg::Geode* pGeode = new osg::Geode();
 pGeode->addDrawable( new osg::ShapeDrawable( new
osg::Box(osg::Vec3(0.0f,0.0f,0.0f),2.0f) ) );
 pPat->addChild( pGeode );
 pPat->setUpdateCallback( new CMyCallback );
 return pPat;
}

int _tmain(int argc, _TCHAR* argv[])
{
    // construct the viewer
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
    // make the viewer create a 512x512 window and position it at 32, 32
    viewer->setUpViewInWindow( 32, 32, 512, 512 );
    // set the scene-graph data the viewer will render
    viewer->setSceneData( CreateScene() );
    // execute main loop
    return viewer->run();
}
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to