Changeset 8393 for code/trunk/src/external/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
- Timestamp:
- May 3, 2011, 5:07:42 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/external/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
r8351 r8393 69 69 #include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h" 70 70 71 #define ASSERT2 btAssert72 71 73 #define USE_INTERNAL_APPLY_IMPULSE 1 72 73 //response between two dynamic objects without friction, assuming 0 penetration depth 74 btScalar resolveSingleCollision( 75 btRigidBody* body1, 76 btCollisionObject* colObj2, 77 const btVector3& contactPositionWorld, 78 const btVector3& contactNormalOnB, 79 const btContactSolverInfo& solverInfo, 80 btScalar distance) 81 { 82 btRigidBody* body2 = btRigidBody::upcast(colObj2); 83 84 85 const btVector3& normal = contactNormalOnB; 86 87 btVector3 rel_pos1 = contactPositionWorld - body1->getWorldTransform().getOrigin(); 88 btVector3 rel_pos2 = contactPositionWorld - colObj2->getWorldTransform().getOrigin(); 89 90 btVector3 vel1 = body1->getVelocityInLocalPoint(rel_pos1); 91 btVector3 vel2 = body2? body2->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0); 92 btVector3 vel = vel1 - vel2; 93 btScalar rel_vel; 94 rel_vel = normal.dot(vel); 95 96 btScalar combinedRestitution = body1->getRestitution() * colObj2->getRestitution(); 97 btScalar restitution = combinedRestitution* -rel_vel; 98 99 btScalar positionalError = solverInfo.m_erp *-distance /solverInfo.m_timeStep ; 100 btScalar velocityError = -(1.0f + restitution) * rel_vel;// * damping; 101 btScalar denom0 = body1->computeImpulseDenominator(contactPositionWorld,normal); 102 btScalar denom1 = body2? body2->computeImpulseDenominator(contactPositionWorld,normal) : 0.f; 103 btScalar relaxation = 1.f; 104 btScalar jacDiagABInv = relaxation/(denom0+denom1); 105 106 btScalar penetrationImpulse = positionalError * jacDiagABInv; 107 btScalar velocityImpulse = velocityError * jacDiagABInv; 108 109 btScalar normalImpulse = penetrationImpulse+velocityImpulse; 110 normalImpulse = 0.f > normalImpulse ? 0.f: normalImpulse; 111 112 body1->applyImpulse(normal*(normalImpulse), rel_pos1); 113 if (body2) 114 body2->applyImpulse(-normal*(normalImpulse), rel_pos2); 115 116 return normalImpulse; 117 } 74 118 75 119 … … 84 128 85 129 btScalar normalLenSqr = normal.length2(); 86 ASSERT2(btFabs(normalLenSqr) < btScalar(1.1));130 btAssert(btFabs(normalLenSqr) < btScalar(1.1)); 87 131 if (normalLenSqr > btScalar(1.1)) 88 132 {
Note: See TracChangeset
for help on using the changeset viewer.