I have a simple OSG program which makes an x, y axis and randomises points inside of this axis. The intention is that this will lead on to making a 3d viewer for laser scan data. (I know its been done before but we need it to be super light weight). Here is the code:
#include <osg/Node>
#include <osg/Group>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Texture2D>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/PositionAttitudeTransform>
#include <osgGA/TrackballManipulator>
#include <time.h>
#include <cstdlib>
void addAxis(osg::ref_ptr<osg::Group> root) {
//ADD Y-Axis
osg::ref_ptr<osg::Geode> lineGeode = new osg::Geode();
osg::ref_ptr<osg::Geometry> yAxis = new osg::Geometry(), xAxis = new osg::Geometry();
lineGeode->addDrawable(yAxis);
lineGeode->addDrawable(xAxis);
root->addChild(lineGeode);
osg::ref_ptr<osg::Vec3Array> lineVertices = new osg::Vec3Array;
lineVertices->push_back( osg::Vec3( 0, 0, 0) );
lineVertices->push_back( osg::Vec3(0, 10, 0) );
yAxis->setVertexArray( lineVertices );
osg::ref_ptr<osg::DrawElementsUInt> lineBase =
new osg::DrawElementsUInt(osg::PrimitiveSet::LINES, 0);
lineBase->push_back(1);
lineBase->push_back(0);
yAxis->addPrimitiveSet(lineBase);
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) ); //index 0 red
yAxis->setColorArray(colors);
yAxis->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);
//ADD X Axis
lineVertices = new osg::Vec3Array;
lineVertices->push_back( osg::Vec3( 0, 0, 0) );
lineVertices->push_back( osg::Vec3(10, 0, 0) );
xAxis->setVertexArray( lineVertices );
lineBase =
new osg::DrawElementsUInt(osg::PrimitiveSet::LINES, 0);
lineBase->push_back(1);
lineBase->push_back(0);
xAxis->addPrimitiveSet(lineBase);
colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f) ); //index 0 red
xAxis->setColorArray(colors);
xAxis->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);
}
void addPoint(osg::ref_ptr<osg::Group> root, std::vector<double> pointIn) {
osg::ref_ptr<osg::Geode> pointGeode = new osg::Geode();
osg::ref_ptr<osg::Geometry> pointGeometry = new osg::Geometry();
pointGeode->addDrawable(pointGeometry);
root->addChild(pointGeode);
osg::ref_ptr<osg::Vec3Array> point = new osg::Vec3Array;
point->push_back( osg::Vec3( pointIn[0], pointIn[1], pointIn[2]) );
pointGeometry->setVertexArray( point );
osg::ref_ptr<osg::DrawElementsUInt> points =
new osg::DrawElementsUInt(osg::PrimitiveSet::POINTS, 0);
points->push_back(0);
points->push_back(2);
points->push_back(1);
pointGeometry->addPrimitiveSet(points);
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) );
pointGeometry->setColorArray(colors);
pointGeometry->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);
}
int main()
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> root = new osg::Group();
addAxis(root);
std::vector<double> point;
for (int i = 0; i < 3; i++)
point.push_back(0);
srand(time(NULL));
root->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
viewer.setSceneData( root );
viewer.setCameraManipulator(new osgGA::TrackballManipulator());
viewer.realize();
int count = 0;
while( !viewer.done() )
{
if (count == 200) {
point[0] = (double)rand()*10.0/(double)INT_MAX;
point[1] = (double)rand()*10.0/(double)INT_MAX;
count = 0;
}
count++;
addPoint(root, point);
viewer.frame();
}
return 0;
}
This code works, it will generate a 10 unit long x/y axis and begin to generate random points inside that axis. However the issue is that when I rotate the image in the OSG viewer the whole image often disappears. Sometimes it can be brought back by rotating back to where you started but more often it will disappear forever.
Has anyone got an idea about why this is happening?