fixes in btConeTwistConstraint, check for btFuzzyZero instead of zero to avoid instability.

This commit is contained in:
erwin.coumans
2009-02-20 00:53:24 +00:00
parent 8acadeb711
commit a95d0e638e
2 changed files with 7 additions and 6 deletions

View File

@@ -184,6 +184,7 @@ void btConeTwistConstraint::getInfo2 (btConstraintInfo2* info)
J2[srow+1] = -ax1[1]; J2[srow+1] = -ax1[1];
J2[srow+2] = -ax1[2]; J2[srow+2] = -ax1[2];
btScalar k = info->fps * m_biasFactor; btScalar k = info->fps * m_biasFactor;
info->m_constraintError[srow] = k * m_swingCorrection; info->m_constraintError[srow] = k * m_swingCorrection;
info->cfm[srow] = 0.0f; info->cfm[srow] = 0.0f;
// m_swingCorrection is always positive or 0 // m_swingCorrection is always positive or 0
@@ -659,7 +660,7 @@ void btConeTwistConstraint::calcAngleInfo2()
btScalar z = ivB.dot(kvA); btScalar z = ivB.dot(kvA);
if((m_swingSpan1 < m_fixThresh) && (m_swingSpan2 < m_fixThresh)) if((m_swingSpan1 < m_fixThresh) && (m_swingSpan2 < m_fixThresh))
{ // fixed. We'll need to add one more row to constraint { // fixed. We'll need to add one more row to constraint
if((y != btScalar(0.f)) || (z != btScalar(0.f))) if((!btFuzzyZero(y)) || (!(btFuzzyZero(z))))
{ {
m_solveSwingLimit = true; m_solveSwingLimit = true;
m_swingAxis = -ivB.cross(ivA); m_swingAxis = -ivB.cross(ivA);
@@ -669,7 +670,7 @@ void btConeTwistConstraint::calcAngleInfo2()
{ {
if(m_swingSpan1 < m_fixThresh) if(m_swingSpan1 < m_fixThresh)
{ // hinge around Y axis { // hinge around Y axis
if(y != btScalar(0.f)) if(!(btFuzzyZero(y)))
{ {
m_solveSwingLimit = true; m_solveSwingLimit = true;
if(m_swingSpan2 >= m_fixThresh) if(m_swingSpan2 >= m_fixThresh)
@@ -691,7 +692,7 @@ void btConeTwistConstraint::calcAngleInfo2()
} }
else else
{ // hinge around Z axis { // hinge around Z axis
if(z != btScalar(0.f)) if(!btFuzzyZero(z))
{ {
m_solveSwingLimit = true; m_solveSwingLimit = true;
if(m_swingSpan1 >= m_fixThresh) if(m_swingSpan1 >= m_fixThresh)

View File

@@ -122,7 +122,7 @@ public:
{ {
case 3: case 3:
{ {
m_swingSpan1 = limitValue; m_twistSpan = limitValue;
break; break;
} }
case 4: case 4:
@@ -132,7 +132,7 @@ public:
} }
case 5: case 5:
{ {
m_twistSpan = limitValue; m_swingSpan1 = limitValue;
break; break;
} }
default: default:
@@ -141,7 +141,7 @@ public:
}; };
} }
void setLimit(btScalar _swingSpan1,btScalar _swingSpan2,btScalar _twistSpan, btScalar _softness = 0.8f, btScalar _biasFactor = 0.3f, btScalar _relaxationFactor = 1.0f) void setLimit(btScalar _swingSpan1,btScalar _swingSpan2,btScalar _twistSpan, btScalar _softness = 1.f, btScalar _biasFactor = 0.3f, btScalar _relaxationFactor = 1.0f)
{ {
m_swingSpan1 = _swingSpan1; m_swingSpan1 = _swingSpan1;
m_swingSpan2 = _swingSpan2; m_swingSpan2 = _swingSpan2;