mirror of
https://github.com/overte-org/overte.git
synced 2025-04-25 20:36:38 +02:00
more complete physics iteration for stability
This commit is contained in:
parent
add556719c
commit
3e0673418f
2 changed files with 31 additions and 24 deletions
|
@ -10,6 +10,7 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include "PhysicsSimulation.h"
|
#include "PhysicsSimulation.h"
|
||||||
|
|
||||||
|
@ -145,15 +146,41 @@ void PhysicsSimulation::removeRagdoll(Ragdoll* doll) {
|
||||||
// (10b) figure out how to slave dupe JointStates to physical shapes
|
// (10b) figure out how to slave dupe JointStates to physical shapes
|
||||||
// (11) add and enforce angular contraints for joints
|
// (11) add and enforce angular contraints for joints
|
||||||
void PhysicsSimulation::stepForward(float deltaTime, float minError, int maxIterations, quint64 maxUsec) {
|
void PhysicsSimulation::stepForward(float deltaTime, float minError, int maxIterations, quint64 maxUsec) {
|
||||||
quint64 startTime = usecTimestampNow();
|
quint64 now = usecTimestampNow();
|
||||||
|
quint64 startTime = now;
|
||||||
quint64 expiry = startTime + maxUsec;
|
quint64 expiry = startTime + maxUsec;
|
||||||
|
|
||||||
moveRagdolls(deltaTime);
|
moveRagdolls(deltaTime);
|
||||||
computeCollisions();
|
|
||||||
processCollisions();
|
|
||||||
enforceConstraints(minError, maxIterations, expiry - usecTimestampNow());
|
|
||||||
|
|
||||||
|
int numDolls = _dolls.size();
|
||||||
|
_numCollisions = 0;
|
||||||
|
int iterations = 0;
|
||||||
|
float error = 0.0f;
|
||||||
|
do {
|
||||||
|
computeCollisions();
|
||||||
|
processCollisions();
|
||||||
|
|
||||||
|
// 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;
|
_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) {
|
void PhysicsSimulation::moveRagdolls(float deltaTime) {
|
||||||
|
@ -215,22 +242,3 @@ void PhysicsSimulation::processCollisions() {
|
||||||
++shapeItr;
|
++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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,6 @@ public:
|
||||||
void moveRagdolls(float deltaTime);
|
void moveRagdolls(float deltaTime);
|
||||||
void computeCollisions();
|
void computeCollisions();
|
||||||
void processCollisions();
|
void processCollisions();
|
||||||
void enforceConstraints(float minError, int maxIterations, quint64 maxUsec);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CollisionList _collisionList;
|
CollisionList _collisionList;
|
||||||
|
|
Loading…
Reference in a new issue