• 11
• 9
• 10
• 9
• 11

# climbing stairs and hills with bullet physics

This topic is 2045 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## 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 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:

 moveDirection = mvec3d(0,2,0); body->setLinearVelocity(body->getLinearVelocity() + moveDirection); 

##### 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:

 moveDirection = mvec3d(0,2,0); body->setLinearVelocity(body->getLinearVelocity() + moveDirection); 

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 on other sites

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

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 on other sites

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.

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