more complete physics iteration for stability

This commit is contained in:
Andrew Meadows 2014-06-23 12:32:23 -07:00
parent add556719c
commit 3e0673418f
2 changed files with 31 additions and 24 deletions

View file

@ -10,6 +10,7 @@
//
#include <glm/glm.hpp>
#include <iostream>
#include "PhysicsSimulation.h"
@ -145,15 +146,41 @@ void PhysicsSimulation::removeRagdoll(Ragdoll* doll) {
// (10b) figure out how to slave dupe JointStates to physical shapes
// (11) add and enforce angular contraints for joints
void PhysicsSimulation::stepForward(float deltaTime, float minError, int maxIterations, quint64 maxUsec) {
quint64 startTime = usecTimestampNow();
quint64 now = usecTimestampNow();
quint64 startTime = now;
quint64 expiry = startTime + maxUsec;
moveRagdolls(deltaTime);
int numDolls = _dolls.size();
_numCollisions = 0;
int iterations = 0;
float error = 0.0f;
do {
computeCollisions();
processCollisions();
enforceConstraints(minError, maxIterations, expiry - usecTimestampNow());
// enforce constraints
error = 0.0f;
for (int i = 0; i < numDolls; ++i) {
error = glm::max(error, _dolls[i]->enforceRagdollConstraints());
}
++iterations;
now = usecTimestampNow();
} while (_numCollisions != 0 && (iterations < maxIterations) && (error > minError) && (now < expiry));
_numIterations = iterations;
_constraintError = error;
_stepTime = usecTimestampNow()- startTime;
#ifdef ANDREW_DEBUG
// temporary debug info for watching simulation performance
static int adebug = 0; ++adebug;
if (0 == (adebug % 100)) {
std::cout << "adebug Ni = " << _numIterations << " E = " << error << " t = " << _stepTime << std::endl; // adebug
}
#endif // ANDREW_DEBUG
}
void PhysicsSimulation::moveRagdolls(float deltaTime) {
@ -215,22 +242,3 @@ void PhysicsSimulation::processCollisions() {
++shapeItr;
}
}
void PhysicsSimulation::enforceConstraints(float minError, int maxIterations, quint64 maxUsec) {
quint64 now = usecTimestampNow();
quint64 expiry = now + maxUsec;
int iterations = 0;
float error = 0.0f;
int numDolls = _dolls.size();
do {
error = 0.0f;
for (int i = 0; i < numDolls; ++i) {
error = glm::max(error, _dolls[i]->enforceRagdollConstraints());
}
++iterations;
now = usecTimestampNow();
} while (iterations < maxIterations && error > minError && now < expiry);
_numIterations = iterations;
_constraintError = error;
}

View file

@ -44,7 +44,6 @@ public:
void moveRagdolls(float deltaTime);
void computeCollisions();
void processCollisions();
void enforceConstraints(float minError, int maxIterations, quint64 maxUsec);
private:
CollisionList _collisionList;