法線ベクトルの変換
3Dオブジェクトを扱うときは、オブジェクトの回転・変換に合わせてその法線も適切に変換しなければならないときがあります。
オブジェクトを行列$A$で変換を行う場合、法線$\boldsymbol{n}$ について、 $^t(A^{-1})\boldsymbol{n}$ を変換後の法線ベクトルとして扱えば良いことになりますが、なぜこれで変換後の法線ベクトルが求められるのか示しました。
補題
※ベクトル $\boldsymbol{a}$ と $\boldsymbol{b}$ の内積を $(\boldsymbol{a}, \boldsymbol{b})$で表すとする。
$A$ が $(m,n)$ 型の実行列ならば、任意の $n$ 項列ベクトル $\boldsymbol{x}$ および $m$ 項列ベクトル $\boldsymbol{y}$ について
\begin{align}
(A\boldsymbol{x}, \boldsymbol{y}) = (\boldsymbol{x}, ^tA\boldsymbol{y})
\end{align}
が成り立つ。
補題の証明
証明は、斎藤線形代数入門のp63 [6.3]、定理(転置行列の基本的な性質2)などを参照。
本題の証明
$A$ を正則行列、$\boldsymbol{n}$ を法線ベクトル、$\boldsymbol{p}$ を任意のベクトルとする。
このとき補題より以下が成り立つ。
\begin{align}
(\boldsymbol{n}, \boldsymbol{p}) = (\boldsymbol{n}, A^{-1}A\boldsymbol{p}) = (^t(A^{-1})\boldsymbol{n}, A\boldsymbol{p})
\end{align}
$ (\boldsymbol{n}, \boldsymbol{p})=0$ のとき、$(^t(A^{-1})\boldsymbol{n}, A\boldsymbol{p})=0$ だから、$^t(A^{-1})\boldsymbol{n}$ は変換後のオブジェクトに対応する法線ベクトルになっている。
また、
\begin{align}
(\boldsymbol{n}, \boldsymbol{n}) = (^t(A^{-1})\boldsymbol{n}, A\boldsymbol{n}) > 0
\end{align}
内積が>0だから、$^t(A^{-1})\boldsymbol{n}$は$A\boldsymbol{n}$と同じ側を向く法線ベクトルになっている。
参考
特異値分解による説明
具体的な計算
- ○○くんのために一所懸命書いたものの結局○○くんの卒業に間に合わなかったGLFW による OpenGL 入門 の p202に逆行列の転置行列を求めるくだりがある