2010-08-02 3 views
3

스윕은 어떤 시점에서 물체가 충돌할지 여부를 결정하는 수단으로 생각됩니다. 현재 충돌하고 있는지 아닌지를 판단 할 수 있습니다.Pseudocode for Swept AABB Collision

축에 정렬 된 경계 상자가있는 객체가 있습니다. 객체 상자는 크기가 다를 수 있지만 항상 사각형입니다.

두 개의 움직이는 AABB 객체가 어느 시점에서 충돌 할지를 결정하는 알고리즘을 알아 내려고 시도했지만 실제로 힘든 시간을 보냈습니다. 두 객체가 어느 시점에서 통과 할 시간 간격을 결정하는 것에 대해 여기에서 질문을 읽었습니다. 시각화에 문제가 없었지만 구현은 또 다른 이야기였습니다. 너무 많은 예외가있는 것 같아요. 올바르게 작동하고있는 것처럼 보이지 않습니다.

개체는 직선으로 만 이동할 수 있습니다 (물론 방향을 바꿀 수는 있지만 예를 들어 방향을 바꿀 수는 있지만 항상 축에 있습니다. 축을 끄려고하면 그냥 작동하지 않습니다) , 축에 바인딩됩니다. 그들의 경계 박스는 회전시키지 않거나 그렇게하지 않습니다. 속도는 변경 될 수 있지만, 메서드의 요점은 객체의 현재 상태가 "충돌 과정"에 있는지 여부를 결정하기 때문에 중요하지 않습니다. 더 자세한 정보가 필요하면 알려주십시오.

누군가 위 의사가 될 의사 코드 (또는 실제 코드)를 제공 할 수 있다면. 내가 Intersection of Convex Objects: The Method of Separating Axes라는 문서를 읽었지만, 그 안에 의사 코드의 일부를 이해하지 못했습니다 (연합은 무엇을 의미합니까)?

감사합니다. 감사합니다.

답변

1

충돌이 발생하면 상자가 한쪽면에 닿습니다. 당신은 그들이 쌍의 측면 (LR, RL, UD, DU)에 대한 감동 여부를 확인할 수 있습니다.

문제를 단순화하려면 첫 번째 상자가 원점에 있고 이동하지 않도록 상자를 번역 할 수 있습니다. 다음 코드와 같은

뭔가 :

dLR = B.L - A.R; 
dRL = A.L - B.R; 
dUD = B.U - A.D; 
dDU = A.U - B.D; 

vX = A.xV - B.xV; 
vY = A.yV - B.yV; 

tLR = dLR/vX; 
tRL =-dRL/vX; 
tUD = dUD/vY; 
tDU =-dDU/vY; 

hY = dUD + dDU; //combined height 
hX = dLR + dRL; 

if((tLR > 0) && (abs(dDU + vY*tLR) < hY)) return true; 
if((tRL > 0) && (abs(dUD - vY*tRL) < hY)) return true; 
if((tUD > 0) && (abs(dRL + vX*tUD) < hX)) return true; 
if((tDU > 0) && (abs(dLR - vX*tDU) < hX)) return true; 
return false; 
+0

이 바른 길에 나를 넣어! 감사! – random