Jump to content
  • Advertisement


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

Strange Monkey


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

If you intended to correct an error in the post then please contact us.

Recommended Posts


> 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 this post

Link to post
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 this post

Link to post
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 = 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

Share this post

Link to post
Share on other sites

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!