반직선과 평면의 교점
삼각형의 교차 판정은 삼각형으로 이루어진 평면과의 충돌 판정과 교차점이 삼각형의 내부에 포함되어 있는지를 판정하는 점포함 판정의 2단계로 이루어져 있으며 아래 포스트는 첫번째 단계인 충돌판정에 대해서 다룬다. 1단계가 끝나면 반직선이 가상으로 나아갈때 평면과 맞닿는 교점을 구할 수 있으므로 2단계인 삼각형 점포함 테스트만 수행하면 될것
교점 찾기
평면의 법선 벡터 \(N=(Nx,Ny,Nz)\) 일반화된 평면 방정식 \(NxX+NyY+NzZ+D=0\) 반직선 방정식 \(P(t) = Q+Vt\) 반직선 방정식의 전개 \(Px(t)=Qx+Vxt\) \(Py(t)=Qy+Vyt\) \(Py(t)=Qz+Vzt\) 그리고 이것을 평면 방정식에 대입하여 정리하면 다음과 같다. \((NxVx+NyVy+NzVz)t + (NxQx+NyQy+NzQz) +D =0\) \(t = -\frac{(NxQx+NyQy+NzQz)+D}{(NxVx+NyVy+NzVz)}\) 이 식을 벡터 표현으로 다음과 같이 변형 한다. \((N\cdot V)t+N\cdot Q+D=0\) 반직선 방정식에 대입해 교점을 구해야 하므로 t에 대해 정리한다. \(t=\frac{-(N\cdot Q+D)}{N\cdot V}\)
위 식들로부터 구한 t를 반직선 방정식에 대입해 평면과 반직선의 교점 T를 구한다. 마지막 식의 분모 \(N\cdot V=0\) 이면 반직선과 평면이 평행해서 (90도이거나 270도 일것이다) 근이 존재하지 않는다. 평면의 법선과 직선의 방향벡터가 90도 라는 얘기는 평면과 직선이 평행하다는 것을 의미한다. (무한으로 뻗어나가도 만날수 없다.)
이때 t가 음수가 나온다면 시작점 Q의 뒤쪽에서 교점이 생긴다는 얘기이며 현재 정의한 방향으로는 교점이 생길 수가 없다.
위 두 사실로 미루어 볼때 \(N\cdot V ==0\) 이거나\(t<0\) 일때 다음 충돌 판정을 스킵하는 식으로 최적화를 할 수 있고 여러 물체에 대해서 충돌 판정을 수행 한다면 t가 제일 작은 물체에 대해 먼저 충돌 되었다고 볼 수 있다.