查看: 1107|回复: 6

基础问题请指教。

[复制链接]

该用户从未签到

发表于 2011-11-21 21:15:05 | 显示全部楼层 |阅读模式
  1. class ChangeVertex : public osg::NodeCallback

  2. {

  3. public:

  4. ChangeVertex()

  5. {

  6. }

  7. virtual void operator()( osg::Node* node,

  8.   osg::NodeVisitor* nv )

  9. {

  10.   
  11.   osg::Geode * geode = node->asGeode();
  12.   osg::Geometry* geom = dynamic_cast<osg::Geometry*>(geode->getDrawable(0));
  13.   // 现在有了osg::Geometry指针,可不可以在此处调用geom->addPrimitiveSet或者
  14.   // geom->RemovePrimitiveSet?我测试的结果是不可以,但不明白原因,症状是调用
  15.   // 有效但是,运行很短的时间以后程序崩溃,而且每次崩溃的时机都有一些区别,
  16.   // 内存并没有耗多少,多核计算机崩溃,单核无事,应该是线程冲突,里面有什么
  17.   // 玄机请高手指教。

  18.   traverse( node, nv );

  19. }

  20. private:

  21. };
复制代码
完整代码如下,复制即可编译运行。

  1. #include <osg/Geode>
  2. #include <osg/Geometry>
  3. #include <osg/Point>
  4. #include <osg/StateSet>
  5. #include <osgViewer/Viewer>

  6. #ifdef _DEBUG
  7. #pragma comment(lib,"osgd.lib")
  8. #pragma comment(lib,"osgDBd.lib")
  9. #pragma comment(lib,"osgViewerd.lib")
  10. #endif

  11. #ifdef NDEBUG
  12. #pragma comment(lib,"osg.lib")
  13. #pragma comment(lib,"osgDB.lib")
  14. #pragma comment(lib,"osgViewer.lib")
  15. #endif



  16. class ChangeVertex : public osg::NodeCallback
  17. {
  18. public:
  19.         ChangeVertex()
  20.         {

  21.         }

  22.         virtual void operator()( osg::Node* node,
  23.                 osg::NodeVisitor* nv )
  24.         {
  25.                 osg::Geode * geode = node->asGeode();

  26.                 osg::Geometry* geom = dynamic_cast<osg::Geometry*>(geode->getDrawable(0));

  27.                 int count = geom->getNumPrimitiveSets();

  28.                 if(count>0)
  29.                 geom->removePrimitiveSet(0,1);

  30.                 osg::Vec3Array* _vertices = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());

  31.                 for(unsigned int i = 0;i<_vertices->size();i++)
  32.                 {       
  33.                         (*_vertices)[i]._v[2] = sin(((rand()%314)-157)/314.0)*0.6;
  34.                 }

  35.                 _vertices->push_back(osg::Vec3( sin(((rand()%314)-157)/314.0)*0.6, sin(((rand()%314)-157)/314.0)*0.6, sin(((rand()%314)-157)/314.0)*0.6 ));
  36.                 geom->addPrimitiveSet( new osg::DrawArrays( GL_POINTS, 0, _vertices->size()) );
  37.                 traverse( node, nv );
  38.         }
  39. private:

  40. };


  41. osg::ref_ptr<osg::Geode>
  42. createPoints()
  43. {
  44.         osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;

  45.         osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;

  46.         geom->setVertexArray( v.get() );
  47.         v->push_back( osg::Vec3( 0.f, 0.f, 0.f ) );
  48.         v->push_back( osg::Vec3( 0.f, 0.f, 4.f ) );
  49.         v->push_back( osg::Vec3( -1.f, 0.f, 0.f ) );
  50.         v->push_back( osg::Vec3( 1.f, 0.f, 0.f ) );
  51.         v->push_back( osg::Vec3( 1.f, 0.f, 4.f ) );
  52.         v->push_back( osg::Vec3( -1.f, 0.f, 4.f ) );
  53.         v->push_back( osg::Vec3( 0.f, -1.f, 0.f ) );
  54.         v->push_back( osg::Vec3( 0.f, 1.f, 0.f ) );
  55.         v->push_back( osg::Vec3( 0.f, 1.f, 4.f ) );
  56.         v->push_back( osg::Vec3( 0.f, -1.f, 4.f ) );
  57.         geom->setUseDisplayList(false);

  58.         geom->addPrimitiveSet( new osg::DrawArrays( GL_POINTS, 0, 10 ) );

  59.         osg::ref_ptr<osg::Geode> geode = new osg::Geode;

  60.         geode->addDrawable( geom.get() );

  61.         osg::StateSet* state = geode->getOrCreateStateSet();
  62.         state->setMode( GL_LIGHTING, osg::StateAttribute::OFF |
  63.                 osg::StateAttribute::PROTECTED );
  64.         osg::ref_ptr<osg::Point> pt = new osg::Point;
  65.         pt->setSize( 10.f );
  66.         state->setAttribute( pt.get() );


  67.         geode->setUpdateCallback(new ChangeVertex());

  68.         return geode.get();
  69. }

  70. int
  71. main( int, char ** )
  72. {
  73.         osgViewer::Viewer viewer;
  74.         viewer.setSceneData( createPoints().get() );
  75.         return viewer.run();
  76. }
复制代码

该用户从未签到

 楼主| 发表于 2011-11-21 21:16:21 | 显示全部楼层
呵呵 欢迎试运行  高手请指教玄机

该用户从未签到

发表于 2011-11-23 11:02:20 | 显示全部楼层
  // 现在有了osg::Geometry指针,可不可以在此处调用geom->addPrimitiveSet或者
  // geom->RemovePrimitiveSet?我测试的结果是不可以,但不明白原因,症状是调用
  // 有效但是,运行很短的时间以后程序崩溃,而且每次崩溃的时机都有一些区别,
  // 内存并没有耗多少,多核计算机崩溃,单核无事,应该是线程冲突,里面有什么
  // 玄机请高手指教。

答案是当然可以,并且我自己的工程里大量用这种方法来实现动态绘制。您是否指定了Geometry的DYNAMIC属性?以及是否及时dirtyDisplayList()?(VBO就不用了)

该用户从未签到

 楼主| 发表于 2011-11-23 14:22:21 | 显示全部楼层
dirtyDisplayList 我设定不使用displaylist了 DYNAMIC属性也设置了
呵呵  就是报错  设置线程模型为单线程就没有事情

该用户从未签到

发表于 2011-11-25 09:12:15 | 显示全部楼层
显然您没有设置DYNAMIC,添加
  1. geom->setDataVariance( osg::Object::DYNAMIC );
复制代码
之后一切正常,任何线程模式下都可用

该用户从未签到

 楼主| 发表于 2011-11-25 14:02:34 | 显示全部楼层
十分感谢,调试时,我把setDataVariance( osg::Object:YNAMIC )加给geode 了,今天我才注意到这点,
感谢回复,感谢指教,呵呵

该用户从未签到

 楼主| 发表于 2011-11-25 14:03:42 | 显示全部楼层
现在好了,呵呵,问题解决了。

但我还是有很多的小细节不清楚,日后再向您请教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表