diff options
Diffstat (limited to 'extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp')
-rw-r--r-- | extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp index 911b5072394..222f9006687 100644 --- a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp +++ b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp @@ -78,6 +78,7 @@ void btRigidBody::setupRigidBody(const btRigidBody::btRigidBodyConstructionInfo& //moved to btCollisionObject m_friction = constructionInfo.m_friction; + m_rollingFriction = constructionInfo.m_rollingFriction; m_restitution = constructionInfo.m_restitution; setCollisionShape( constructionInfo.m_collisionShape ); @@ -250,13 +251,29 @@ void btRigidBody::setMassProps(btScalar mass, const btVector3& inertia) } - void btRigidBody::updateInertiaTensor() { m_invInertiaTensorWorld = m_worldTransform.getBasis().scaled(m_invInertiaLocal) * m_worldTransform.getBasis().transpose(); } +btVector3 btRigidBody::computeGyroscopicForce(btScalar maxGyroscopicForce) const +{ + btVector3 inertiaLocal; + inertiaLocal[0] = 1.f/getInvInertiaDiagLocal()[0]; + inertiaLocal[1] = 1.f/getInvInertiaDiagLocal()[1]; + inertiaLocal[2] = 1.f/getInvInertiaDiagLocal()[2]; + btMatrix3x3 inertiaTensorWorld = getWorldTransform().getBasis().scaled(inertiaLocal) * getWorldTransform().getBasis().transpose(); + btVector3 tmp = inertiaTensorWorld*getAngularVelocity(); + btVector3 gf = getAngularVelocity().cross(tmp); + btScalar l2 = gf.length2(); + if (l2>maxGyroscopicForce*maxGyroscopicForce) + { + gf *= btScalar(1.)/btSqrt(l2)*maxGyroscopicForce; + } + return gf; +} + void btRigidBody::integrateVelocities(btScalar step) { if (isStaticOrKinematicObject()) @@ -300,15 +317,15 @@ void btRigidBody::setCenterOfMassTransform(const btTransform& xform) } -bool btRigidBody::checkCollideWithOverride(btCollisionObject* co) +bool btRigidBody::checkCollideWithOverride(const btCollisionObject* co) const { - btRigidBody* otherRb = btRigidBody::upcast(co); + const btRigidBody* otherRb = btRigidBody::upcast(co); if (!otherRb) return true; for (int i = 0; i < m_constraintRefs.size(); ++i) { - btTypedConstraint* c = m_constraintRefs[i]; + const btTypedConstraint* c = m_constraintRefs[i]; if (c->isEnabled()) if (&c->getRigidBodyA() == otherRb || &c->getRigidBodyB() == otherRb) return false; @@ -317,26 +334,6 @@ bool btRigidBody::checkCollideWithOverride(btCollisionObject* co) return true; } -void btRigidBody::internalWritebackVelocity(btScalar timeStep) -{ - (void) timeStep; - if (m_inverseMass) - { - setLinearVelocity(getLinearVelocity()+ m_deltaLinearVelocity); - setAngularVelocity(getAngularVelocity()+m_deltaAngularVelocity); - - //correct the position/orientation based on push/turn recovery - btTransform newTransform; - btTransformUtil::integrateTransform(getWorldTransform(),m_pushVelocity,m_turnVelocity,timeStep,newTransform); - setWorldTransform(newTransform); - //m_originalBody->setCompanionId(-1); - } -// m_deltaLinearVelocity.setZero(); -// m_deltaAngularVelocity .setZero(); -// m_pushVelocity.setZero(); -// m_turnVelocity.setZero(); -} - void btRigidBody::addConstraintRef(btTypedConstraint* c) |