Search code examples
c++game-enginebulletphysics

Avoid ground collision with Bullet


I'm trying to use Bullet physic engine to create a 3D world.

I've got my character with a Capsule shape on his body and my ground his made of some static blocs stick together, here is a schema to illustrate my words: enter image description here

The problem is present when my character run from one block to another: Bullet detect a collision and my character start to jump a little bit on y-axis.

How can I avoid the problem?


Solution

  • What I did to overcome this issue is the following:

    Instead of have the capsule slide on the ground, I had a dynamic capsule ride on top of a spring. I implemented the spring as several ray casts originating from bottom of the capsule. The length of the spring was like half a meter or less and it would pull and push the capsule to and from the ground. The grip/pull is important so the character wouldn't jump unexpectedly. The springs stiffness controls how much bobbing you have.

    This had the following effects

    • No unwanted collision with edge of geometry on the floor, since the capsule floats
    • Walking up stairs and slopes implemented implicitly. The spring would just "step" onto the stair's step and push the character capsule up.
    • Implementation of jumping was just matter of releasing the grip on the ground the spring had and giving the body an impulse.
    • A landing character after a jump or fall automatically displayed "knee-bending" as you would expect
    • Pleasant smoothing of vertical movements in general. Like on elevator platforms etc.
    • Due to the grip/pull to the ground, even when running downhill the character would not start to "fly" as you experience in some games (I find that annoying typically).
    • Ducking character = decrease the length of the spring and/or the capsule.
    • Sliding downhill? You can fully control it by checking the angles of the floor area the ray cast of the spring hit.

    I had to play around a lot with the stiffness of the spring, the length of the spring, the length of the grip etc. but in the end I was very happy about how simple yet well this worked.