设置PolytopeIntersector需要注意的问题

设置PolytopeIntersector需要注意的问题

 

代码下载地址:

 

 截图:

设置PolytopeIntersector需要注意的问题_第1张图片

 

 

 

做了一个PolytopeIntersector的例子,如果飞机飞入和飞离这个多面体的时候可以正确的返回飞机是不是在区域内

关于有些节点不在NodePah里的问题
我加载了一个osg自带的模型cessna.osg,给他设置了名字"cessna",可是当它进入多面体后NodePath里总没有这个节点,但是有一个名字叫"cessna.osg"的节点。一开始还纳闷到底在哪里这个节点的名字变了呢,为什么不是cessna了?后来发现原来错误主要涉及到下面3个地方:
1.
cessna.osg
本身就是一个组节点,它有一个Geode类型的子节点,这个Geode类型的子节点的名字是"cessna.osg"。我在NodePath里看到的名字为"cessna.osg"的节点其实是"cessna"节点的孩子。
2.
那我名字为cessna的组节点为什么不见了?用记事本打开cessna.osg这个文件,发现一个特别的地方:这个模型的根节点,也就是我要的名字为"cessna"的节点的数据变更设置为了osg::Object::STATIC
3.
我在main函数里有下面的代码
osgUtil::Optimizer optimzer;
optimzer.optimize(root);
2行代码对根节点进行了优化(具体细节不知道)。我去了这2行后,耶,发现cessna目标了。
所以处理方法要么是不对root进行优化,要么把想要返回节点的数据变更设置为osg::Object::DYNAMIC

关于法向量
1.     封闭多面体是有一些平面包围的一个空间,定义这些平面的时候一是要注意这些平面确实构成了一个封闭区域,再一个就是平面的法向量一定要指向封闭多面体的内部。
2.
若要定义一个立方体包围盒,可以利用Polytope::setToBoundingBox
( const BoundingBox &
bb
)
,这个函数在121号进行了修正(这个bug是王锐老大最先发现的),所以如果你的源码是这个时间之前的,要注意修改一下参数。

关于另外一个奇怪的问题
以上问题都解决了,我的程序也开始运行了,当我的飞机第一次撞击这个多面体的时候,可以返回飞机撞击了多面体,但我的飞机飞离这个多面体后并不能正确显示目标消失,找了很多原因,才发现设置多面体相交访问器访问节点之前应该reSet一下,



iv->reset();


viewer->getSceneData()->accept(*iv);


具体原因暂时没时间深究,大家讨论一下吧

 

交流:[email protected]

你可能感兴趣的:(osg)