4
\$\begingroup\$

I recently moved from Bullet to PhysX to see if it would be a better solution for my game engine, and so far it is. The only problem that I'm having, which is part of the reason that I switched is with the character controller. The build in one is pretty good, but I've run into an issue when I walk down a slope (although up is fine). Because the player walks faster than gravity pulls him down (I set it to 0 when he is on the ground), he detaches from the slope, which obviously is not desirable.

I've considered and tested several ways to fix this. One idea that I had was to check if there was ground below the character once he moved in the xz-direction, with a distance less than or equal to to the magnitude of that vector because I decided that a 45º slope was what the character could not walk up. That had a huge amount of problems and resulted in a lot of teleporting.

Then I tried to make it so when the player was on the ground that a really high gravity would be applied to keep him on the slope. This also didn't work because if the character was on the ground and then moved over a cliff, he was on the ground before he walked over the cliff he would be teleported down.

I'm really not sure how to progress here because logically the problem has stumped me. I took a look at some of the behavior of the Unreal character and it doesn't seem to suffer from any of these problems and it uses PhysX, so obviously they found a solution.

If anyone has any ideas, I would appreciate it.

Thanks

\$\endgroup\$

1 Answer 1

3
\$\begingroup\$

For anyone who hits this problem in the future, a possible solution is to implement a "surface follower". It's one of those special-case movement things that will save you a lot of heartache to know about.

Instead of relying on physics to handle slopes, you branch into your surface following code, which uses e.g. a PhysX world collision raycast to find the ground directly beneath the mover. It then snaps the follower's position to the ground it hits, if the hit point is within a set threshold. If the surface is too far below the character, put them into "falling mode", and let them fall until their capsule hits the ground (i.e. don't snap to surface as soon as it gets to the threshold).

The length of the raycast should be long enough such that stairs and slopes within desired steepness should not be detected as causing "falling mode".

By having this special-case code, your game is now much more tuneable, because you can pick hard numbers for how steep slopes can be, and reliably see following on those slopes.

Surface followers are useful even in 2D, where small boundaries between collision objects can cause hitching.

\$\endgroup\$
1
  • 1
    \$\begingroup\$ Wouldn't it be more stable to use a volume as a sensor under the character? This was mentioned in the presentation about the game "Overgrowth". A ray would cause the character to enter a falling state if its center ever so slightly off an edge, but the rest of its collision volume still collides with the edge. The character would pretend to be falling while not actually moving. Or imagine a grate floor. A ray test would cause the character to constantly switch between falling and standing despite never being in a situation where it can fall. \$\endgroup\$
    – Tara
    Feb 24, 2022 at 12:28

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .