Nick, here is a working code showing the label disappearing problem:
Code:
#include <osgViewer/Viewer>
#include <osgText/Text>
#include <osg/LineWidth>
#include <osg/Geometry>
#include <osgGA/TrackballManipulator>
osgText::Text* createAxisLabel(const std::string& iLabel, const osg::Vec3&
iPosition)
{
osgText::Text* text = new osgText::Text;
text->setFont("arial.ttf");
text->setText(iLabel);
text->setPosition(iPosition);
text->setCharacterSize(17);
text->setAutoRotateToScreen(true);
text->setColor(osg::Vec4(204, 204, 0, 1));
text->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
return text;
}
osg::Geometry* createArrow(const osg::Matrixd& iTransform, const osg::Vec4&
iColor, double iHeight)
{
osg::Geometry* geometry = new osg::Geometry;
double pyramidBaseZ = iHeight/3.0*2.0;
double outerBaseRadius = iHeight/9.0;
osg::Vec3Array* vertices = new osg::Vec3Array(7);
(*vertices)[0].set(iTransform.preMult(osg::Vec3d(outerBaseRadius, 0.0,
pyramidBaseZ)));
(*vertices)[1].set(iTransform.preMult(osg::Vec3d(0.0, outerBaseRadius,
pyramidBaseZ)));
(*vertices)[2].set(iTransform.preMult(osg::Vec3d(-outerBaseRadius, 0.0,
pyramidBaseZ)));
(*vertices)[3].set(iTransform.preMult(osg::Vec3d(0.0, -outerBaseRadius,
pyramidBaseZ)));
(*vertices)[4].set(iTransform.preMult(osg::Vec3d(0.0, 0.0, iHeight)));
(*vertices)[5].set(iTransform.preMult(osg::Vec3d(0.0, 0.0, iHeight)));
(*vertices)[6].set(iTransform.preMult(osg::Vec3d(0.0, 0.0, 0.0)));
osg::UByteArray* indices = new osg::UByteArray(20);
(*indices)[0]=0; (*indices)[1]=1; (*indices)[2]=4;
(*indices)[3]=1; (*indices)[4]=2; (*indices)[5]=4;
(*indices)[6]=2; (*indices)[7]=3; (*indices)[8]=4;
(*indices)[9]=3; (*indices)[10]=0; (*indices)[11]=4;
(*indices)[12]=1; (*indices)[13]=0; (*indices)[14]=3;
(*indices)[15]=2; (*indices)[16]=1; (*indices)[17]=3;
(*indices)[18]=5;
(*indices)[19]=6;
geometry->setVertexArray(vertices);
geometry->setVertexIndices(indices);
osg::Vec4Array* colors = new osg::Vec4Array;
colors->push_back(iColor);
geometry->setColorArray(colors);
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES,
0, indices->size()-2));
geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,
indices->size()-2, 2));
return geometry;
}
osg::Geometry* createXAxis(double iHeight)
{
osg::Matrixd transform = osg::Matrix::rotate(osg::inDegrees(90.0f), 0.0f,
1.0f, 0.0f);
osg::Vec4 color(0.5f,0.125f,0.125f,1.0f);
osg::Geometry* geometry = createArrow(transform, color, iHeight);
return geometry;
}
osg::Geometry* createYAxis(double iHeight)
{
osg::Matrixd transform = osg::Matrix::rotate(osg::inDegrees(-90.0f), 1.0f,
0.0f, 0.0f);
osg::Vec4 color(0.125f,0.5f,0.125f,1.0f);
osg::Geometry* geometry = createArrow(transform, color, iHeight);
return geometry;
}
osg::Geometry* createZAxis(double iHeight)
{
osg::Matrixd transform = osg::Matrix::identity();
osg::Vec4 color(0.125f,0.125f,0.5f,1.0f);
osg::Geometry* geometry = createArrow(transform, color, iHeight);
return geometry;
}
osg::Geode* createAxesGeometry()
{
osg::Geode* geode = new osg::Geode;
osg::LineWidth* lineWidth = new osg::LineWidth(2);
geode->getOrCreateStateSet()->setAttributeAndModes(lineWidth,
osg::StateAttribute::ON);
geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
double length = 70.0;
geode->addDrawable(createXAxis(length));
geode->addDrawable(createYAxis(length));
geode->addDrawable(createZAxis(length));
geode->addDrawable(createAxisLabel("X", osg::Vec3(length*1.05, 0, 0)));
geode->addDrawable(createAxisLabel("Y", osg::Vec3(0, length*1.05, 0)));
geode->addDrawable(createAxisLabel("Z", osg::Vec3(0, 0, length*1.05)));
return geode;
}
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);
}
};
osg::Camera* createHUD()
{
osg::Camera* camera = new osg::Camera;
camera->setProjectionMatrix(osg::Matrix::ortho2D(-80, 1280-80, -80,
1024-80));
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
camera->setClearMask(GL_DEPTH_BUFFER_BIT);
camera->setRenderOrder(osg::Camera::POST_RENDER);
camera->setUpdateCallback(new AxisCameraUpdateCallback);
osg::Geode* geode = createAxesGeometry();
camera->addChild(geode);
return camera;
}
int main( int argc, char **argv )
{
osgViewer::Viewer viewer;
osg::Group* root = new osg::Group;
osg::Camera* camera = createHUD();
viewer.addSlave(camera, false);
root->addChild(camera);
viewer.setSceneData(root);
viewer.setCameraManipulator(new osgGA::TrackballManipulator);
return viewer.run();
}
Regards
Gianni
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=29584#29584
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org