Since I did't find a complete example for adding a cross axes in a view, here
is the sample code I roughly implemented. I starded from what Jimmy suggested
here http://forum.openscenegraph.org/viewtopic.php?t=2205&highlight=axis.
Code:
ViewerQT* viewerWindow = new ViewerQT;
osg::Group* root = new osg::Group;
osg::Camera* camera = createHUD();
viewerWindow->addSlave(camera, false);
root->addChild(camera);
root->addChild(loadedModel);
viewerWindow->setCameraManipulator(new osgGA::TrackballManipulator);
viewerWindow->setSceneData(root);
viewerWindow->show();
osg::Camera* createHUD()
{
osg::Camera* camera = new osg::Camera;
camera->setProjectionMatrix(osg::Matrix::ortho2D(-1.5, 17.75, -1.5, 13.86));
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
camera->setClearMask(GL_DEPTH_BUFFER_BIT);
camera->setRenderOrder(osg::Camera::POST_RENDER);
camera->setUpdateCallback(new AxisCameraUpdateCallback);
osg::Node* axes = osgDB::readNodeFile("axes.osg");
camera->addChild(axes);
return camera;
}
class AxisCameraUpdateCallback:public osg::NodeCallback
{
public:
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
if(nv->getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
{
osg::Camera* camera = dynamic_cast<osg::Camera*>(node);
if (camera)
{
osg::View* view = camera->getView();
if (view && view->getNumSlaves() > 0)
{
osg::View::Slave* slave = &view->getSlave(0);
if(slave->_camera.get() == camera)
{
osg::Camera* masterCam = view->getCamera();
osg::Vec3 eye, center, up;
masterCam->getViewMatrixAsLookAt(eye, center, up, 30);
osg::Matrixd matrix;
matrix.makeLookAt(eye-center, osg::Vec3(0, 0, 0), up);
// always look at (0, 0, 0)
camera->setViewMatrix(matrix);
}
}
}
}
traverse(node,nv);
}
};
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=29288#29288
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org