[ODE] Re: center of mass

Geoff Carlton gcarlton at iinet.net.au
Thu Oct 27 10:27:20 MST 2005


Nagymathe Denes wrote:

> I agree. I had to make my own as well. It's just a few lines of code, 
> but having a 'standard' version would make life simpler for many 
> people. :o)
> I've also added a new flag to the geoms to show if it's inside a 
> geomtransform. This allows some sort of automation as i can simply 
> call dGeomGetFinalPosition() for example, without having to care if 
> the given geom is an independent one or not.

If there are any changes to the core geom/body code itself (such as the 
addition of flags), it would be worth considering just supporting 
offsets properly.  I posted the idea way back when, with a fair amount 
of agreement and a small amount of disagreement.  I'll repost the 
concept below.  Since that time, I've implemented it on my local 
version, with some of the interface I suggested.  I never made a patch 
up though - its a rather large change mainly because currently geoms 
store a separate pointer to R and pos, but this change also tidies it up 
to storing a single posR pointer instead.  That reduces a pointer, which 
makes up for the addition of another posR pointer below.

------------------------------------------------------
Re: [ODE] PosR - a better way? [12/11/04] 12:36pm
------------------------------------------------------
Currently Body aggregates a PosR, and Geom has a ptr to either its own, 
or the Body's.  We keep all that, but Geom has an extra ptr to an offset 
PosR or null (I'll call it offset_ptr below).

Case 1: Geom by itself  (As we have now)
Geom ptr to a PosR.  Geom offset_ptr is null.

Case 2: Geom on body, no offset (As we have now)
Geom ptr to body's PosR.  Geom offset_ptr is null.

Case 3: Geom on body, with an offset (Replaces GeomTransform)
Geom ptr to a PosR (the final position).  Geom offset_ptr to another 
PosR.  Thus in this case the geom has 2 extra PosR, in addition to the 
body's PosR.

Case 4: Geom by itself, with an offset
Not allowed?

In the ComputeAABB, if the geom's offset_ptr isn't null, we update the 
Geom's own PosR using the body and offset.  Or we could  have a seperate 
"dirty" flag, rather than merging with the aabb flag.

If we change whether a Geom has an offset (via dGeomSetOffsetExists or 
whateverwe'll alloc or free the extra PosRs.

There is no copying of PosR around the place, and no redundant 
recalculations.  Its identical in the current cases, except for one 
additional pointer which is null, and an occasional dirty flag check (in 
computeAABB, and probably GeomGetPosition etc).  Thus, it doesn't avoid 
allocs/frees, and its actually very similar in implementation to 
GeomTransform.  I think however that its nicer than having a seperate 
geom just for the offset.


------------------------------------------------------
Re: [ODE] PosR - a better way? [12/11/04] 2:01pm
------------------------------------------------------
Well, in terms of the ode implementation its not that different at all, 
so its really a question of ease of use.

1.) Collision and queries are easier.
Instead of the collision being set up to return either the transform 
container or its geom (with caveats about its position), you get the 
actual geom itself.  No need for the "SetInfo" switch.  No need to 
special case "oh, if its a transform container, get the thing its 
holding".  Also its easier to iterate through a body's geoms, since you 
don't have the container geoms to worry about.  For a given geom you can 
simply query its offset (if it has one) from the body.

2.) Simpler to set up and understand
If you want to offset a geom, you don't need to detach the geom, attach 
a transform container, and point the container to the geom.  Instead, 
you just call a function on the geom itself.

The interface I'm thinking is the following:
   dGeomSetOffsetPosition()
   dGeomSetOffsetRotation()
   dGeomSetOffsetQuaternion()
   dGeomClearOffset()
   dGeomIsOffset()
   dGeomGetOffsetPosition()
   dGeomGetOffsetRotation()
   dGeomGetOffsetQuaternion()
Where the SetOffsetXXX() functions create the offset PosR if necessary.
I believe this way of dealing with offsets would be a substantial 
improvement to the ode interface.

Geoff


More information about the ODE mailing list