예제 #1
0
bool dgDynamicBody::IsInEquilibrium() const
{
	if (m_equilibrium) {
		dgVector deltaAccel((m_accel - m_prevExternalForce).Scale4(m_invMass.m_w));
		dgAssert(deltaAccel.m_w == 0.0f);
		dgFloat32 deltaAccel2 = deltaAccel.DotProduct4(deltaAccel).GetScalar();
		if (deltaAccel2 > DG_ErrTolerance2) {
			return false;
		}
		dgVector netAccel(m_netForce.Scale4(m_invMass.m_w));
		dgAssert(netAccel.m_w == 0.0f);
		dgFloat32 netAccel2 = deltaAccel.DotProduct4(deltaAccel).GetScalar();
		if (netAccel2 > DG_ErrTolerance2) {
			return false;
		}

		dgVector deltaAlpha(m_matrix.UnrotateVector(m_alpha - m_prevExternalTorque).CompProduct4(m_invMass));
		dgAssert(deltaAlpha.m_w == 0.0f);
		dgFloat32 deltaAlpha2 = deltaAlpha.DotProduct4(deltaAlpha).GetScalar();
		if (deltaAlpha2 > DG_ErrTolerance2) {
			return false;
		}

		dgVector netAlpha(m_matrix.UnrotateVector(m_alpha - m_prevExternalTorque).CompProduct4(m_invMass));
		dgAssert(netAlpha.m_w == 0.0f);
		dgFloat32 netAlpha2 = netAlpha.DotProduct4(netAlpha).GetScalar();
		if (netAlpha2 > DG_ErrTolerance2) {
			return false;
		}
		return true;
	}
	return false;
}
예제 #2
0
bool dgDynamicBody::IsInEquilibrium() const
{
	if (m_equilibrium) {
		dgVector deltaAccel((m_externalForce - m_savedExternalForce).Scale(m_invMass.m_w));
		dgAssert(deltaAccel.m_w == dgFloat32 (0.0f));
		dgFloat32 deltaAccel2 = deltaAccel.DotProduct(deltaAccel).GetScalar();
		if (deltaAccel2 > DG_ERR_TOLERANCE2) {
			return false;
		}
		dgVector deltaAlpha(m_matrix.UnrotateVector(m_externalTorque - m_savedExternalTorque) * m_invMass);
		dgAssert(deltaAlpha.m_w == dgFloat32 (0.0f));
		dgFloat32 deltaAlpha2 = deltaAlpha.DotProduct(deltaAlpha).GetScalar();
		if (deltaAlpha2 > DG_ERR_TOLERANCE2) {
			return false;
		}
		return true;
	}
	return false;
}