查看: 1432|回复: 2

关于一个面与其他物体所有面进行碰撞的问题

[复制链接]

该用户从未签到

发表于 2011-10-15 11:13:37 | 显示全部楼层 |阅读模式
本帖最后由 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吗?用多面体碰撞好像需要有封闭的多面体,就得至少四个面,就多四倍的工作量啊。请高手解答一下,多谢多谢!

该用户从未签到

 楼主| 发表于 2011-10-15 20:35:24 | 显示全部楼层
经过反复测试,发现问题所在,是我建限制面的时候,法线如果先规格化,建立的面就是可以的,按理说法线只是代表一个方向,没规格化也应该可以的。不知道为什么。不知道我理解的对不对?还望高手指正

该用户从未签到

发表于 2011-10-18 10:26:35 | 显示全部楼层
计算时可能会有影响,要看具体的算法实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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