Members - Reputation: 351
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.
Members - Reputation: 122
Posted 20 July 2001 - 03:19 AM
Members - Reputation: 340
Posted 23 July 2001 - 05:07 AM
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.
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.
edited for tags
Edited by - liquiddark on July 23, 2001 12:13:28 PM