如何从OpenSceneGraph中的MatrixTransform节点获取AABB Bounding Box

时间:2016-04-25 01:03:30

标签: openscenegraph

这里的结构是

   osg::MatrixTransform
            |
        osg::Geode
            |
     several drawables

如何从osg::MatrixTransform获取AABB边界框?

2 个答案:

答案 0 :(得分:1)

这不是直接方法,因为MatrixTransform仅公开Bounding Sphere的getter,BoundingBox仅在Drawable类和派生类上可用。

使用您的场景图结构,您可以收集所有可绘制的内容,并展开一个边界框以包含每个可绘制的BB this method。 这将为您提供一个BB,其中包括drawables坐标中的所有其他内容。如果您需要世界坐标,您必须应用MatrixTransform(以及您沿节点路径可能具有的其他转换到图的根)

答案 1 :(得分:0)

要计算osg::MatrixTransform t的坐标框中的边界框:

#include <osg/ComputeBoundsVisitor>
osg::ComputeBoundsVisitor cbv;
t->accept(cbv);
osg::BoundingBox bb = cbv.getBoundingBox(); // in local coords.

您可以例如在本地坐标中获取大小和中心:

osg::Vec3 size(bb.xMax() - bb.xMin(), bb.yMax() - bb.yMin(), bb.zMax() - bb.zMin());
osg::Vec3 center(bb.xMin() + size.x()/2.0f, bb.yMin() + size.y()/2.0f, bb.zMin() + size.z()/2.0f);

要转换为世界坐标,您需要将节点路径的localToWorld转换从t转换为根,然后可以将任何坐标转换为世界参考框架:

osg::Matrix localToWorld = osg::computeLocalToWorld(t>getParentalNodePaths().front());
osg::Vec3 centerWorld = center * localToWorld;