My port of the rigid body simulator from “Physics for Game Developers” (boat / plane / vehicle in fluid) starts to oscillate when a certain value gets very close to zero (steady state) and blows up. A smaller dt helps a little - I assume the Euler integrator to be the problem. So I’d like to try a different integrator. Unfortunately, the book does not show other implementations. “RK4” seems to be popular. There are some general implementations but to my embarrassment I lack the math and physics skills to apply them to the 3D simulation. So I need help.
I’ve found Integration Basics | Gaffer On Games that shows how to implement the algorithm for scalars (1D) and a spring-damper system example.
I had hope that I’d be able to implement the linear motion to get started (vectors only).
However, a key function looks like this:
float acceleration( const State & state, double t )
{
const float k = 15.0f;
const float b = 0.1f;
return -k * state.x - b * state.v;
}
Note it uses only the state (x:position, v:velocity) to determine the acceleration, but not t
.
The calling function passed t+dt
from its own parameters but does not explain where t
originates. I assume it’s just there for completeness’s sake and would most likely be zero, since the simulation uses relative time dt
.
In my simulation, acceleration is determined by constant mass and some forces (in addition to thrust) that depend on orientation and speed (drag, lift).
I don’t understand how I could calculate this for future steps, while I’m in the middle of calculating it for the next step.
I currently simply use the acceleration vector obtained previously, but I’m pretty sure that’s wrong.
Here is the JSFiddle:
I thought my initial attempt at the linear motion RK4 was somewhat working so I could post it, but it’s not doing anything plausible. Once it will, I’ll provide a fiddle.
Thinking ahead, the next step would be to implement it for the angular motion (inertia Matrix, rotation Quaternion) - I have no idea how .
Any help appreciated!