• Create Account

## Sliding

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

4 replies to this topic

### #1Strange Monkey  Members

122
Like
Likes
Like

Posted 19 July 2001 - 05:05 PM

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

### #2johnb  Members

351
Like
Likes
Like

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.

### #3Novalis  Members

122
Like
Likes
Like

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.

### #4Strange Monkey  Members

122
Like
Likes
Like

Posted 20 July 2001 - 04:50 AM

ok But how can I do this, Novalis?

### #5liquiddark  Members

340
Like
Likes
Like

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:

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

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.