From 98d27ad2b53656da0f2b38761f6720d2a0dc45df Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 14 Aug 2014 15:17:03 -0700 Subject: [PATCH] more correct names for ContactPoint API renamed (and disabled) the useless enforce() to applyFriction() changed the buildConstraints() method to more correct name: enforce() will eventually change how ContactPoint actually works, but later --- libraries/shared/src/ContactPoint.cpp | 39 ++++++++++++---------- libraries/shared/src/ContactPoint.h | 4 +-- libraries/shared/src/PhysicsSimulation.cpp | 24 ++++++------- libraries/shared/src/PhysicsSimulation.h | 4 +-- 4 files changed, 37 insertions(+), 34 deletions(-) diff --git a/libraries/shared/src/ContactPoint.cpp b/libraries/shared/src/ContactPoint.cpp index 4c1cf7b842..4f1cf87da5 100644 --- a/libraries/shared/src/ContactPoint.cpp +++ b/libraries/shared/src/ContactPoint.cpp @@ -88,25 +88,7 @@ ContactPoint::ContactPoint(const CollisionInfo& collision, quint32 frame) : } } -// virtual float ContactPoint::enforce() { - for (int i = 0; i < _numPoints; ++i) { - glm::vec3& position = _points[i]->_position; - // TODO: use a fast distance approximation - float newDistance = glm::distance(_contactPoint, position); - float constrainedDistance = _distances[i]; - // NOTE: these "distance" constraints only push OUT, don't pull IN. - if (newDistance > EPSILON && newDistance < constrainedDistance) { - glm::vec3 direction = (_contactPoint - position) / newDistance; - glm::vec3 center = 0.5f * (_contactPoint + position); - _contactPoint = center + (0.5f * constrainedDistance) * direction; - position = center - (0.5f * constrainedDistance) * direction; - } - } - return 0.0f; -} - -void ContactPoint::buildConstraints() { glm::vec3 pointA = _shapeA->getTranslation() + _offsetA; glm::vec3 pointB = _shapeB->getTranslation() + _offsetB; glm::vec3 penetration = pointA - pointB; @@ -153,6 +135,27 @@ void ContactPoint::buildConstraints() { _distances[i] = glm::length(glm::length(_offsets[i])); } } + return 0.0f; +} + +// virtual +void ContactPoint::applyFriction() { + // TODO: Andrew to re-implement this + /* + for (int i = 0; i < _numPoints; ++i) { + glm::vec3& position = _points[i]->_position; + // TODO: use a fast distance approximation + float newDistance = glm::distance(_contactPoint, position); + float constrainedDistance = _distances[i]; + // NOTE: these "distance" constraints only push OUT, don't pull IN. + if (newDistance > EPSILON && newDistance < constrainedDistance) { + glm::vec3 direction = (_contactPoint - position) / newDistance; + glm::vec3 center = 0.5f * (_contactPoint + position); + _contactPoint = center + (0.5f * constrainedDistance) * direction; + position = center - (0.5f * constrainedDistance) * direction; + } + } + */ } void ContactPoint::updateContact(const CollisionInfo& collision, quint32 frame) { diff --git a/libraries/shared/src/ContactPoint.h b/libraries/shared/src/ContactPoint.h index 5257fabee0..d584945970 100644 --- a/libraries/shared/src/ContactPoint.h +++ b/libraries/shared/src/ContactPoint.h @@ -26,8 +26,8 @@ public: ContactPoint(const CollisionInfo& collision, quint32 frame); virtual float enforce(); - - void buildConstraints(); + + void applyFriction(); void updateContact(const CollisionInfo& collision, quint32 frame); quint32 getLastFrame() const { return _lastFrame; } diff --git a/libraries/shared/src/PhysicsSimulation.cpp b/libraries/shared/src/PhysicsSimulation.cpp index 84f8282c9d..a62b3816af 100644 --- a/libraries/shared/src/PhysicsSimulation.cpp +++ b/libraries/shared/src/PhysicsSimulation.cpp @@ -195,7 +195,7 @@ void PhysicsSimulation::stepForward(float deltaTime, float minError, int maxIter quint64 expiry = startTime + maxUsec; moveRagdolls(deltaTime); - buildContactConstraints(); + enforceContacts(); int numDolls = _otherRagdolls.size(); { PerformanceTimer perfTimer("enforce"); @@ -219,7 +219,7 @@ void PhysicsSimulation::stepForward(float deltaTime, float minError, int maxIter error = glm::max(error, _otherRagdolls[i]->enforceConstraints()); } } - enforceContactConstraints(); + applyContactFriction(); ++iterations; now = usecTimestampNow(); @@ -288,16 +288,7 @@ void PhysicsSimulation::resolveCollisions() { } } -void PhysicsSimulation::buildContactConstraints() { - PerformanceTimer perfTimer("contacts"); - QMap::iterator itr = _contacts.begin(); - while (itr != _contacts.end()) { - itr.value().buildConstraints(); - ++itr; - } -} - -void PhysicsSimulation::enforceContactConstraints() { +void PhysicsSimulation::enforceContacts() { PerformanceTimer perfTimer("contacts"); QMap::iterator itr = _contacts.begin(); while (itr != _contacts.end()) { @@ -306,6 +297,15 @@ void PhysicsSimulation::enforceContactConstraints() { } } +void PhysicsSimulation::applyContactFriction() { + PerformanceTimer perfTimer("contacts"); + QMap::iterator itr = _contacts.begin(); + while (itr != _contacts.end()) { + itr.value().applyFriction(); + ++itr; + } +} + void PhysicsSimulation::updateContacts() { PerformanceTimer perfTimer("contacts"); int numCollisions = _collisions.size(); diff --git a/libraries/shared/src/PhysicsSimulation.h b/libraries/shared/src/PhysicsSimulation.h index 61ab1bf177..881007208b 100644 --- a/libraries/shared/src/PhysicsSimulation.h +++ b/libraries/shared/src/PhysicsSimulation.h @@ -56,8 +56,8 @@ protected: void computeCollisions(); void resolveCollisions(); - void buildContactConstraints(); - void enforceContactConstraints(); + void enforceContacts(); + void applyContactFriction(); void updateContacts(); void pruneContacts();