Minkowski 합계 사용
이 문제를 해결하는 좋은 방법은 운동의 라인 사이의 교차점을 고려하는 것입니다 ( V ) 원점 (번역 V ' )과 민코프 스키 합 의 A는 원점 (180도 회전 A' )와 장애물 (단지 B 이 경우) A ' ⊕ B .
다음 그림 I 장소에서 헤로인-DAB 임의의 원점 좌표계. 이렇게하면 A를 180 도로 회전 시키면 A ' 가되고 v 가 원점으로 변환 된 v는 v' 와 같이 이해가 간단 해 집니다.
Minkowski 합은 녹색 사각형이며, AAAA 선을 교차 하여 움직이는 A 와 고정 B의 교점을 찾을 수 있습니다 . 이 점들은 파란색 원으로 표시됩니다.
다음 그림에서는 다른 원점이 사용되었으며 동일한 교차점이 발견되었습니다.
여러 개의 움직이는 AABB
특정 기간 동안 선형 방식으로 움직이는 두 AABB에 대해이 작업을 수행하려면 A 의 속도 벡터에서 B 의 속도 벡터를 빼고이를 AAAA 교차점의 선분으로 사용합니다.
의사 코드
def normalize(aabb):
return {x1: min(aabb.x1, aabb.x2), x2: max(aabb.x1, aabb.x2),
y1: min(aabb.y1, aabb.y2), y2: max(aabb.y1, aabb.y2),
def rotate_about_origin(aabb):
return normalize({x1: -aabb.x1, x2: -aabb.x2
y1: -aabb.y1, y2: -aabb.y2})
# given normalized aabb's
def minkowski_sum(aabb1, aabb2):
return {x1: aabb1.x1+aabb2.x1, x2: aabb1.x2+aabb2.x2,
y1: aabb1.y1+aabb2.y1, y2: aabb1.y2+aabb2.y2}
def get_line_segment_from_origin(v):
return {x1: 0, y1: 0, x2: v.x, y2: v.y}
def moving_objects_with_aabb_intersection(object1, object2):
A = object1.get_aabb()
B = object2.get_aabb()
# get A'⊕B
rotated_A = rotate_about_origin(A)
sum_aabb = minkowski_sum(rotated_A, B)
# get v'
total_relative_velocity = vector_subtract(object1.get_relative_velocity(), object2.get_relative_velocity())
line_segment = get_line_segment_from_origin(total_relative_velocity)
# call your favorite line clipping algorithm
return line_aabb_intersection(line_segment, sum_aabb)
충돌 대응
게임 플레이에 따라 더 세밀한 충돌 감지 (AABB에는 메시가 포함되어 있음)를 수행하거나 다음 단계 인 충돌 응답으로 넘어갑니다.
충돌이 발생하면 AABB 교차로 알고리즘은 A가 B 내부의 움직임을 종료하는지 또는 통과하는지에 따라 1 또는 2 개의 교차점을 반환합니다. (이것은 A가 측면을 따라 또는 각각의 모서리 중 하나를 따라 B를 움켜 쥐는 퇴화 된 경우를 할인합니다.)
어느 쪽이든, 선분을 따르는 첫 번째 교차점은 충돌 점입니다.이를 다시 월드 좌표계의 정확한 위치로 변환합니다 (원래 v를 따라 두 번째 그림의 첫 번째 밝은 파란색 원은 p 라고 부릅니다) 그런 다음 프레임 끝에서 A 의 실제 위치 가 ( At + 1 )이 되는지 를 결정합니다 (예 : p 에서 충돌 법선을 따라 v 를 반사하여 탄성 충돌 의 경우 ).
콜 리더가 두 개 이상인 경우 v 의 두 번째 반사 부분에 대한 충돌 감지를 원할 때 조금 더 복잡해 집니다.