실제로 큰 델타 시간 (시간-주)에 가장 적합한 물리 시뮬레이션 방법은 무엇입니까?
또한 델타 시간이 크고 작은 다른 방법을 결합하는 데 문제가 있습니까?
실제로 큰 델타 시간 (시간-주)에 가장 적합한 물리 시뮬레이션 방법은 무엇입니까?
또한 델타 시간이 크고 작은 다른 방법을 결합하는 데 문제가 있습니까?
답변:
이러한 큰 시간 범위 (제로 가속 일 수 있음)에 일정한 가속을 사용하고있을 것입니다. 시간에 대한 일정한 가속도의 미분은 0입니다. 이는 시간에 따라 변하지 않기 때문에 델타 시간이 얼마나 큰지는 중요하지 않습니다.
시간에 대한이 작은 통합은 필요한 방정식을 제공합니다.
a = a
v = at + v0
s = .5at^2 + v0*t + s0
여기서 : a = 가속, v = 속도, v0 = 초기 속도, s = 위치, s0 = 초기 위치, t = 시간
이 전략을 사용하면 원하는 시간을 밀리 초에서 몇 주까지 사용할 수 있습니다. 그것들을 결합 하면 방정식 의 v0
및 s0
매개 변수에서 처리됩니다.
충돌을 처리하려면 구현해야합니다 고속 소형 물체에 사용되는 것과 유사한 전략 합니다 . 먼저 위의 방정식을 사용하여 새 위치를 계산 한 다음 모든 객체에 대해 이전 위치와 새 위치를 스윕합니다. 이러한 개체 중 하나가 서로 교차 할 수 있기 (분 또는 몇 일 전) 매우 복잡 할 수 있습니다. 델타 시간이 길기 때문에 이러한 잠재적 충돌을 처리 할 시간이 충분할 것입니다.
중력을 예로 들어 보겠습니다.
아래 함수에서 위치와 속도에 대한 클래스 멤버 변수가 있다고 가정합니다. 우리는 매 dt 초마다 중력으로 인해 그것들을 업데이트해야합니다.
void update( float dt )
{
acceleration = G * m / r^2;
velocity = velocity + acceleration * dt;
position = position + velocity * dt;
}
dt
점점 작아 지면서 시뮬레이션은 더욱 정확 해집니다.dt
너무 작아지면 작은 숫자를 큰 숫자에 추가 할 때 정밀 오류가 발생할 수 있음).
기본적으로 dt
충분한 결과를 얻기 위해 시뮬레이션이 처리 할 수 있는 최대 값을 결정해야 합니다. 그리고 dt
그것이 들어오는 것이 너무 크다면, 시뮬레이션을 더 작은 단계로 나눕니다. 각 단계는 dt
허용 되는 최대 값 입니다.
void update( float dt )
{
acceleration = G * m / r^2;
velocity = velocity + acceleration * dt;
position = position + velocity * dt;
}
// this is the function we call. The above function is a helper to this function.
void updateLargeDt( float dt )
{
const float timeStep = 0.1;
while( dt > timeStep )
{
update( timeStep );
dt -= timeStep ;
}
update( dt ); // update with whatever dt is left over from above
}
따라서이 전략을 사용 timeStep
하면 필요한 충실도에 맞게 조정할 수 있습니다 (물리를 정확하게 표현하는 데 필요한 초, 분, 시간 또는 무엇이든).
대부분의 게임은 간단한 오일러 를 사용하는 경향이 있습니다 순방향 통합 방법 (즉, 시간에 따라 속도를 위치에 통합하고 가속도를 속도에 통합). 불행히도, 오일러 방법은 매우 작은 시간 단위 및 단기 실행에만 적합합니다.
매우 오랜 시간 동안 더 정확한 더 복잡한 방법이 있습니다. 가장 인기 있고 구현하기 가장 쉬운 것은 아마도 Runge-Kutte-4 일 것입니다 입니다. RK4는 과거의 4 가지 위치와 속도를 샘플링하고 보간하여 미래의 위치를 결정합니다. 더 긴 시간 단위에 걸쳐 Euler 방법보다 훨씬 더 정확한 경향이 있지만 계산 비용이 많이 듭니다.
예를 들어 며칠마다 실시간으로 업데이트되는 실제 궤도 행성의 물리학을 계산하려는 경우 오일러 방법을 사용하면 숫자 오류로 인해 몇 번의 궤도 후에 행성이 우주로 발사됩니다. RK4는 일반적으로 너무 많은 오차를 축적하기 전에 행성 궤도를 수천 번에 걸쳐 거의 같은 모양으로 유지합니다.
그러나 RK4에 충돌을 구현하는 것은 매우 어려울 수 있습니다 ...