Hi Wojtek,

 

You make a very pertinent remark about _lowerBBCorner and _upperBBCorner
being pre-calculated. I must admit I missed that fact.

 

I've reviewed carefully OSG code and mine, and just realized we use
opposite convention for the plane orientation (osg::Polytope expects the
plane to be pointing inwards). Once I fixed that, everything is working
again.

 

Cheers !

 

 

Tanguy

 

 

From: osg-users-boun...@lists.openscenegraph.org
[mailto:osg-users-boun...@lists.openscenegraph.org] On Behalf Of
Wojciech Lewandowski
Sent: 19 October 2009 3:26 PM
To: OpenSceneGraph Users
Subject: Re: [osg-users] Plane::intersect(BoundingBox & box) buggy ?

 

Hi Tanguy,

 

What makes you think its wrong ? I think its very smart code which does
only whats really neccessary.  _lowerBBCorner and _upperBBCorner are not
constant and in fact are relative and precalculated based on plane
orientation. Depending on the plane orientation its possible to know
before hand which corners of axis aligned bounding box will represent
most extreme points of the box.

 

Cheers,

Wojtek

        ----- Original Message ----- 

        From: Tanguy Fautre <mailto:tang...@aristechnologies.com>  

        To: OpenSceneGraph Users
<mailto:osg-users@lists.openscenegraph.org>  

        Sent: Monday, October 19, 2009 3:25 PM

        Subject: [osg-users] Plane::intersect(BoundingBox & box) buggy ?

         

        Hi,

         

        I've used an osg::Polytope to test whether a given convex volume
was colliding against a BoundingBox. Unfortunately it wouldn't work.
I've tracked the problem down to Plane::intersect().

         

                /** intersection test between plane and bounding sphere.

                    return 1 if the bs is completely above plane,

                    return 0 if the bs intersects the plane,

                    return -1 if the bs is completely below the plane.*/

                inline int intersect(const BoundingBox& bb) const

                {

                    // if lowest point above plane than all above.

                    if (distance(bb.corner(_lowerBBCorner))>0.0f) return
1;

         

                    // if highest point is below plane then all below.

                    if (distance(bb.corner(_upperBBCorner))<0.0f) return
-1;

         

                    // d_lower<=0.0f && d_upper>=0.0f

                    // therefore must be crossing plane.

                    return 0;

         

                }

         

        The piece of code above assumes that the plane is axis aligned
and that the normal is pointing toward the positive part of the axis.
Such an assumption is wrong for most other planes, and certainly does
break osg::Polytope implementation (from what I understand). I had to
bypass it with the following (note that in my case I only needed a
Boolean returned value).

         

        bool intersect(const osg::Plane & plane, const osg::BoundingBox
& bb)

        {

              if (plane.distance(osg::Vec3(bb.xMin(), bb.yMin(),
bb.zMin())) <= 0)

                    return true;

         

              if (plane.distance(osg::Vec3(bb.xMin(), bb.yMin(),
bb.zMax())) <= 0)

                    return true;

         

              if (plane.distance(osg::Vec3(bb.xMin(), bb.yMax(),
bb.zMin())) <= 0)

                    return true;

         

              if (plane.distance(osg::Vec3(bb.xMin(), bb.yMax(),
bb.zMax())) <= 0)

                    return true;

         

              if (plane.distance(osg::Vec3(bb.xMax(), bb.yMin(),
bb.zMin())) <= 0)

                    return true;

                                      

              if (plane.distance(osg::Vec3(bb.xMax(), bb.yMin(),
bb.zMax())) <= 0)

                    return true;

         

              if (plane.distance(osg::Vec3(bb.xMax(), bb.yMax(),
bb.zMin())) <= 0)

                    return true;

         

              if (plane.distance(osg::Vec3(bb.xMax(), bb.yMax(),
bb.zMax())) <= 0)

                    return true;

         

              return false;

        }

         

         

        I wonder whether the OSG implementation is limited on purpose
(in which case it should be documented), or whether this is a real bug.

         

        Cheers,

         

        Tanguy

        
________________________________


        _______________________________________________
        osg-users mailing list
        osg-users@lists.openscenegraph.org
        
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.or
g

_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to