From 81426293e02d441f0bbefde7712955ceb8c93003 Mon Sep 17 00:00:00 2001 From: Daniel Chappuis Date: Sun, 16 Oct 2016 23:18:42 +0200 Subject: [PATCH] Remove unused variables in contact solver --- src/constraint/ContactPoint.cpp | 5 +- src/constraint/ContactPoint.h | 92 --------------------------------- src/engine/ContactSolver.cpp | 58 +++------------------ src/engine/ContactSolver.h | 42 ++------------- 4 files changed, 11 insertions(+), 186 deletions(-) diff --git a/src/constraint/ContactPoint.cpp b/src/constraint/ContactPoint.cpp index 3be8476a..c0d567ea 100644 --- a/src/constraint/ContactPoint.cpp +++ b/src/constraint/ContactPoint.cpp @@ -45,9 +45,6 @@ ContactPoint::ContactPoint(const ContactPointInfo& contactInfo) contactInfo.localPoint2), mIsRestingContact(false) { - mFrictionVectors[0] = Vector3(0, 0, 0); - mFrictionVectors[1] = Vector3(0, 0, 0); - - assert(mPenetrationDepth > 0.0); + assert(mPenetrationDepth > decimal(0.0)); } diff --git a/src/constraint/ContactPoint.h b/src/constraint/ContactPoint.h index d2e8f189..18be17b0 100644 --- a/src/constraint/ContactPoint.h +++ b/src/constraint/ContactPoint.h @@ -128,21 +128,9 @@ class ContactPoint { /// True if the contact is a resting contact (exists for more than one time step) bool mIsRestingContact; - /// Two orthogonal vectors that span the tangential friction plane - Vector3 mFrictionVectors[2]; - /// Cached penetration impulse decimal mPenetrationImpulse; - /// Cached first friction impulse - decimal mFrictionImpulse1; - - /// Cached second friction impulse - decimal mFrictionImpulse2; - - /// Cached rolling resistance impulse - Vector3 mRollingResistanceImpulse; - public : // -------------------- Methods -------------------- // @@ -186,27 +174,9 @@ class ContactPoint { /// Return the cached penetration impulse decimal getPenetrationImpulse() const; - /// Return the cached first friction impulse - decimal getFrictionImpulse1() const; - - /// Return the cached second friction impulse - decimal getFrictionImpulse2() const; - - /// Return the cached rolling resistance impulse - Vector3 getRollingResistanceImpulse() const; - /// Set the cached penetration impulse void setPenetrationImpulse(decimal impulse); - /// Set the first cached friction impulse - void setFrictionImpulse1(decimal impulse); - - /// Set the second cached friction impulse - void setFrictionImpulse2(decimal impulse); - - /// Set the cached rolling resistance impulse - void setRollingResistanceImpulse(const Vector3& impulse); - /// Set the contact world point on body 1 void setWorldPointOnBody1(const Vector3& worldPoint); @@ -219,18 +189,6 @@ class ContactPoint { /// Set the mIsRestingContact variable void setIsRestingContact(bool isRestingContact); - /// Get the first friction vector - Vector3 getFrictionVector1() const; - - /// Set the first friction vector - void setFrictionVector1(const Vector3& frictionVector1); - - /// Get the second friction vector - Vector3 getFrictionVector2() const; - - /// Set the second friction vector - void setFrictionVector2(const Vector3& frictionVector2); - /// Return the penetration depth decimal getPenetrationDepth() const; @@ -283,41 +241,11 @@ inline decimal ContactPoint::getPenetrationImpulse() const { return mPenetrationImpulse; } -// Return the cached first friction impulse -inline decimal ContactPoint::getFrictionImpulse1() const { - return mFrictionImpulse1; -} - -// Return the cached second friction impulse -inline decimal ContactPoint::getFrictionImpulse2() const { - return mFrictionImpulse2; -} - -// Return the cached rolling resistance impulse -inline Vector3 ContactPoint::getRollingResistanceImpulse() const { - return mRollingResistanceImpulse; -} - // Set the cached penetration impulse inline void ContactPoint::setPenetrationImpulse(decimal impulse) { mPenetrationImpulse = impulse; } -// Set the first cached friction impulse -inline void ContactPoint::setFrictionImpulse1(decimal impulse) { - mFrictionImpulse1 = impulse; -} - -// Set the second cached friction impulse -inline void ContactPoint::setFrictionImpulse2(decimal impulse) { - mFrictionImpulse2 = impulse; -} - -// Set the cached rolling resistance impulse -inline void ContactPoint::setRollingResistanceImpulse(const Vector3& impulse) { - mRollingResistanceImpulse = impulse; -} - // Set the contact world point on body 1 inline void ContactPoint::setWorldPointOnBody1(const Vector3& worldPoint) { mWorldPointOnBody1 = worldPoint; @@ -338,26 +266,6 @@ inline void ContactPoint::setIsRestingContact(bool isRestingContact) { mIsRestingContact = isRestingContact; } -// Get the first friction vector -inline Vector3 ContactPoint::getFrictionVector1() const { - return mFrictionVectors[0]; -} - -// Set the first friction vector -inline void ContactPoint::setFrictionVector1(const Vector3& frictionVector1) { - mFrictionVectors[0] = frictionVector1; -} - -// Get the second friction vector -inline Vector3 ContactPoint::getFrictionVector2() const { - return mFrictionVectors[1]; -} - -// Set the second friction vector -inline void ContactPoint::setFrictionVector2(const Vector3& frictionVector2) { - mFrictionVectors[1] = frictionVector2; -} - // Return the penetration depth of the contact inline decimal ContactPoint::getPenetrationDepth() const { return mPenetrationDepth; diff --git a/src/engine/ContactSolver.cpp b/src/engine/ContactSolver.cpp index b4e28aaa..34e86472 100644 --- a/src/engine/ContactSolver.cpp +++ b/src/engine/ContactSolver.cpp @@ -134,15 +134,12 @@ void ContactSolver::initializeForIsland(Island* island) { mContactConstraints[mNbContactManifolds].massInverseBody1 = body1->mMassInverse; mContactConstraints[mNbContactManifolds].massInverseBody2 = body2->mMassInverse; mContactConstraints[mNbContactManifolds].nbContacts = externalManifold->getNbContactPoints(); - mContactConstraints[mNbContactManifolds].restitutionFactor = computeMixedRestitutionFactor(body1, body2); mContactConstraints[mNbContactManifolds].frictionCoefficient = computeMixedFrictionCoefficient(body1, body2); mContactConstraints[mNbContactManifolds].rollingResistanceFactor = computeMixedRollingResistance(body1, body2); mContactConstraints[mNbContactManifolds].externalContactManifold = externalManifold; - mContactConstraints[mNbContactManifolds].isBody1DynamicType = body1->getType() == BodyType::DYNAMIC; - mContactConstraints[mNbContactManifolds].isBody2DynamicType = body2->getType() == BodyType::DYNAMIC; mContactConstraints[mNbContactManifolds].normal.setToZero(); - mContactConstraints[mNbContactManifolds].frictionPointBody1 = Vector3::zero(); - mContactConstraints[mNbContactManifolds].frictionPointBody2 = Vector3::zero(); + mContactConstraints[mNbContactManifolds].frictionPointBody1.setToZero(); + mContactConstraints[mNbContactManifolds].frictionPointBody2.setToZero(); // Get the velocities of the bodies const Vector3& v1 = mLinearVelocities[mContactConstraints[mNbContactManifolds].indexBody1]; @@ -168,13 +165,8 @@ void ContactSolver::initializeForIsland(Island* island) { mContactPoints[mNbContactPoints].penetrationDepth = externalContact->getPenetrationDepth(); mContactPoints[mNbContactPoints].isRestingContact = externalContact->getIsRestingContact(); externalContact->setIsRestingContact(true); - mContactPoints[mNbContactPoints].oldFrictionVector1 = externalContact->getFrictionVector1(); - mContactPoints[mNbContactPoints].oldFrictionVector2 = externalContact->getFrictionVector2(); mContactPoints[mNbContactPoints].penetrationImpulse = externalContact->getPenetrationImpulse(); mContactPoints[mNbContactPoints].penetrationSplitImpulse = 0.0; - mContactPoints[mNbContactPoints].friction1Impulse = externalContact->getFrictionImpulse1(); - mContactPoints[mNbContactPoints].friction2Impulse = externalContact->getFrictionImpulse2(); - mContactPoints[mNbContactPoints].rollingResistanceImpulse = externalContact->getRollingResistanceImpulse(); mContactConstraints[mNbContactManifolds].frictionPointBody1 += p1; mContactConstraints[mNbContactManifolds].frictionPointBody2 += p2; @@ -197,8 +189,9 @@ void ContactSolver::initializeForIsland(Island* island) { // velocity bellow a given threshold), we do not add a restitution velocity bias mContactPoints[mNbContactPoints].restitutionBias = 0.0; decimal deltaVDotN = deltaV.dot(mContactPoints[mNbContactPoints].normal); + const decimal restitutionFactor = computeMixedRestitutionFactor(body1, body2); if (deltaVDotN < -RESTITUTION_VELOCITY_THRESHOLD) { - mContactPoints[mNbContactPoints].restitutionBias = mContactConstraints[mNbContactManifolds].restitutionFactor * deltaVDotN; + mContactPoints[mNbContactPoints].restitutionBias = restitutionFactor * deltaVDotN; } mContactConstraints[mNbContactManifolds].normal += mContactPoints[mNbContactPoints].normal; @@ -219,8 +212,10 @@ void ContactSolver::initializeForIsland(Island* island) { mContactConstraints[mNbContactManifolds].frictionTwistImpulse = externalManifold->getFrictionTwistImpulse(); // Compute the inverse K matrix for the rolling resistance constraint + bool isBody1DynamicType = body1->getType() == BodyType::DYNAMIC; + bool isBody2DynamicType = body2->getType() == BodyType::DYNAMIC; mContactConstraints[mNbContactManifolds].inverseRollingResistance.setToZero(); - if (mContactConstraints[mNbContactManifolds].rollingResistanceFactor > 0 && (mContactConstraints[mNbContactManifolds].isBody1DynamicType || mContactConstraints[mNbContactManifolds].isBody2DynamicType)) { + if (mContactConstraints[mNbContactManifolds].rollingResistanceFactor > 0 && (isBody1DynamicType || isBody2DynamicType)) { mContactConstraints[mNbContactManifolds].inverseRollingResistance = mContactConstraints[mNbContactManifolds].inverseInertiaTensorBody1 + mContactConstraints[mNbContactManifolds].inverseInertiaTensorBody2; mContactConstraints[mNbContactManifolds].inverseRollingResistance = mContactConstraints[mNbContactManifolds].inverseRollingResistance.getInverse(); } @@ -296,9 +291,6 @@ void ContactSolver::warmStart() { // Initialize the accumulated impulses to zero mContactPoints[contactPointIndex].penetrationImpulse = 0.0; - mContactPoints[contactPointIndex].friction1Impulse = 0.0; - mContactPoints[contactPointIndex].friction2Impulse = 0.0; - mContactPoints[contactPointIndex].rollingResistanceImpulse = Vector3::zero(); } contactPointIndex++; @@ -594,12 +586,6 @@ void ContactSolver::storeImpulses() { for (short int i=0; isetPenetrationImpulse(mContactPoints[contactPointIndex].penetrationImpulse); - mContactPoints[contactPointIndex].externalContact->setFrictionImpulse1(mContactPoints[contactPointIndex].friction1Impulse); - mContactPoints[contactPointIndex].externalContact->setFrictionImpulse2(mContactPoints[contactPointIndex].friction2Impulse); - mContactPoints[contactPointIndex].externalContact->setRollingResistanceImpulse(mContactPoints[contactPointIndex].rollingResistanceImpulse); - - mContactPoints[contactPointIndex].externalContact->setFrictionVector1(mContactPoints[contactPointIndex].frictionVector1); - mContactPoints[contactPointIndex].externalContact->setFrictionVector2(mContactPoints[contactPointIndex].frictionVector2); contactPointIndex++; } @@ -613,36 +599,6 @@ void ContactSolver::storeImpulses() { } } -// Compute the two unit orthogonal vectors "t1" and "t2" that span the tangential friction plane -// for a contact point. The two vectors have to be such that : t1 x t2 = contactNormal. -void ContactSolver::computeFrictionVectors(const Vector3& deltaVelocity, - ContactPointSolver& contactPoint) const { - - assert(contactPoint.normal.length() > 0.0); - - // Compute the velocity difference vector in the tangential plane - Vector3 normalVelocity = deltaVelocity.dot(contactPoint.normal) * contactPoint.normal; - Vector3 tangentVelocity = deltaVelocity - normalVelocity; - - // If the velocty difference in the tangential plane is not zero - decimal lengthTangenVelocity = tangentVelocity.length(); - if (lengthTangenVelocity > MACHINE_EPSILON) { - - // Compute the first friction vector in the direction of the tangent - // velocity difference - contactPoint.frictionVector1 = tangentVelocity / lengthTangenVelocity; - } - else { - - // Get any orthogonal vector to the normal as the first friction vector - contactPoint.frictionVector1 = contactPoint.normal.getOneUnitOrthogonalVector(); - } - - // The second friction vector is computed by the cross product of the firs - // friction vector and the contact normal - contactPoint.frictionVector2 =contactPoint.normal.cross(contactPoint.frictionVector1).getUnit(); -} - // Compute the two unit orthogonal vectors "t1" and "t2" that span the tangential friction plane // for a contact manifold. The two vectors have to be such that : t1 x t2 = contactNormal. void ContactSolver::computeFrictionVectors(const Vector3& deltaVelocity, diff --git a/src/engine/ContactSolver.h b/src/engine/ContactSolver.h index e4e2710e..becd5529 100644 --- a/src/engine/ContactSolver.h +++ b/src/engine/ContactSolver.h @@ -122,33 +122,12 @@ class ContactSolver { /// Accumulated normal impulse decimal penetrationImpulse; - /// Accumulated impulse in the 1st friction direction - decimal friction1Impulse; - - /// Accumulated impulse in the 2nd friction direction - decimal friction2Impulse; - /// Accumulated split impulse for penetration correction decimal penetrationSplitImpulse; - /// Accumulated rolling resistance impulse - Vector3 rollingResistanceImpulse; - /// Normal vector of the contact Vector3 normal; - /// First friction vector in the tangent plane - Vector3 frictionVector1; - - /// Second friction vector in the tangent plane - Vector3 frictionVector2; - - /// Old first friction vector in the tangent plane - Vector3 oldFrictionVector1; - - /// Old second friction vector in the tangent plane - Vector3 oldFrictionVector2; - /// Vector from the body 1 center to the contact point Vector3 r1; @@ -188,11 +167,11 @@ class ContactSolver { /// Inverse of the matrix K for the 2nd friction decimal inverseFriction2Mass; - /// True if the contact was existing last time step - bool isRestingContact; - /// Pointer to the external contact ContactPoint* externalContact; + + /// True if the contact was existing last time step + bool isRestingContact; }; // Structure ContactManifoldSolver @@ -223,15 +202,6 @@ class ContactSolver { /// Number of contact points short int nbContacts; - /// True if the body 1 is of type dynamic - bool isBody1DynamicType; - - /// True if the body 2 is of type dynamic - bool isBody2DynamicType; - - /// Mix of the restitution factor for two bodies - decimal restitutionFactor; - /// Mix friction coefficient for the two bodies decimal frictionCoefficient; @@ -369,12 +339,6 @@ class ContactSolver { /// Compute th mixed rolling resistance factor between two bodies decimal computeMixedRollingResistance(RigidBody* body1, RigidBody* body2) const; - /// Compute the two unit orthogonal vectors "t1" and "t2" that span the tangential friction - /// plane for a contact point. The two vectors have to be - /// such that : t1 x t2 = contactNormal. - void computeFrictionVectors(const Vector3& deltaVelocity, - ContactPointSolver &contactPoint) const; - /// Compute the two unit orthogonal vectors "t1" and "t2" that span the tangential friction /// plane for a contact manifold. The two vectors have to be /// such that : t1 x t2 = contactNormal.