Quick Flow
광선과 삼각형의 교차는 평면에 도달하는 매개변수 t를 구하고, 그 점이 삼각형 안인지 확인하는 문제입니다. 방향 d와 평면 법선 n은 0이 아니어야 하며 모든 입력을 같은 좌표계에 둡니다.
광선: P(t)=o+td, t≥0
평면: n·(P-a)=0
n·d≠0이면 t=(n·(a-o))/(n·d)
t가 허용 구간 안인지 검사
→ P=o+td
→ 삼각형의 무게중심좌표를 계산
→ 세 가중치가 모두 0 이상이면 경계를 포함해 교차매개변수와 거리
o는 시작점, d는 방향입니다. 직선은 모든 실수 t를 허용하고, 광선은 t≥0을 사용합니다. 선분 AB는 o=A, d=B−A, 0≤t≤1로 표현할 수 있습니다.
교차점까지의 거리는 |t|‖d‖입니다. d가 단위 벡터일 때에만 광선의 t가 거리와 같습니다. 방향을 정규화하면 같은 직선을 나타낼 수 있지만 t와 허용 구간의 수치도 그에 맞게 바뀝니다. A=B인 선분은 영방향이므로 점의 포함 검사로 따로 처리합니다.
평면 식에 대입하기
광선 식을 평면 식에 넣으면 n·(o−a)+t(n·d)=0입니다. n·d가 0이 아닐 때 풀면 상단의 t가 나옵니다. 평면을 n·P=c로 저장했다면 분자는 c−n·o입니다.
평면 z=0: a=(0,0,0), n=(0,0,1)
o=(1,0.5,3), d=(0,0,-2)
n·(a-o)=-3, n·d=-2
t=1.5
P=o+1.5d=(1,0.5,0)
거리=t‖d‖=1.5×2=3분모가 0이면 나누지 않고 분자를 확인합니다.
| 조건 | 기하학적 결과 |
|---|---|
| n·d=0, n·(a−o)≠0 | 평면과 평행하며 교차하지 않음 |
| n·d=0, n·(a−o)=0 | 광선 전체가 평면 위에 있어 교차점이 하나로 정해지지 않음 |
| n·d≠0, t가 허용 구간 밖 | 직선의 교차점은 있지만 해당 광선·선분 구간에서는 교차하지 않음 |
같은 시작점에서 d=(0,0,2)로 바꾸면 t=−1.5이므로 교차점은 광선의 뒤쪽입니다. 광선이 평면 위에 놓이는 경우 삼각형과의 실제 겹침 여부는 평면 내 선분·다각형 문제로 따로 풀어야 합니다.
삼각형 내부까지 확인
삼각형 A, B, C에 대해 n=(B−A)×(C−A)로 평면을 만듭니다. n=0이면 삼각형이 퇴화하여 이 평면 교차 절차를 사용할 수 없습니다.
A=(0,0,0), B=(4,0,0), C=(0,2,0)
교차점 P=(1,0.5,0)
P=A+u(B-A)+v(C-A)
u=1/4, v=1/4
무게중심좌표=(1-u-v,u,v)=(1/2,1/4,1/4)
→ 삼각형 내부
o=(4,2,3)에서 d=(0,0,-2)이면 P=(4,2,0)
u=1, v=1, 1-u-v=-1
→ 평면에는 닿지만 삼각형에는 닿지 않음일반 삼각형의 가중치를 구하는 내적·면적 공식은 무게중심좌표에 있습니다. 두 면에서 모두 교차를 허용하는 수학적 판정과 뒷면을 제외하는 렌더링 정책은 구분합니다. 꼭짓점 순서로 정한 n에 대해 n·d가 음수이면 법선 쪽에서 들어오며, 양수이면 반대쪽에서 들어옵니다.
하나의 선형계로 보기
평면 교차와 내부 좌표 계산을 한 번에 표현할 수도 있습니다. e₁=B−A, e₂=C−A라 두고 o+td=A+ue₁+ve₂를 정리합니다.
[ e₁ e₂ -d ] [ u ] = o-A
[ v ]
[ t ]
앞 예제:
[ 4 0 0 ] [ u ] [ 1 ]
[ 0 2 0 ] [ v ] = [ 0.5 ]
[ 0 0 2 ] [ t ] [ 3 ]
u=0.25, v=0.25, t=1.5이 3×3 행렬의 행렬식은 −(e₁×e₂)·d입니다. 0이면 삼각형 퇴화 또는 광선과 평면의 평행 조건에 해당합니다. 가역일 때 해는 유일하지만, 해를 구한 후에도 t 구간과 u≥0, v≥0, u+v≤1을 확인해야 합니다. 행렬 역을 매번 만들라는 구현 지시가 아니라 선형계의 해와 교차 문제의 관계를 보여 주는 식입니다.
수치 오차와 선택 정책
부동소수점에서 거의 평행한 광선은 작은 n·d로 나누면서 t 오차가 커질 수 있습니다. 법선이나 방향의 길이를 바꿀 수 있다면 고정된 절대 임곗값 하나가 같은 기하학적 의미를 유지하지 않습니다. 각도 기준은 |n·d|/(‖n‖‖d‖), 평면까지의 거리는 |n·(o−a)|/‖n‖처럼 스케일을 구분해 판단합니다. 허용 오차는 장면 크기·정밀도·놓쳐도 되는 교차 범위에 맞춰 정해야 합니다.
광선 시작점 자체의 접촉을 포함할지는 t의 하한으로 정합니다. 하한을 너무 키우면 가까운 물체를 놓칩니다. 여러 삼각형을 검사해 가장 가까운 물체를 찾을 때에는 동일한 광선 매개변수 기준에서 유효한 최소 t를 선택합니다.
공유 변에서 틈이 생기지 않는 강건한 교차 구현은 단순한 수식과 별도의 오차 처리가 필요합니다. 실제 구현의 경계 처리는 출처의 PBRT 삼각형 교차 설명을 참고합니다. 화면에서 광선을 만드는 단계는 Camera Frustum과 Screen Ray, 대량 삼각형의 탐색은 레이 트레이싱 기초, 점과 평면의 최단 거리는 직교 투영에 연결됩니다.
참고 링크
3 sources