Moving the player and not getting stuck

Moving the player about has been the bane of my 3D and 2D game programming hobby. No matter what I try, no matter how fancy the physics engine, the shape representing my player keeps getting stuck in a wall or falling though the floor.

The usual causes include two walls (planes) converging into a cornet my player attempts to walk into, aproaching a wall from an angle almost parallel to the wall, and being ‘lucky’ enough to pass through the infinitely thin gap between two polygons.

If anyone could shed any light on how to solve this sort of problem, I’d be very greatful.

As an example - a player is represented by a sphere that can either stand still or move straight ahead at a constant velocity. If the ground slopes up, the player goes up. If the player attempts to walk through a wall at an angle to it, the player slides along it. I know how to calculate the correct physics values for these things (impact normals, angles of reflection, friction, etc), but I can’t keep my player charcter from passing through or getting stuck in walls 100% of the time.

Thanks,

Mark McKay

http://www.kitfox.com

Based on your description, this looks a lot more like a collision handling problem rather than a physics problem. It’s nice to figure in friction, momentum, and all that stuff, but you still need to detect and handle collisions precisely, otherwise those are all for naught.

I’m not an expert in 3D collision handling, so a real answer should be sought from someone who deals with this stuff on a regular basis.

Yes, this is a collision detection problem (well, more of a collision resolution problem). Unfortunately, it’s one I’ve not been able to solve. If you could point me to any papers describing ways to handle this, it would be quite helpful.

Brackeen’s book does a pretty good job at describing 3D collision handling, but if you don’t want to buy that, your best bet is gamedev.net.

Here’s a direct link to their CD articles list.

http://www.gamedev.net/reference/list.asp?categoryid=45#99