[ODE] Body Position becoming #QNAN

Gopi Prashanth gprashanth at Heavy-Iron.com
Thu Apr 7 14:30:06 MST 2005


Actually, I'm having kind of a similar problem. I have successfully added
continuous collision to ODE and it works great. To do that I have to
basically do a predictive time stepping method.. so my stepWorld loop looks
like this...

- Get the first time of impact with any object in scene.
- simulate slightly past that time ( to cause penetration )
- resolve collision
- simulate enough so that the penetrations are resolved.
- go back to step one...

This works wonders and I can shoot an object at any speed and be rest
assured it will never exit the world. 
The problem is similar, if I simulate this for some cases... (reproduceable)
but I cannot pin point when.. the body pos goes to Qnans

I'm trying to debug this. I feel this has to do with me sending the
quickstepper function a very small dt and then the quickstepper trying to
iterate and further subdivide this dt.. any info along these lines would be
greatly appreciated...

Thanks
gopi

-----Original Message-----
From: Vincent Mysliwiec [mailto:vincent_mysliwiec at hotmail.com]
Sent: Thursday, April 07, 2005 12:22 PM
To: ode at q12.org
Subject: [ODE] Body Position becoming #QNAN


I'm making a ball racing game and am experiencing some reproducible
weirdness. However, I cannot solve the bug. The player controls a sphere
marble with a sphere body and on some places within a trimesh collision the
body's position goes to QNAN - not a number. I'm using single precision
floating point resolution. And here's a code snippet where I get/update the
mesh body position based on the ODE::body position

void UpdateRigidBody(...)    // called once every frame

{

...

Vector3D* theBodyPosPtr = (Vector3D*)dBodyGetPosition(theBodyID);

memcpy(&theBodyPosition, theBodyPosPtr, sizeof(Vector3D));

float theNANFloat = std::numeric_limits<float>::quiet_NaN();

if (memcmp(&theBodyPosition.x, &theNANFloat, sizeof(float)) == 0)

    assert(false)

if (memcmp(&theBodyPosition.y, &theNANFloat, sizeof(float)) == 0)

    assert(false)

if (memcmp(&theBodyPosition.z, &theNANFloat, sizeof(float)) == 0)

    assert(false)

theMesh->SetPosition(theBodyPosition);

}

Some obvious questions include:

(a) has anybody else seen this before? (b) am i getting position correctly?

Any help is appreciated!

Vincent




More information about the ODE mailing list