[ODE] Scene Managenment / Partitioning (CR)
Rodrigo Luque
luque at singularstudios.com
Mon Dec 26 11:44:43 MST 2005
Hi!
I noticed that others collision packages have some sort of scene managenment integrated. I think there is no
problem to implement something like this, but there are some issues.
First, ODE has a built-in partitioning algorithm (quadtree, hash-space...) that cannot be properly used outside
(lack of interface). It's difficult to use hash-space for something like this, but a quadtree is easy because bodies
are indexed by quadtree nodes that represent a portion of the space. So, I just need to disable bodies inside
nodes that are away from the observer and wake-up bodies that are close. However, there is no C interface to
retrieve nodes in quadtree.
Second, for visibility queries it's not possible to use the quadtree or any other partitioning structure in ODE
because of the lack of interfaces. There is a way to use a geom object to make the visibility test by checking
all the geoms that are intersecting it, but there is no convex geom to represent a view frustrum and trimesh it's
not good enough to do this (it's not considered a volume, only a triangle soup).
In order to solve these problems, I implemented my own partitioner outside. However, to keep it up-to-date, I
need to check all bodies after every simulation call. I know that ODE has a dirty flag that is used to update
partitioner only if it's necessary, but I can't use this flag outside. Moreover, I am wasting time because ODE
already visits all bodies in dWorldSimulation and I am visiting again. Also imagine a situation that I need to make
sure that all bodies are OK, I mean not in dInfinity, NAND or something like this or I want to implement a linear /
angular velocity limit. I will probably need to check all bodies after the simulation step to make sure that
everything is ok. This shows I am doing redundant tasks by visiting all bodies more then once.
Actually, I have one idea to solve this problem. We can add a simulation callback to ODE. So, everytime that a
body is simulated, this callback is called and the body is passed through a parameter. So, we can retrieve
application data by using body user data and modify the body's property or update application's objects in
dBodySimulation call. This is much more efficient than visiting all bodies again.
Well, it's a suggestion. Maybe I am missing something...
Thanks you all in advance.
More information about the ODE
mailing list