这里的结构是
osg::MatrixTransform
|
osg::Geode
|
several drawables
如何从osg::MatrixTransform
获取AABB边界框?
答案 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;