查看: 4612|回复: 9

关于包围盒位置

[复制链接]

该用户从未签到

发表于 2011-9-8 09:44:39 | 显示全部楼层 |阅读模式
我做了个OSG与ODE相结合的小程序,其中设置一结点的刚体和几何体的位置、大小是按照该结点包围盒的位置、大小来设定的。为了保证能正确的碰撞,我想看看包围盒的是否是把该节点包住,发现并没有完全包住,但碰撞的时候是没有问题的,

下面    1 根据节点包围盒的大小位置,创建刚体和几何体,位置大小跟包围盒的位置大小一致。  
         2 用线框模式画出一个方体,位置大小按照包围盒的位置大小设定。

代码如下:

testBody = dBodyCreate(World);
osg::ComputeBoundsVisitor cbv;
osg::BoundingBox bb;
testPAT->accept(cbv);          //testPAT 是PositionAttitudeTransform类型结点
bb = cbv.getBoundingBox();
    length = bb.xMax() - bb.xMin();
width = bb.yMax() - bb.yMin();
height = bb.zMax() - bb.zMin();
dBodySetPosition(testBody, bb.center().x(), bb.center().y(), 0.0);
dMassSetBoxTotal(&mass, 20.0, length, width, height);
dBodySetMass(testBody, &mass);
//通过给定的X/Y/Z长度信息构造主动运动的盒子刚体
testGeom = dCreateBox(Space, length, width, height);
dGeomSetBody(testGeom, testBody);
dGeomSetPosition(testGeom, bb.center().x(), bb.center().y(), 0.0);

//用线框模式画出一方体,位置、大小跟 testPAT下盒子结点的包围盒的位置、大小一致。
  osg::ref_ptr<osg::Geode> box = new osg::Geode;
osg::ref_ptr<osg::ShapeDrawable> sd1 = new osg::ShapeDrawable(new osg::Box(osg::Vec3(0, 0, 0.0),1));
sd1->setColor(osg::Vec4(0.0,1.0,0.0,1.0));//设置颜色绿色,好区别
osg::ref_ptr<osg::StateSet> state = sd1->getOrCreateStateSet();
osg::ref_ptr<osg:olygonMode> pm = new osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode:INE);
state->setAttributeAndModes(pm.get());//也设置线框模式
osg::ref_ptr<osg::LineWidth> lw =new osg::LineWidth(10.0);
state->setAttribute(lw.get());//设置线条粗细,看的清
box->addDrawable(sd1.get());
boxBounding->addChild(box.get());
//下面就是将那个box按照盒子结点的包围盒来进行缩放和移动,以使得这个box刚好能表示包围盒所在位置
  boxBounding->setPosition(osg::Vec3( bb.center().x(),bb.center().y(),bb.center().z())); // boxBounding 是PositionAttitudeTransform类型结点
boxBounding->setScale(osg::Vec3(length,width,height));


疑问:
(1)包围盒怎么没有把盒子包住呐?
(2)刚体跟几何体的位置也应该是线框盒子的位置,这样的话球应该是穿过没有被包住的下半部分盒子的,为什么没有发生这种情况?

  麻烦帮忙解答,谢谢你们!


包围盒并没有包住盒子

包围盒并没有包住盒子

该用户从未签到

发表于 2011-9-13 08:34:54 | 显示全部楼层
您的程序不完整,导致我没办法判断您的节点结构到底是什么。请注意ComputeBoundsVisitor计算得到的包围盒位于testPAT的局部坐标系下,如果您需要世界坐标系的值,还需要把bb的8个顶点都乘以localToWorld矩阵

该用户从未签到

 楼主| 发表于 2011-9-13 09:28:50 | 显示全部楼层
回复 2# array


    谢谢array,节点结构很简单   

节点结构

节点结构

Box结点就是画出来的线框模式的正方体,Testbox是一个盒子模型,
为什么我按照testPAT包围盒的位置来设置刚体和几何体的位置时候它是正确的呐?而直接把boxBounding的位置设在testPAT包围盒的位置上却发现并没用包住盒子,难道刚体跟几何体的是跟 testPAT用到的坐标形式不一样? 望解答,谢谢您!

该用户从未签到

发表于 2011-9-13 11:15:01 | 显示全部楼层
没有穿过说明盒子的位置是对的,你的包围盒位置是错的。

该用户从未签到

 楼主| 发表于 2011-9-13 11:42:24 | 显示全部楼层
回复 4# fenma3422


   谢谢您!
还是有点疑惑,我设置线框盒子的位置和刚体几何体的位置都是一致的,为什么一个是错的 一个是对的呐?

该用户从未签到

发表于 2011-9-13 13:41:40 | 显示全部楼层
搞清楚你所求的包围盒是在哪个坐标系下,然后再设置位置。可能的是你的box和包围盒不是在一个坐标系中表达的。而你设置了相同了位置就出现偏差

该用户从未签到

 楼主| 发表于 2011-9-13 17:56:08 | 显示全部楼层
回复 6# fenma3422


    谢谢您! 我也是觉得是这个问题,但不知道怎么转换坐标。

该用户从未签到

发表于 2011-9-14 15:27:33 | 显示全部楼层
这要看你的球包围盒的算法。

该用户从未签到

发表于 2011-9-16 10:02:52 | 显示全部楼层
前些年有个IloveVR的,这里有个WLLoveOSG

该用户从未签到

 楼主| 发表于 2011-9-16 10:33:34 | 显示全部楼层
回复 9# liushui


     呵呵,没别的意思,只是暗示自己喜欢OSG,慢慢的就会真喜欢上的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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