Started by Jul 19 2001 05:05 PM

,
4 replies to this topic

Posted 19 July 2001 - 05:05 PM

How can I implement sliding in a 3D game. I already have the collision detection stuff done.

Posted 19 July 2001 - 11:58 PM

> How can I implement sliding in a 3D game. I already have the

> collision detection stuff done.

The basic answer is ''add friction'' but if you''ve got as far as collisin detection I''m sure you''ve looked at this.

There are two approaches in a rigid body system with collision detection.

* Add friction to your collisions. This usually involves very little extra complexity over frictionless collisions described by most algorithms, the main difficulty is knowing where to add the frictional term(s).

Then if your model is detailed enough sliding will just happen naturally, as one model for friction is repeated/continuous collisions between objects, or between an object and a surface. The problem is this approach is often unstable, as the objects are forever bouncing off each other, but there are things you can do to improve this, such as tuning your physics parameters and increasing the rate of calculations/number of impacts allowed per second.

* Simulate contact seperately from collisions. This means switching the objects from ''colliding'' to ''sliding'' mode depending on speed, contact, etc., and using different maths for the sliding mode. Unfortunately this involves entirely new code, and as it''s not something I''ve implemented myself (I''ve always used the 1st method) I can''t say much more about it, except that you can find out more abut it on the Web.

Posted 20 July 2001 - 03:19 AM

I''m guessing you are talking specificly about the case of a player sliding a long a wall instead of hitting it and just stopping? In that case, project the players motion vector onto the plane of the polygon they collided with, and then use that vector as the players new motion vector.

Posted 23 July 2001 - 05:07 AM

The math is simple:

Say you hit a wall with normal (0,0,z). You then basically just want to subtract any component of motion which is antiparallel to this vector from the player's movement vector. So say the player sets his or her movement vector to (a,b,c). You must then find out if C is parallel or antiparallel to the wall normal. In this case, it is a simple test of sign:

In the case of a more complex normal, you can use the vector dot-product to project the movement vector onto the normal, and then subtract.

example:

Hence the new move vector is

We can test this to see if it's actually what we want by checking the dot again:

If you want a constant move magnitude preserved, you can then normalize this result and multiply it by your magnitude.

That's not the fastest way, but it gets you started.

ld

edited for tags

Edited by - liquiddark on July 23, 2001 12:13:28 PM

Say you hit a wall with normal (0,0,z). You then basically just want to subtract any component of motion which is antiparallel to this vector from the player's movement vector. So say the player sets his or her movement vector to (a,b,c). You must then find out if C is parallel or antiparallel to the wall normal. In this case, it is a simple test of sign:

if (z > 0)

if (c < 0)

c = 0

else if (z < 0)

if (c > 0)

c = 0

In the case of a more complex normal, you can use the vector dot-product to project the movement vector onto the normal, and then subtract.

example:

norm = (1/2,1/2,1/sqrt(2)) (normalized normal)

player's move vector = (200, 100, -400)

dot-prod = 100 + 50 - 400/sqrt(2) ~ -132.84

Hence the new move vector is

(200,100,-400) - (-132.84)(1/2,1/2,1/sqrt(2)) = (266.42, 166.42, -306.07)

We can test this to see if it's actually what we want by checking the dot again:

dot = 266.42*.5 + 166.42 * .5 - 306.07 * 1/sqrt(2) ~ 0

If you want a constant move magnitude preserved, you can then normalize this result and multiply it by your magnitude.

That's not the fastest way, but it gets you started.

ld

edited for tags

Edited by - liquiddark on July 23, 2001 12:13:28 PM