1 min read

삼각형과 Ray 충돌 판정

삼각형과 Ray 충돌 판정

1. 기본 개념

  • 삼각형은 3개의 꼭짓점 A, B, C로 정의됩니다.
  • 레이는 시작점 O와 방향 벡터 d로 표현됩니다.
  • 레이의 방정식은 다음과 같습니다:
P = O + t * d

2. 삼각형 평면과의 교차점 P 구하기

  1. 삼각형의 법선 벡터를 구합니다:
n = cross(B - A, C - A)
  1. 레이와 평면이 평행한지 확인합니다:
denom = dot(n, d)
if (abs(denom) < epsilon): 교차 없음
  1. 평면과의 교차 지점 P를 계산합니다:
t = dot(n, A - O) / denom
if (t < 0.0): 레이 반대 방향 → 무시
P = O + t * d

3. 점 P가 삼각형 내부에 있는지 판정하기

  1. faceNormal은 삼각형 ABC 평면의 방향을 나타냅니다.
  2. 각 변에 대해 외적을 수행하여 점 P가 변 기준으로 어느 쪽 면에 있는지 구합니다:
    • cross(B - A, P - A) → AB 변 기준
    • cross(C - B, P - B) → BC 변 기준
    • cross(A - C, P - C) → CA 변 기준
  3. 이렇게 구한 외적 벡터가 faceNormal과 같은 방향인지 dot() 함수로 비교합니다.
    • 모두 같은 방향이면 → 점 P는 삼각형 내부
    • 하나라도 반대면 → 외부
vec3 faceNormal = normalize(cross(B - A, C - A));

vec3 n0 = cross(B - A, P - A);
vec3 n1 = cross(C - B, P - B);
vec3 n2 = cross(A - C, P - C);

if (dot(n0, faceNormal) < 0.0f) return false;
if (dot(n1, faceNormal) < 0.0f) return false;
if (dot(n2, faceNormal) < 0.0f) return false;

return true; // P는 삼각형 내부