2012-04-13 5 views
0

누구나 runge kutta를 사용하여 2D 강체 물리에 대한 C++/opengl 소스 코드 데모를 알고 있습니까?runge kutta를 사용하는 2D 강체 물리

저는 물리 엔진을 만들고 싶지만 다른 사람들이 어떻게 구현했는지 더 잘 이해할 수있는 참조 코드가 필요합니다.

+2

더 간단한 오일러 방법 버전으로 시작하십시오. 일단 이것이 있으면 Runge-Kutta로 "업그레이드"하는 것이 쉬워야합니다. – leftaroundabout

답변

2

이 작업을 훌륭하게 처리하는 데 필요한 많은 사항이 있습니다. 나는 통합 자 구현에 초점을 맞추고 내가 찾은 것이 나를 위해 잘 작동한다는 것을 알게 될 것이다.

시스템의 모든 자유 정도 시간 t의 함수로 가속도를 a 반환하는 함수를 구현을 위해

x 및 속도 v 배치합니다. 이는 스칼라가 아닌 수량 또는 배열의 벡터에서 작동해야합니다. 각 RK 단계 후
a = accel(t,x,v); 

가속도가 다음 단계에 대한 준비를 평가한다. 루프에서 다음을 수행하십시오.

{ 
    // 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); 
} 

왜? 음, 표준 RK 방법은 2xN 상태 벡터를 만들 것을 요구하지만, 주먹 N 요소의 파생물은 마지막 N 요소와 같습니다. 문제를 두 개의 N 상태 벡터로 나누고 조금 단순화하면 위의 체계에 따라 2 차 RK에 도착합니다.

나는 이것을 수행했으며 결과는 N=6 자유도를 가진 계획 시스템의 상용 소프트웨어와 동일합니다.