0
누구나 runge kutta를 사용하여 2D 강체 물리에 대한 C++/opengl 소스 코드 데모를 알고 있습니까?runge kutta를 사용하는 2D 강체 물리
저는 물리 엔진을 만들고 싶지만 다른 사람들이 어떻게 구현했는지 더 잘 이해할 수있는 참조 코드가 필요합니다.
누구나 runge kutta를 사용하여 2D 강체 물리에 대한 C++/opengl 소스 코드 데모를 알고 있습니까?runge kutta를 사용하는 2D 강체 물리
저는 물리 엔진을 만들고 싶지만 다른 사람들이 어떻게 구현했는지 더 잘 이해할 수있는 참조 코드가 필요합니다.
이 작업을 훌륭하게 처리하는 데 필요한 많은 사항이 있습니다. 나는 통합 자 구현에 초점을 맞추고 내가 찾은 것이 나를 위해 잘 작동한다는 것을 알게 될 것이다.
시스템의 모든 자유 정도 시간 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
자유도를 가진 계획 시스템의 상용 소프트웨어와 동일합니다.
더 간단한 오일러 방법 버전으로 시작하십시오. 일단 이것이 있으면 Runge-Kutta로 "업그레이드"하는 것이 쉬워야합니다. – leftaroundabout