It's not at all clear to me what your code, below, is doing. If I wanted the
world coordinate bounding box of a given node, I'd do the following:
const osg::MatrixList& m = node->getWorldMatrices();
osg::ComputeBoundsVisitor cbv;
node->accept( cbv );
osg::BoundingBox bb = cbv.getBoundingBox();
osg::Vec3 minV = bb._min * m.front();
osg::Vec3 maxV = bb._max * m.front();
osg::notify( osg::ALWAYS ) << minV << std::endl << maxV << std::endl;
No regard for multiparenting there, but you could easily add code to iterate
over the MatrixList if you wanted that.
Hope that helps.
Paul Martz
Skew Matrix Software LLC
http://www.skew-matrix.com
+1 303 859 9466
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Harold
Comere
Sent: Wednesday, May 13, 2009 2:50 AM
To: [email protected]
Subject: [osg-users] World space bounding box
Hi all,
I wonder if there is any osg function computing any node world space
bounding box.
If not, i have done it but i think it can be optimized a bit..
Here i'm computing it for a drawable, i compute box vertices coordinates in
world space then i do some min max on them.
Code:
osg::BoundingBox boundingBox = drawable->getBound ( );
osg::Vec3d p1 = osg::Vec3d ( boundingBox.xMin ( ), boundingBox.yMin ( ),
boundingBox.zMin ( ) ); osg::Vec3d p2 = osg::Vec3d ( boundingBox.xMin ( ),
boundingBox.yMin ( ), boundingBox.zMax ( ) ); osg::Vec3d p3 = osg::Vec3d (
boundingBox.xMin ( ), boundingBox.yMax ( ), boundingBox.zMin ( ) );
osg::Vec3d p4 = osg::Vec3d ( boundingBox.xMin ( ), boundingBox.yMax ( ),
boundingBox.zMax ( ) ); osg::Vec3d p5 = osg::Vec3d ( boundingBox.xMax ( ),
boundingBox.yMin ( ), boundingBox.zMin ( ) ); osg::Vec3d p6 = osg::Vec3d (
boundingBox.xMax ( ), boundingBox.yMin ( ), boundingBox.zMax ( ) );
osg::Vec3d p7 = osg::Vec3d ( boundingBox.xMax ( ), boundingBox.yMax ( ),
boundingBox.zMin ( ) ); osg::Vec3d p8 = osg::Vec3d ( boundingBox.xMax ( ),
boundingBox.yMax ( ), boundingBox.zMax ( ) );
osg::Vec3d p1w = p1 * matrix;
osg::Vec3d p2w = p2 * matrix;
osg::Vec3d p3w = p3 * matrix;
osg::Vec3d p4w = p4 * matrix;
osg::Vec3d p5w = p5 * matrix;
osg::Vec3d p6w = p6 * matrix;
osg::Vec3d p7w = p7 * matrix;
osg::Vec3d p8w = p8 * matrix;
double xMinw = std::min ( p1w.x ( ), std::min ( p2w.x ( ), std::min ( p3w.x
( ), std::min ( p4w.x ( ), std::min ( p5w.x ( ), std::min ( p6w.x ( ),
std::min ( p7w.x ( ), p8w.x ( ) ) ) ) ) ) ) ); double yMinw = std::min (
p1w.y ( ), std::min ( p2w.y ( ), std::min ( p3w.y ( ), std::min ( p4w.y ( ),
std::min ( p5w.y ( ), std::min ( p6w.y ( ), std::min ( p7w.y ( ), p8w.y ( )
) ) ) ) ) ) ); double zMinw = std::min ( p1w.z ( ), std::min ( p2w.z ( ),
std::min ( p3w.z ( ), std::min ( p4w.z ( ), std::min ( p5w.z ( ), std::min (
p6w.z ( ), std::min ( p7w.z ( ), p8w.z ( ) ) ) ) ) ) ) );
double xMaxw = std::max ( p1w.x ( ), std::max ( p2w.x ( ), std::max ( p3w.x
( ), std::max ( p4w.x ( ), std::max ( p5w.x ( ), std::max ( p6w.x ( ),
std::max ( p7w.x ( ), p8w.x ( ) ) ) ) ) ) ) ); double yMaxw = std::max (
p1w.y ( ), std::max ( p2w.y ( ), std::max ( p3w.y ( ), std::max ( p4w.y ( ),
std::max ( p5w.y ( ), std::max ( p6w.y ( ), std::max ( p7w.y ( ), p8w.y ( )
) ) ) ) ) ) ); double zMaxw = std::max ( p1w.z ( ), std::max ( p2w.z ( ),
std::max ( p3w.z ( ), std::max ( p4w.z ( ), std::max ( p5w.z ( ), std::max (
p6w.z ( ), std::max ( p7w.z ( ), p8w.z ( ) ) ) ) ) ) ) );
osg::Vec3d minWorld = osg::Vec3d(xMinw, yMinw, zMinw); osg::Vec3d maxWorld =
osg::Vec3d(xMaxw, yMaxw, zMaxw);
It looks like an horrible code ... but it works.
Does anyone know a most efficient way to compute it ?
Thank you for attention,
Regards,
Harold
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=11972#11972
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org