Sign in to follow this  
ic0de

climbing stairs and hills with bullet physics

Recommended Posts

I made a custom dynamic character controller in bullet physics. The problem is he cant climb stairs or hills. The character is based on a btMultiSphereShape and casts a ray down to find out what its standing on, if its on the ground and not walking its set to decelerate very quickly. Its moved around using setLinearVelocity. Works fine on flat surfaces. When it tries to climb stairs it just bumps into the bottom step, when it goes up a hill it moves a bit but doesn't seem to have enough energy behind it to go all the way up (needs more torque?).

Does anyone know how I can implement stair and hill climbing in bullet physics without using a kinematic character controller.

I'm sorry for not being very specific but I don't really know what I'm doing because bullet is such a badly documented api.

Thanks Edited by ic0de

Share this post


Link to post
Share on other sites
I think you maybe need to give it a little jump in order to climb. Try setting some small value upwards together with linear velocity, like this:

[CODE]
moveDirection = mvec3d(0,2,0);
body->setLinearVelocity(body->getLinearVelocity() + moveDirection);
[/CODE]

Share this post


Link to post
Share on other sites
[quote name='Freya' timestamp='1347659136' post='4980196']
I think you maybe need to give it a little jump in order to climb. Try setting some small value upwards together with linear velocity, like this:

[CODE]
moveDirection = mvec3d(0,2,0);
body->setLinearVelocity(body->getLinearVelocity() + moveDirection);
[/CODE]
[/quote]

Wow that works surprisingly well but it would probably be better if the upward velocity was only added when an incline was detected. Really if somehow I could get my controller to figure out the angle of what its standing on then all my problems could be solved.

Anyone know how to get the angle of the surface from a raycast?

Share this post


Link to post
Share on other sites
[quote name='ic0de' timestamp='1347664478' post='4980217']
Anyone know how to get the angle of the surface from a raycast?
[/quote]
The angle of the surface is fully encoded in its surface normal - wouldn't the raycast return the intersected object and hence its normal? You probably only care about the inclination angle (not the azimuth angle which exists in three dimensions, which describes which direction the surface is "pointing towards" horizontally - like a compass placed on a horizontal surface, if that makes sense). In two dimensions, it's simple - your inclination gradient is just rise over run -> normal.y / normal.x so the angle is arctan(normal.y / normal.x) with some trigonometry. In three dimensions, it's more complicated but you can convert your normal coordinates to spherical coordinates and extract the inclination angle (usually marked theta) and go from there. Edited by Bacterius

Share this post


Link to post
Share on other sites
[quote name='Bacterius' timestamp='1347724123' post='4980404']
In two dimensions, it's simple - your inclination gradient is just rise over run -> normal.y / normal.x so the angle is arctan(normal.y / normal.x) with some trigonometry.
[/quote]

Thanks for the math it's one area where I am somewhat lacking.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this