Implemented constraint damping, as requested in Issue 416

Thanks Mark for the feedback
This commit is contained in:
erwin.coumans
2010-08-24 21:12:32 +00:00
parent a022c9a555
commit 54c07ddac4
4 changed files with 7 additions and 2 deletions

View File

@@ -35,7 +35,7 @@ struct btContactSolverInfoData
btScalar m_tau; btScalar m_tau;
btScalar m_damping; btScalar m_damping;//global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'.
btScalar m_friction; btScalar m_friction;
btScalar m_timeStep; btScalar m_timeStep;
btScalar m_restitution; btScalar m_restitution;

View File

@@ -159,6 +159,7 @@ void btPoint2PointConstraint::getInfo2NonVirtual (btConstraintInfo2* info, const
info->m_upperLimit[j*info->rowskip] = impulseClamp; info->m_upperLimit[j*info->rowskip] = impulseClamp;
} }
} }
info->m_damping = m_setting.m_damping;
} }

View File

@@ -852,6 +852,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
btAssert(info2.rowskip*sizeof(btScalar)== sizeof(btSolverConstraint)); btAssert(info2.rowskip*sizeof(btScalar)== sizeof(btSolverConstraint));
info2.m_constraintError = &currentConstraintRow->m_rhs; info2.m_constraintError = &currentConstraintRow->m_rhs;
currentConstraintRow->m_cfm = infoGlobal.m_globalCfm; currentConstraintRow->m_cfm = infoGlobal.m_globalCfm;
info2.m_damping = infoGlobal.m_damping;
info2.cfm = &currentConstraintRow->m_cfm; info2.cfm = &currentConstraintRow->m_cfm;
info2.m_lowerLimit = &currentConstraintRow->m_lowerLimit; info2.m_lowerLimit = &currentConstraintRow->m_lowerLimit;
info2.m_upperLimit = &currentConstraintRow->m_upperLimit; info2.m_upperLimit = &currentConstraintRow->m_upperLimit;
@@ -899,7 +900,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
btScalar restitution = 0.f; btScalar restitution = 0.f;
btScalar positionalError = solverConstraint.m_rhs;//already filled in by getConstraintInfo2 btScalar positionalError = solverConstraint.m_rhs;//already filled in by getConstraintInfo2
btScalar velocityError = restitution - rel_vel;// * damping; btScalar velocityError = restitution - rel_vel * info2.m_damping;
btScalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv; btScalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
btScalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv; btScalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv;
solverConstraint.m_rhs = penetrationImpulse+velocityImpulse; solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;

View File

@@ -125,6 +125,9 @@ public:
int *findex; int *findex;
// number of solver iterations // number of solver iterations
int m_numIterations; int m_numIterations;
//damping of the velocity
btScalar m_damping;
}; };
///internal method used by the constraint solver, don't use them directly ///internal method used by the constraint solver, don't use them directly