|
本帖最后由 hgyzj 于 2011-10-15 19:14 编辑
得到的一个四边形面,想与另一个节点下的所有面进行碰撞。如果做?看到有个osgUtil:: PlaneIntersector,........
osg::ref_ptr<osg::Geometry> gm=new osg::Geometry;
gm=MT2->getChild(0)->asGroup()->getChild(0)->asGroup()->getChild(0)->asGeode()->getDrawable(0)->asGeometry();
//取出碰撞面的顶点,放入数组中
osg::Array* array=gm->getVertexArray();
osg::Vec3Array* vec3array=dynamic_cast<osg::Vec3Array*>(array);
osg:: Polytope *polboundingPolytope=new osg:: Polytope;
//v0,v1,v2,v3分别为四边形面的顶点坐标
osg::Vec3f v0,v1,v2,v3;
v0=vec3array->at(0);
v1=vec3array->at(1);
v2=vec3array->at(2);
v3=vec3array->at(3);
osg:: Plane pla(v0,v1,v2);
osg:: Vec3f planeNormal=(v1-v0) ^ (v2-v0);
osg:: Polytope *polboundingPolytope=new osg:: Polytope;
polboundingPolytope->add(osg:: Plane(planeNormal ^ (v1-v0),v0));
polboundingPolytope->add(osg:: Plane(planeNormal ^ (v2-v1),v1));
polboundingPolytope->add(osg:: Plane(planeNormal ^ (v3-v2),v2));
polboundingPolytope->add(osg:: Plane(planeNormal ^ (v0-v3),v3));
osg::ref_ptr<osgUtil:: PlaneIntersector> planeI=new osgUtil:: PlaneIntersector(pla,*polboundingPolytope);
osg::ref_ptr<osgUtil::IntersectionVisitor> iiv=new osgUtil::IntersectionVisitor(planeI);
MT3->accept(*iiv);
........结果发现首先检测的是MT3节点的中心是否落在面以及周围四个切割面围成的区域内,如果中心落在其中,则继续和MT3的面进行碰撞检测,否则,如果中心不落在区域内,即使MT3的物体与面有明显交集,也不认为是碰撞,这是为什么?是我用的哪里有问题呢?该怎么办?用osgUtil:: PolytopeIntersector吗?用多面体碰撞好像需要有封闭的多面体,就得至少四个面,就多四倍的工作量啊。请高手解答一下,多谢多谢! |
|