2012-04-13 9 views
0

Kennt jemand C++/opengl Sourcecode-Demos für 2D-Rigid-Body-Physik mit Runge Kutta?2D-Rigid-Body-Physik mit Runge Kutta

Ich möchte eine Physik-Engine bauen, aber ich brauche einen Referenzcode, um besser zu verstehen, wie andere dies implementiert haben.

+2

Beginnen Sie mit einer einfacheren Euler-Methode. Sobald Sie dies haben, sollte es leicht sein, auf Runge-Kutta zu "upgraden". – leftaroundabout

Antwort

2

Es gibt eine Menge Dinge, die Sie tun müssen, um dies gut zu tun. Ich werde mich auf die Implementierung des Integrators konzentrieren und was ich gefunden habe funktioniert gut für mich.

Für alle Freiheitsgrade in Ihrem System eine Funktion implementieren v die Beschleunigungen a als Funktion der Zeit t, Positionen und Geschwindigkeiten x zurückzukehren. Dies sollte auf Arrays oder Vektoren von Mengen und nicht nur Skalaren funktionieren.

a = accel(t,x,v); 

Nach jedem RK Schritt bewerten die Beschleunigung für den nächsten Schritt bereit zu sein. In der Schleife dann folgendes tun:

{ 
    // assume t,x[],v[], a[] are known 
    // step time t -> t+h and calc new values 
    float h2=h/2; 
    vec q1 = v + h2*a; 
    vec k1 = accel(t+h2, x+h2*v, q1); 
    vec q2 = v + h2*k1; 
    vec k2 = accel(t+h2, x+h2*q1, q2); 
    vec q3 = v + h*k2; 
    vec k3 = accel(t_h, x+h*q2, q3); 
    float h6 = h/6; 
    t = t + h; 
    x = x + h*(v+h6*(a+k1+k2)); 
    v = v + h6*(a+2*k1+2*k2+k3); 
    a = accel(t,x,v); 
} 

Warum? Nun, die Norm RK Methode erfordert, dass Sie einen 2xN State-Vektor, aber die Ableitungen der ersten N Elemente sind gleich den letzten N Elemente. Wenn Sie das Problem bis zu zwei N Zustandsvektoren aufteilen und ein wenig vereinfachen, gelangen Sie zum obigen Schema für die 2. Ordnung RK.

Ich habe dies getan und die Ergebnisse sind identisch mit kommerzieller Software für ein Plan-System mit N=6 Freiheitsgrade.