I know you said you might not need a full blown character controller, but what you’re talking about is basically just that . And it’s not easy to get right, so you might be interested in this:
[New Bullet Character Controller)
Basically character controllers are a very special case of objects. They’re a bit of a no-man’s land. Kinematic objects normally don’t react to static environment and other kinematic objects in any way, because they’re meant to be animated with the engine’s intervals system. It’s the animator’s job to make sure stuff doesn’t sink into statics, while the physics engine makes sure dynamics can be pushed around by or attached (with joints) to kinematics. With character controllers that’s not enough because you can’t predict the movement.
On the other hand, stuff that does react to static environment is dynamic objects, but it’s extremely hard to make a dynamic character controller for reasons I’ve talked about numerous times before.
Thus you just need to handle all collisions by yourself.
Yep, that is indeed an interesting problem. Direction is not such a big deal, because all you need to do is wrap the capsule with a box. I might add that to my Bullet KCC as an option. You might also need masks for that, but in any case that way you can use the capsule for static collisions (thus providing smooth movement) and the box for dynamic collisions (with more controllable pushing behavior).
The mass handling is a bigger problem. I have that on my todo list, because one thing I hate in games is the player character acting like a bull in a china shop, flipping everything over and moving furniture around for no reason. At the same time, it’s nonsense to not use physics just because the KCC is spoiled like that.
This should be possible to fix by modifying the char’s speed based on the mass of the dynamics it collides with. The tricky part is doing that at the right time – otherwise the dynamic stuff will move before we can alter the speed. Sweep tests? Maybe.
Speaking about sweep tests, it would be nice to have one that returns all objects it collided with, instead of just the first.