Merge pull request #4403 from AndrewMeadows/thermonuclear

fix crash: avoid assert for zero-length character velocity
This commit is contained in:
Brad Hefta-Gaub 2015-03-09 20:56:42 -07:00
commit d662c30405

View file

@ -290,8 +290,15 @@ void PhysicsEngine::stepSimulation() {
if (_avatarData->isPhysicsEnabled()) {
_avatarGhostObject->setWorldTransform(btTransform(glmToBullet(_avatarData->getOrientation()),
glmToBullet(_avatarData->getPosition())));
// _characterController->setWalkDirection(glmToBullet(_avatarData->getVelocity()));
_characterController->setVelocityForTimeInterval(glmToBullet(_avatarData->getVelocity()), timeStep);
// WORKAROUND: there is a bug in the debug Bullet-2.82 libs where a zero length walk velocity will trigger
// an assert when the getNormalizedVector() helper function in btKinematicCharacterController.cpp tries to
// first normalize a vector before checking its length. Here we workaround the problem by checking the
// length first. NOTE: the character's velocity is reset to zero after each step, so when we DON'T set
// the velocity for this time interval it is the same thing as setting its velocity to zero.
btVector3 walkVelocity = glmToBullet(_avatarData->getVelocity());
if (walkVelocity.length2() > FLT_EPSILON * FLT_EPSILON) {
_characterController->setVelocityForTimeInterval(walkVelocity, timeStep);
}
}
// This is step (2).
@ -609,11 +616,11 @@ void PhysicsEngine::setAvatarData(AvatarData *avatarData) {
glmToBullet(_avatarData->getPosition())));
// XXX these values should be computed from the character model.
btScalar characterHeight = 1.75;
btScalar characterWidth = 1.75;
btScalar characterRadius = 0.3;
btScalar characterHeight = 1.75 - 2.0f * characterRadius;
btScalar stepHeight = btScalar(0.35);
btConvexShape* capsule = new btCapsuleShape(characterWidth, characterHeight);
btConvexShape* capsule = new btCapsuleShape(characterRadius, characterHeight);
_avatarGhostObject->setCollisionShape(capsule);
_avatarGhostObject->setCollisionFlags(btCollisionObject::CF_CHARACTER_OBJECT);