Re: Creating enclosing convex meshes for AABB calculation

Fabian Giesen <[email protected]> Mon, 06 Jun 2011 22:28:30 -0700
Newsgroups gmane.games.devel.sweng
Message-ID <[email protected]>
On 06.06.2011 17:52, BRIAN LIVINGSTON wrote:
> Hello,
> I am aspiring game developer. I am using AABB trees for all sorts of
> stuff in a scene graph. The problem is that we need to quickly calculate
> a new AABB when an object moves.

If you're using AABBs, you already get a relatively loose fit (depending 
on the shape of the object). If you really care about getting a tight 
fit around the object, use the convex hull which you can then transform 
directly. Conversely, if you don't care about tightness that much, 
there's no point getting fancy about it; you can either build a new AABB 
from the transformed original AABB, or use something with a tighter fit 
like a general OBB, transform it, and then use the AABB of that. This is 
very easy, fast, and totally fine for e.g. culling purposes.

> Therefore I am working on an algorithm for generating vastly simplified
> convex meshes for fast(ish) AABB calculation for objects that can have
> an arbitrary orientation. The basic idea is to sort of fit a geodesic
> sphere over an object to produce a low-poly convex blob that contains
> the significant maximum extent information from any arbitrary
> orientation. The geodesic sphere is just a tool for discovering the
> maximum extent within a solid angle that radiates outward from an origin
> from within a mesh model. A geodesic sphere has the property that it is
> constructed from tetrahedrons. Therefore discovery of the maximum extent
> within each solid angle can occur with a barycentric coordinate
> evaluation. I am abusing the term solid angle here to mean the volume
> within a sphere which is a tetrahedron that has one vertex on the sphere
> origin and three vertices on the surface of the sphere.
 > Once we have the maximum extent point field the question is: how do we
 > approach building a new triangle mesh? We have the adjacency knowledge
 > because each triangle face of the sphere is a bucket that either
 > contains the vertices (1-N) that share the maximum distance from the
 > origin. So if we split the sphere into 2 hemispheres we can use a hybrid
 > 2D algorithm for constructing a plane from a point cloud. We should also
 > have a step that further reduces the set of vertices in the point cloud
 > by removing the entries for faces on the sphere that are now essentially
 > concave.
 > [..]

Why not use a convex hull algorithm to construct the exact convex hull 
and use that if you want a tight fit?

What you describe seems like an incredibly roundabout way of attacking 
the problem. And the fact that your multi-step algorithm may later 
produce concavities shows that it's an inherently flawed way of 
organizing the computation.

The sane variant of this approach is to build what's commonly called a 
k-DOP (Discrete Oriented Polytope); effectively a volume described by 
the intersection of the negative half-spaces of k planes.

Sounds fancy but is incredibly easy. Pick any direction vector d. Now 
compute the dot product of all vertex positions with d, and keep track 
of the minimum (min_d) and maximum (max_d). Clearly, the mesh is within 
the half-spaces

   dot(P, d) <= max_d
   dot(P, d) >= min_d

which immediately gives you two planes that enclose the object from 
opposing sides (that's why in practice you always pick k=even, since you 
get the second plane for any direction almost for free).

If you want to generate a mesh from that, the easiest way to do it is 
probably to take the AABB for the object and then clip it against all of 
the planes. But again, storing a mesh (even if it's a small one) just to 
generate updated bounding volumes from is probably overkill! And again, 
if you want a good approximation of the object, use its convex hull; 
there's no point in using an approximation that ends up being hairier 
than the original thing!

> I am also curious how the pro's calculate AABB's on the fly in the
> cheapest (in processing) and tightest (in fit) manner. Do the pro's use
> low poly versions of meshes for bounding box calculations?

Don't know what others do, but for stuff where tight fit doesn't matter 
much, I normally just store a model-space AABB for everything and use 
the worldspace AABB around that if I need one. This is really easy (note 
you don't expand the AABB into 8 vertices, you can solve this directly!).

If you do care about tightness of fit, use an OBB or the convex hull 
(the latter is useful for physics and collision queries, but its 
variable size and test cost make it fairly unsuitable for anything but 
the leaves of some tree). Both of these transform easily and don't lose 
any tightness of fit.

-Fabian
_______________________________________________
Sweng-Gamedev mailing list
[email protected]
http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder.com