내가 구상한 게임은 다수의 구가 인접해있다. 따라서 Axis Aligned Bounding Box 형태의 충돌 검사는 부적절하다. 구를 덮기 위해 상자의 한 변은 최소한 구의 지름이 되어야 하는데, 아래 그림과 같은 문제가 발생한다.
그러나 AABB 방식은 엔진이 기본적으로 제공하는데다가, 검사도 빠르기 때문에 간단히 포기하기에는 아까웠다. 그래서 검출에는 AABB를 쓰고, 타당성 조사는 공식(직선과 점 사이의 최단 거리 구하기)을 사용하여 문제를 해결했다.
공식을 이해하는데 시간이 걸렸지만, 치환으로 유도되므로 간단하다고 할 수 있다.
인용: 좋은 게임을 만드는 핵심원리: 게임 수학과 물리. 거기에 이해하기 쉽게 주석을 곁들였다.
(1) 직선 L의 방향 벡터를 구한다. 이 값은 단위 벡터가 되든 안되든 관계없다.
(2) 직선 L에서 투영벡터의 길이를 구한다. 어려워 보이지만, 단순히 공식일 뿐이다. 책의 투영 벡터 부분을 살피면 있다. 책에서는 t > 0, t < 1일 때를 언급하지만 단순한 사실일 뿐이며, 이와 관계없이 거리는 올바로 구해진다. 참고로 t > 0, t < 1이라는 것은 p-p1이 d보다 작거나 크다는 것으로, 따라서 d의 시작점이 직선 위에 있지 않다는 사실임을 알 수 있다.
(3) 점 q의 위치를 구한다. 이 점이 P1에서 시작한 투영벡터가 도착한 점이다. P1에 투영벡터 길이만큼 더해주면 얻어진다.
(4) 이제 점 간의 절대값을 구하면 거리를 얻는다.
'코드' 카테고리의 다른 글
버텍스 회전 이용하기 (0) | 2006.07.08 |
---|---|
VisualStudio 2005에서 QT 작업하기 (0) | 2006.07.06 |
빌보드 및 폰트 표시 테스트 (0) | 2006.06.29 |
SubEntity의 메쉬에서 버텍스 정보 얻기 (0) | 2006.06.29 |
QT with Ogre (0) | 2006.06.26 |