1
votes

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?

1
I'm not that familiar with OSG, but I don't see any rotation code anywhere in that snippet. Can you point to what you add that causes it to go wrong? Are you sure you're rotating around the correct axis?Tim
So this code opens a visuliser which uses the mouse to rotate the image. When I add the random points between each frame this is when the errors begin to occur.Fantastic Mr Fox

1 Answers

1
votes

I figured it out, the reason in this case is that the points are updating too fast. This is causing the visualizer extreme difficulty with rendering the image as the points are coming in to fast.