Implemented constraint damping, as requested in Issue 416
Thanks Mark for the feedback
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 = ¤tConstraintRow->m_rhs;
|
info2.m_constraintError = ¤tConstraintRow->m_rhs;
|
||||||
currentConstraintRow->m_cfm = infoGlobal.m_globalCfm;
|
currentConstraintRow->m_cfm = infoGlobal.m_globalCfm;
|
||||||
|
info2.m_damping = infoGlobal.m_damping;
|
||||||
info2.cfm = ¤tConstraintRow->m_cfm;
|
info2.cfm = ¤tConstraintRow->m_cfm;
|
||||||
info2.m_lowerLimit = ¤tConstraintRow->m_lowerLimit;
|
info2.m_lowerLimit = ¤tConstraintRow->m_lowerLimit;
|
||||||
info2.m_upperLimit = ¤tConstraintRow->m_upperLimit;
|
info2.m_upperLimit = ¤tConstraintRow->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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user