|
我做了个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)刚体跟几何体的位置也应该是线框盒子的位置,这样的话球应该是穿过没有被包住的下半部分盒子的,为什么没有发生这种情况?
麻烦帮忙解答,谢谢你们!
包围盒并没有包住盒子
|
|