[ODE] Collision response etc
John Savage
JSavage at data-mate.com
Tue Jan 28 20:22:01 2003
Not having done this myself, here's an idea. It definitely can be improved
upon, but here's the 'of the top of my head explanation'.
You only want to play the 'bump' sound if there is an instantaneous
contacts, or put another, you only want to play the sound the first time
objects touch. But, if they touch in subsequent world steps you don't want
to play the sound again.
What you could do is keep track of whether each object pair generated any
contacts in the previous collision callback. Then as you process the current
callback you check, whether the pair of objects currently collided also
collided during the last frame. If they did, you know they are continuously
in contact so you should not play the sound. If they were not in contact
last frame, then you know that this is the first time the two objects have
met, and so you can safely play the sound.
English descriptions are so hard to do accurately, so here is some pseudo
code...
/*
purpose of WorldStepCounter is to give each set of calls to
CollisionCallbackRoutine()
for each call to dWorldStep a unique ID. This value is then stored in
LastCallbackCollided
to record the ID of the world step when this pair of objects last collided.
*/
int WorldStepCounter = 0;
/*
Each entry in this 2D array is set to the WorldStepCounter value when the
two objects
with IDs equal to the index pair last collided.
*/
int LastCallbackCollided[NumObjects][NumObjects] = { all set to -1 };
void GameLoop()
{
while(true)
{
DoStuff();
WorldStepCounter++;
dWorldStep();
}
}
foo CollisionCallbackRoutine(int obj1index, int obj2index)
{
if(LastCallbackCollided[obj1index][obj2index] != WorldStepCounter)
{
// then they did not collide last frame, so we can...
PlaySound('bump.wav');
}
// store the fact that these two objects collided in the
LastCallbackCollided array...
LastCallbackCollided[obj1index][obj2index] = WorldStepCounter;
}
End of PseudoCode.
And that should do it. Serious issues to be addressed though: The 2D array
could quite quickly need to be very large since it is n^num_objects in size.
Take the above pseudocode as an idea only! :).
Hope this helps (or even makes sense :p).
John
_____
John Savage <mailto:jsavage@data-mate.com>
Software Engineer DataMate Global Communications
Tel: +1 818 487 3900 ext105
_____
-----Original Message-----
From: ode-admin@q12.org [mailto:ode-admin@q12.org]On Behalf Of Byron
Wright
Sent: Tuesday, January 28, 2003 6:56 PM
To: 'David Walker'; ode@q12.org
Subject: RE: [ODE] Collision response etc
I initially attempted that. The problem is that the existence of contact
points does not constitute a "bump" (or high impact). The problem is
that if the object is resting on a ground plane for example, then the
collision callback is called every time step (and contact joints are
created) create a horrible array of sound effects. That is why I was
attempting to figure out the forces applied to the objects since that
will most likely help me figure out if the objects are bouncing or have
collided and are not simply resting on/against one another. The problem
still remains that when retrieving the force on a body (in the callback
or not) I still get a result of 0.
-Byron
-----Original Message-----
From: David Walker [mailto:david.walker530@ntlworld.com]
Sent: Tuesday, January 28, 2003 6:38 PM
To: Byron Wright
Subject: Re: [ODE] Collision response etc
Hello,
I think the best place to do this is in the collision callback. when you
actually create the contact joints. that would probably be a good place
to play the sound. I don't know for sure because I haven't done this yet
(It's on my list of things to do) but that's how I'm going to tackle it.
I'm also going to put scoring in there somewhere.
Does this make sense?
David
----- Original Message -----
From: "Byron Wright" <bslayerw@mindspring.com>
To: <ode@q12.org>
Sent: Tuesday, January 28, 2003 6:21 PM
Subject: RE: [ODE] Collision response etc
> *bump*.
>
> Anyone have any idea on how I might solve this?
>
> -Byron
>
> -----Original Message-----
> From: ode-admin@q12.org [mailto:ode-admin@q12.org] On Behalf Of Byron
> Wright
> Sent: Friday, January 24, 2003 5:30 PM
> To: ode@q12.org
> Subject: [ODE] Collision response etc
>
>
> New to ODE, trying to figure out how to play a sound effect when
> objects collide.
>
> Here are the steps I take to produce a "bump" sound effects.
>
> - do collision detection and response
> - world step
> - check all bodies for contact joints, if they have contact joints and
> their forces are greater than 0 then play a the bump sound effect
>
>
>
> The problem is that after a collision and the contact joints have been
> created the magnitude of the force is alway 0. When should I get be
> requisting the force from my bodies? Or should I be checking something
> else to find out if the body has been "bumped"?
>
> Here is my update function :
>
> void update(float dt) {
> dSpaceCollide(space, 0, &NearCallback);
> dWorldStep (world, dt);
> //iterate though all boxes, if they have contact joints
(collision)
> //then play a sound effect if the box's force is greater than 0
>
> //BodyCollection is = typedef vector<dBodyID> BodyCollection;
> BodyCollection::iterator it = boxBodies.begin();
>
> while(it != boxBodies.end()) {
> int numJoints = dBodyGetNumJoints(*it);
> if(numJoints > 0) {
> for(int joints = 0; joints < numJoints; ++ joints) {
> dJointID joint = dBodyGetJoint (*it, joints);
> if(dJointGetType(joint) == dJointTypeContact) {
> //it's a contact joint. check force of
> bodies
> const dReal * forceA = dBodyGetForce(*it);
>
> cout << magnitude(forceA) << endl;
> if(magnitude(forceA) > 0.05 ) {
> Mix_PlayChannel(-1,bump,0);
> }
> }
> }
>
> }
> ++it;
> }
>
> //remove all contact joints from the system
> dJointGroupEmpty(contactGroup);
> }
>
> Byron Wright
>
> _______________________________________________
> ODE mailing list
> ODE@q12.org
> http://q12.org/mailman/listinfo/ode
>
> _______________________________________________
> ODE mailing list
> ODE@q12.org
> http://q12.org/mailman/listinfo/ode
_______________________________________________
ODE mailing list
ODE@q12.org
http://q12.org/mailman/listinfo/ode