查看: 2406|回复: 4

osg绘制空间网格

[复制链接]

该用户从未签到

发表于 2014-5-13 16:02:29 | 显示全部楼层 |阅读模式
本帖最后由 csutest 于 2014-5-13 22:01 编辑

我自定义了个MyDrawable类,继承Drawable,实现了drawImplementation和computebound方法。在drawImplementation方法中实现了空间网格绘制:以原点为中心,X、Y、Z方向均匀绘制坐标轴,坐标轴长度为20000m,同一坐标轴平面的坐标轴间隔100m(最终得到的结果在外面看上去是一个正方体,大小为20000*20000*20000,中间绘制了坐标轴),然后在computebound构造包围盒BoundingBox box(-10000,-10000,-10000,10000,10000,10000)。这样以后,当实体在网格中运动时,跟踪实体(采用trackball)时,线段看上去是在断断续续在动的,感觉好像是被裁减了。我在另一引擎中试了下,同样的方法绘制网格,跟踪实体的时候没有这个问题。请问这是哪里出错了呢?

该用户从未签到

发表于 2014-5-13 17:35:18 | 显示全部楼层
你解决了不?我也遇到了这样的问题。

旋转轨迹球前

旋转轨迹球前

改变图元顶点位置,并变换轨迹球位置

改变图元顶点位置,并变换轨迹球位置

  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中不端更改图元坐标的位置,然后就出现这种情况。我猜测是由于包围盒的计算问题。另外我不知道透视投影的视景体是怎么计算的,不过感觉是根据场景的包围盒进行计算得到的。然后我猜测是由于视景体范围的问题。我也不清楚。

该用户从未签到

 楼主| 发表于 2014-5-13 20:20:32 | 显示全部楼层
JacaYang 发表于 2014-5-13 17:35
你解决了不?我也遇到了这样的问题。

我在EventHandler中不端更改图元坐标的位置,然后就出现这种情况。 ...

我还以为只有我遇到这个问题呢,正在研究,感觉是裁剪的问题,在其它引擎中好好的,OSG的图元就多了这个包围盒的计算。一起努力!

该用户从未签到

 楼主| 发表于 2014-5-13 22:16:44 | 显示全部楼层
JacaYang 发表于 2014-5-13 17:35
你解决了不?我也遇到了这样的问题。

我在EventHandler中不端更改图元坐标的位置,然后就出现这种情况。 ...

我的问题解决了,是这个空间网格绘制效率太低了,看了下帧率,间隔为100m时,帧率会下降到10帧左右。将间隔设为1000m就正常了,绘制效率可以提高下(在另一引擎绘制的空间网格大小是2000*2000*2000,间隔是100,没这个问题。)。你这个应该是没有计算包围盒,继承Drawable,实现drawImplementation和computebound方法,在computebound里面计算包围盒试试。computebound函数注释说这个包围盒与裁剪有关。

该用户从未签到

发表于 2014-5-14 10:10:55 | 显示全部楼层
csutest 发表于 2014-5-13 22:16
我的问题解决了,是这个空间网格绘制效率太低了,看了下帧率,间隔为100m时,帧率会下降到10帧左右。将间 ...

恩!!THX
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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