查看: 926|回复: 1

OSG显示图元不正常,图元部分被裁剪

[复制链接]

该用户从未签到

发表于 2014-5-13 17:49:12 | 显示全部楼层 |阅读模式
  1. osg::ref_ptr<osg::Geode>geode=new osg::Geode;
  2.         osg::ref_ptr<osg::Geometry>geometry=new osg::Geometry;
  3.         _vertexArr->push_back(osg::Vec3(0.0f,0.0f,.0f));
  4.         _vertexArr->push_back(osg::Vec3(2.0f,0.0f,.0f));
  5.         _vertexArr->push_back(osg::Vec3(2.0f,0.0f,2.0f));
  6.         _vertexArr->push_back(osg::Vec3(0.0f,0.0f,2.0f));
  7.         geometry->setVertexArray(_vertexArr);
  8.         geometry->addPrimitiveSet(new osg::DrawArrays(GL_LINE_LOOP,0,_vertexArr->size()));
  9.         geometry->dirtyBound();
  10.         //geometry->setDataVariance(osg::Object::DYNAMIC);
  11.         geometry->setSupportsDisplayList(false);
  12.         //no use at this moment;
  13.         //geometry->setUpdateCallback(new GeometryUpdate);

  14.         geode->addDrawable(geometry.get());
  15.         geode->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
  16.         //set dispaly mode as line mode
  17.         osg::ref_ptr<osg::PolygonMode> polygonMode = new osg::PolygonMode();
  18.         polygonMode->setMode( osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);
  19.         geode->getOrCreateStateSet()->setAttribute( polygonMode.get(),
  20.                 osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON );

  21.         return geode;
复制代码

添加了EventHandler,在EventHandler执行下面的更新函数update
  1. if (ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN)
  2.         {
  3.                 switch(ea.getKey())
  4.                 {
  5.                 case osgGA::GUIEventAdapter::KEY_Left:
  6.                         std::cout<<"left key down";
  7.                         _vertexArr->at(0)._v[0]-=0.5;
  8.                         for(osg::Vec3Array::iterator itr=_vertexArr->begin();itr!=_vertexArr->end();++itr)
  9.                         {
  10.                                 std::cout<<"x:"<<(*itr)._v[0]<<" y:"<<(*itr)._v[1]<<" z:"<<(*itr)._v[2]<<std::endl;
  11.                         }

  12.                         break;
  13.                 case  osgGA::GUIEventAdapter::KEY_Right:
  14.                         _vertexArr->at(0)._v[0]+=0.5;
  15.                         break;
  16.                 case  osgGA::GUIEventAdapter::KEY_Up:
  17.                         _vertexArr->at(0)._v[2]+=0.5;
  18.                         break;
  19.                 case osgGA::GUIEventAdapter::KEY_Down:
  20.                         _vertexArr->at(0)._v[2]-=0.5;
  21.                         break;
  22.                 default:break;
  23.                 }
  24.         }
复制代码

开始显示正常,可是移动一个顶点后然后变换视角,发现图元的一部分被裁剪了。不得其解。目前觉得是包围盒相关的原因。不知道怎么解决

移动顶点前

移动顶点前

移动顶点后

移动顶点后

移动顶点,转换视角

移动顶点,转换视角

该用户从未签到

 楼主| 发表于 2014-5-13 19:04:27 | 显示全部楼层
解决了!!确实是BoundBox的原因。因为把Drawable修改了,所以必须把相应的boundBox重新进行计算。只需要在DrawableUptateCallback中加一句
geom->dirtyBound();结果就正确了。总之在更新顶点后,更新包围盒就可以了。自己回答自己的。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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