Tangent Basis 벡터 계산

tangent, bitangent 벡터 구하는 방법을 간단하게 설명해 보겠습니다.

tangent space (texture space) 에 있는 (s, t) 벡터를 world space 로 변환하면 삼각형의 edge 벡터가 된다는 사실로부터,

    \[\begin{bmatrix} \vec{T} & \vec{B} \end{bmatrix} \begin{bmatrix} s_1 \\ t_1 \end{bmatrix} = \vec{e}_1\]

    \[\begin{bmatrix} \vec{T} & \vec{B} \end{bmatrix} \begin{bmatrix} s_2 \\ t_2 \end{bmatrix} = \vec{e}_2\]

이 식은 (s, t) 벡터를 \vec{T}, \vec{B} 가 기저인 world space (column space) 로 변환하는 식입니다.
식을 하나로 합치면,

    \[\begin{bmatrix} \vec{T} & \vec{B} \end{bmatrix} \begin{bmatrix} s_1 & s_2 \\ t_1 & t_2 \end{bmatrix} = \begin{bmatrix} \vec{e}_1 & \vec{e}_2 \end{bmatrix}\]

이것은 미지수가 6 개인 6 개의 연립 일차 방정식입니다.

    \[\begin{bmatrix} \vec{T} & \vec{B} \end{bmatrix} = \frac{1}{s_1 t_2 - s_2 t_1} \begin{bmatrix} \vec{e}_1 & \vec{e}_2 \end{bmatrix} \begin{bmatrix} t_2 & -s_2 \\ -t_1 & s_1 \end{bmatrix}\]

앞의 상수로 해가 존재하는지 알 수 있고, 해를 계산할 때는 어차피 normalize 할 것이기 때문에 부호만 보면 됩니다.
마지막으로 \vec{T}, \vec{B}, \vec{N} 벡터가 서로 직교한다는 보장이 없기 때문에 Gram-Schmidt 직교화를 한번 해줘야 합니다.

실제 polygon mesh 에 적용할 때는 smooth 한 normal 을 구할 때와 마찬가지로, 삼각형들이 공유하는 tangent 벡터들을 평균을 내서 적용합니다.

참고:
http://www.terathon.com/code/tangent.html

Leave a Reply

Your email address will not be published. Required fields are marked *