我的做试验的场景是这样的:
PAT1~3都是些空间变换的结点,node1~node3分别是一个三角锥、一个圆柱和那头牛。 “画出的包围盒结点”是一个自己定义的画包围盒的函数的返回值,函数头是这样子的: osg::ref_ptr<osg::Geode> createBoundingBox(osg::BoundingBox &box,osg::Vec3f nodeCenter)。
还有一段重要的代码是(可能看代码更描述的清楚):
osg::ComputeBoundsVisitor boundvisitor;
PAT3->accept(boundvisitor);
//现在画的是 Node3的包围盒,node3是那头牛
bb = boundvisitor.getBoundingBox();
nodeCenter=bb.center()*osg::computeLocalToWorld((PAT3->getParentalNodePaths()[0]));
root->addChild(createBoundingBox(bb,nodeCenter));//就是把那个画出来的方框给添加到根节点显示。
显示结果如效果图1所示:(这个是在预料中的,因为我只要画node3,也就是那头牛的包围盒)
现在我想画整个这三个结点的包围盒,我把代码改成这样:
osg::ComputeBoundsVisitor boundvisitor;
PAT1->accept(boundvisitor);
//现在画的是整个的包围盒,因为PAT1是在最上面的
bb = boundvisitor.getBoundingBox();
nodeCenter=bb.center()*osg::computeLocalToWorld((PAT1->getParentalNodePaths()[0]));
root->addChild(createBoundingBox(bb,nodeCenter));//就是把那个画出来的方框给添加到根节点显示。 这个结果明显就不对了,因为我需要的是将这三个node都包含在内的包围盒。 这个结果给我的感觉是,包围盒确实在我所需要的空间点生成了,并且大小也是正确的,好像没有进行位置的平移一样。
上面的那个代码是参考array在一个帖子里面说的方式做的,我试验了,但有问题,所以特在此来问问。哪位大侠知道错误的原因在哪边么?该怎么修改呢?谢谢 |