#### Archived

This topic is now archived and is closed to further replies.

# Sliding

This topic is 6329 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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

##### Share on other sites

> 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.

##### Share on other sites
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.

##### Share on other sites
ok But how can I do this, Novalis?

##### Share on other sites
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:

if (z > 0)   if (c < 0)      c = 0else 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

1. 1
Rutin
65
2. 2
3. 3
4. 4
5. 5

• 17
• 10
• 29
• 20
• 9
• ### Who's Online (See full list)

There are no registered users currently online

×