1

x、y軸を作成し、この軸の内側の点をランダム化する単純なOSGプログラムがあります。これにより、レーザースキャンデータ用の3Dビューアを作成できるようになります。(私はそれが以前に行われたことを知っていますが、私たちはそれが超軽量である必要があります)。コードは次のとおりです。

#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;
}

このコードは機能し、10ユニットの長さのx / y軸を生成し、その軸の内側にランダムなポイントの生成を開始します。ただし、問題は、OSGビューアで画像を回転させると、画像全体が消えることが多いことです。開始した場所に回転して戻すことで元に戻すことができる場合もありますが、多くの場合、永久に消えます。

なぜこれが起こっているのか誰かが知っていますか?

4

1 に答える 1

1

私はそれを理解しました、この場合の理由はポイントが速すぎる更新であるということです。これにより、ポイントが速く入ってくるため、ビジュアライザーが画像をレンダリングするのが非常に困難になります。

于 2012-04-17T02:31:24.950 に答える