2016-10-14 3 views
0

구현의 작동 방식을 이해하기 위해 "Box2D Lite"() 코드를 연구 중입니다. . collide.cpp의 Collide 함수는 SAT (Separating Axis Theorem)를 구현하지만 초기에 수행 된 검사는 스마트 계산 수식을 사용하여 두 상자 사이에 접촉이없는 경우 (일찍) 결론을 내립니다. 수식은 많은 설명이나 단서없이 회전 행렬, 내적, 위치 델타를 조 변경합니다.Box2D Lite에서 "Box A faces"및 "Box B faces"검사가 무엇인지 파악할 수 없습니다

// Box A faces 
const Vec2 faceA = Abs(dA) - hA - absC * hB; 
if (faceA.x > 0.0f || faceA.y > 0.0f) 
    return 0; 

// Box B faces 
const Vec2 faceB = Abs(dB) - absCT * hA - hB; 
if (faceB.x > 0.0f || faceB.y > 0.0f) 
    return 0; 

답변

1

이러한 "마법"수식은 직사각형에 대한 분리 축 정점의 본질을 형성합니다.

Box2D Lite는 상자 만 지원하므로 몸체 당 두 개의 축만 테스트해야합니다 (cond. [1]). 이 축은 몸체의 로컬 직사각형 모양 (cond. [2])으로 인한 X 축과 Y 축입니다. 사소한 방법은 몸체를 다른 몸체의 얼굴의 월드 공간 법선에 투영하는 것이지만, 위의 두 조건을 모두 사용하면 몸체를 기준으로 투영을 수행하여 신체 축 투영을 단순화 할 수 있습니다.

faceA = Abs(dA) - hA - absC * hB 

위의 수식이 우리에게 보여주는 것을 살펴 보겠습니다.

faceAfaceA.x은 A. 에 대하여faceA.y 및 각각 가로와 세로면의 법선의 분리를 포함하는 두 물체의 분리이다. 모든 계산은 A를 기준으로 수행됩니다 ([2] 참조).

dA

은 A. 우리가 그 축에 가장 가까운의 얼굴과 B 사이의 거리를 원하기 때문에 우리는 절대 값을 취하고에 상대 위치 델타 벡터 입니다.

hA는 X에서의 범위를 포함하고, Y는

hB는 X에 B의 범위를 포함하고, Y는 B 상대 A. 축에 대하여 축. 이 벡터를 A의 공간으로 변환해야합니다. 따라서 hBabsC으로 변형합니다.

absC은 과 같습니다. 두 행렬과 m1m2v 벡터가 존재하는 경우 원칙적으로는 (m1 * m2) * v 즉, 행렬 승산하여 변환은 승산 역방향 순서로 수행되고, m1 * (m2 * v) 같다. m1 * m2이 아니고m2 * m1과 같습니다. 우리는 절대 값을 다시 취하여 모든 음의 부호를 제거하여 가장 가까운 얼굴을 검색합니다.

이 방법은 [2] 때문에 직각 사변형 (직사각형)에만 적용됩니다.