Jump to content
  • Advertisement
Sign in to follow this  
discodowney

Bounding Boxes

This topic is 3165 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Okay so im using the following tutorial: http://www.toymaker.info/Games/html/collisions.html Im at the part of the Axis Aligned Bounding Box. It has void CalcAABBFromOBB(const D3DXVECTOR3 *obb,D3DXVECTOR3 *minB,D3DXVECTOR3 *maxB) But later obb is used as an array i.e. obb[0], etc. I dont know all the ins and outs of C++ so im just checking if this is a typo? More importnatly, Im just looking for confirmation that that method CalcAABBFromOBB needs to be called every frame? Im nearly certain it does but yeah, confirmation would be nice.

Share this post


Link to post
Share on other sites
Advertisement
You will only need to recalculate the AABB if the OBB has changed - that is, the OBB has been rotated or moved or scaled.

An OBB - oriented bounding box - is not aligned to the axis, so you will need to know it's vertices. Just a min and max vector aren't enough, hence the vector array. What this function does is just checking the minimum and maximum values in the OBB's vertices, and storing them in the min and max vector respectively. That gives you the AABB.

Note that that function can give you the AABB of any number of vertices - it's just limited to 8 vertices because 3D OBB's consist of 8 vertices.

Share this post


Link to post
Share on other sites
Quote:
Original post by discodowney
void CalcAABBFromOBB(const D3DXVECTOR3 *obb,D3DXVECTOR3 *minB,D3DXVECTOR3 *maxB)

But later obb is used as an array i.e. obb[0], etc.

The parameter to obb is probably declared as
D3DXVECTOR3 obbOfMyObject[8];
so it can store 8 instances of D3DXVECTOR3. When you want to give this as parameter obb when invoking CalcAABBFromOBB, then you can (a) theoretically make a copy of all 8 vectors, resulting in a total of 8 * 3 floats (I think), so it would be somewhat costly. Or you can (b) use a pointer to the first vector (and the implicit knowledge that there are 7 other vectors just behind those from which you have the address). Doing so is typical for C, and hence has been carried into C++, too. An access is then done either as

obb->x
but only for the first vector. To access the i-th vector you have to do some pointer arithmetic, like

(obb+i)->x
Now, that is just another kind of writing

obb.x


Using something like

struct OBB {
D3DXVECTOR3 corners[8];
};

void CalcAABBFromOBB(const OBB *obb, D3DXVECTOR3 *minB,D3DXVECTOR3 *maxB);

OBB obbOfMyObject;
CalcAABBFromOBB( &obbOfMyObject, ...);

would be a bit better, but still doesn't protect you from accessing out-of-index, e.g. corners[8]. You have to use methods if you want to be safe, e.g. a class from the STL library.


Quote:
Original post by discodowney
More importnatly, Im just looking for confirmation that that method CalcAABBFromOBB needs to be called every frame? Im nearly certain it does but yeah, confirmation would be nice.
It needs to be called whenever the OBB has changed and its belonging AABB is needed. This may be every frame, but need not to be. E.g. if the object inside the OBB is animated, then it is probable that the OBB hs changed. If e.g. only the camera is moved, then a recalculation of the AABB (which is fixed to the world, not to the camera) need not be re-computed. ((EDIT: As Captain P already stated.))

Share this post


Link to post
Share on other sites
Just FYI, you can compute the AABB for an OBB given only the OBB's basic representation (center, orientation, and extents); you don't actually need the 8 corners for this. The 'direct' method is more efficient than the '8 corners' method (which might matter if you're doing this many times per update), and will *definitely* be more efficient if the only reason you're computing the corners is to rebuild the AABB.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!