<-클릭


기존의 방식은 두 원간의 거리 차가 두 원의 반지름의 합보다 작으면, 충돌을 확인하는 방법이였다면, 이 방식은 두 원의 속도 벡터를 분석하여, 충돌이 일어날지의 여부를 미리 예측하고 그에 따른 적절한 대응을 해준것이다.

두 원을 각각 s0 , s1 이라고 하고, 두원의 시간(t)에 대한 위치를 p0 , p1 이라고 하자. (0<= t <= 1 )

p0(t) = C0 + V0*t
p1(t) = C1 + V1*t

로 쓸수 있다.

그럼 시간에 따른 두 원간의 거리를 d(t) 로 나타내어 보면

d(t) = p1(t) - p0(t) = (c1 - c0) + (v1 - v0)*t

즉, d의 length 가 두 원의 반지름의 합(r0 + r1) 보다 작으면 충돌이 일어나게 된다.

if (|d| <= r0 + r1 ) -> 충돌

Cost 를 절감하기 위해서(sqrt 함수 사용을 피하자, 이는 고비용을 요구한다.)

d.dot(d) = = r^2 일때의 t의 값을 구하면 충돌지점을 알아낼수 있다.

d = c + v*t 라고 하면,

c.dot(c) + 2*c.dot(v)*t + v.dot(v)*t^2 = r^2

이 방정식을 근의 공식을 사용해서 풀면 t를 구할수 있음..

즉, c0.add(v0 * t) 의 위치에서 충돌이 발생한다.



Posted by 웹눈