5.5.6 Intersecting Moving Sphere Against Triangle(and Polygon)
구 S가 중심 C와 반경 r에 의해 지정되고, v를 구의 중심 벡터 이동이 0 <= t <=1의 운동 구간에 대해
C(t) = C + tv로 주어지도록 S에 대한 방향 벡터라고 하자. T를 삼각형이라 하고 n을 이 삼각형의 단위화된 법선이라고 하자.
개념적으로나 계산상으로 구형과 삼각형을 교차시키는 간단한 테스트가 [Nettle00]에 제안되어 있다.
일반성을 잃지 않고, 구가 삼각형 T의 평면 앞에 있고, 평면 뒤에서 끝나도록 움직이는 것으로 가정한다.
이 상황에서, 평면과 접하는 구의 첫 번째 점은 D = C - r n이다. 평면에 대해 D + tv (0<=t<=1)의 방향 세그먼트를 교차시킨다.
P를 교차점이라하자. P가 삼각형 내부에 있으면 t는 원하는 교차 시간이고 접촉점이다. (그림 5.36a)
P가 삼각형의 바깥쪽에 있는 경우 Q를 P에 가장 가까운 삼각형의 점으로 놓는다. 움직이는 구가 삼각형에 완전히 닿는 경우
Q는 처음에 칠하는 점이다. 구가 평면을 따라 움직일 때, P는 중심에 놓이게 된다.
구가 Q에 도달하는지 여부를 결정하기 위해 구를 삼각형 쪽으로 이동시키는 대신 광선 Q-tv를 Q에서 구로 "역으로" 던질 수 있다.
이 광선이 구와 충돌하지 않거나 t가 0에서 1의 범위를 벗어나면 구가 Q를 치지 않으며 교차가 없는 것이다.
0 <= t <= 1 인 어떤 점 R에서 구가 광선에 닿으면 구의 점 R은 시각 t에서 삼각형의점 Q와 먼저 접하게된다. (그림 5.36b)
불행히도 이 테스트는 강력하지 않다. 구가 삼각형의 평면에 평행하게 움직일 때, 이동 벡터와 평면 사이에 교차점이 없으며
알고리즘이 깨진다. 그러나, 예를 들어 교차된 모든 삼각형이 메쉬의 일부가 되어 노출 된 모든 삼각형 모서리가 항상 다른 삼각형과
공유되는 경우에는 항상 문제가 되는 것은 아니다. 움직이는 구가 항상 평행하게 움직이는 삼각형과의 교차를 감지하지 못하면
인접한 삼각형을 칠 것이다. 물론 삼각형 평면에서의 슬라이딩에 관련된 충돌 응답도 이 상황을 처리하기 위해 조정되어야 한다.
보다 강건하지만 비용이 많이 드는 방법은 먼저 sphereagainst-plane 테스트를 수행해야한다.
교차점이 있는 경우 가장 초기 접촉점 P는 쐐기풀의 접근 방식과 마찬가지로 T에서의 봉쇄 여부를 테스트한다.
P가 T안에 있으면 초기 교차가 발견되어 테스트를 종료할 수 있다. 그렇지 않으면 각 삼각형 모서리에 대해 움직이는
구의 테스트가 수행된다. 이것은 반지름이 r인 실린더로 변하는 가장자리에 대해 유도된 세그먼트 C+tv, 0 <= t <= 1을 테스트하는 것과 동일하다.
실린더의 만곡면에 대한 하나 이상의 교차점이 감지되면 가장 가까운 교차로가 반환되는 가장 빠른 교차점에 해당한다.
이 지점까지 교차점이 발견되지 않았다고 가정하면 광선은 삼각형의 꼭지점을 중심으로 한 반경 r의 구에 교차한다.
다시 말하지만 하나 이상의 교차점이 있으면 가장 가까운 교차점이 반환된다. 구가 교차되지 않으면 삼각형과 교차하지 않는 원래 구에
해당한다. 광선 - 실린더 테스트의 경우 엔드 캡에 대한 교차가 필요하지 않다. 구와 삼각형이 교차하는 경우 광선이 꼭지점에서 구형과
교차해 엔드 캡을 공격 할 수 있다. 따라서 섹션 5.3.7에 주어진 마지막 테스트 비트는 생략 할 수 있다.
전반적으로, 이 접근법은 T와 S의 Minkowski 합 T⊕S를 형성하면서 S를 사용해 T를 스윕한 결과인 고체 볼륨 V에 대한 광선 테스트로
개념적으로 보인다. 그러나 세 가지 개별 구성 요소 테스트는 광선 테스트 또는 구체 테스트로 수행된다.
다음 섹션에서는 움직이는 구와 AABB를 교차시키는 문제에 Minkowski 합계 방식을 적용하는 방법에 대해 설명한다.
'Game > Physics & Math' 카테고리의 다른 글
Terrain Collisions (0) | 2018.11.28 |
---|---|
Height Maps (0) | 2018.11.28 |
5.2-6,7,8 Testing Sphere Against AABB, obb, Triangles (0) | 2018.11.24 |
5.2.9 Testing AABB Against Triangle (0) | 2018.11.24 |
Dynamic AABB Tree 구현 (from Randy Gaul) (0) | 2018.11.22 |