機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

法線行列

法線行列とは

光源の方向ベクトルと点の法線ベクトルから輝度を計算しますが、その時の座標系はビュー座標系であることが多いはずです。
法線ベクトルは方向ベクトルなので、モデルビュー行列をそのまま掛けるわけにはいきませんし、
異方性のある拡大縮小やせん断を行っているとモデルビュー行列を3x3(4行目と4列目を無視)にしてもダメです。
(※これ逆に言うと、異方性の無い拡大縮小かつせん断をしていない場合は、モデルビュー行列を3x3にしてかければよいことになります。)
法線ベクトルを変換してくれる行列を求める必要があります。それを法線行列といいます。

導出


面の法線ベクトルを \bf n 、面の2点の頂点座標の差として計算できる表面ベクトルを {\bf s} とします。

\begin{eqnarray}
{\bf n}^\top{\bf s}=0\tag{1}
\end{eqnarray}
モデルビュー行列を {\bf M} とします。
\begin{eqnarray}
{\bf s}'={\bf M}{\bf s}\tag{2}
\end{eqnarray}
求めたい行列を \bf K とします。
\begin{eqnarray}
{\bf n}'={\bf K}{\bf n}\tag{3}
\end{eqnarray}
{\bf n}',{\bf s}' に以下の式が成り立ちます。
\begin{eqnarray}
{\bf n}'^\top{\bf s}'=0\tag{4}
\end{eqnarray}
(4) に式 (2),(3) を代入します。
\begin{eqnarray}
&&\left({\bf K}{\bf n}\right)^\top{\bf M}{\bf s}=0\\
&&\Rightarrow{\bf n}^\top{\bf K}^\top{\bf M}{\bf s}=0\tag{5}
\end{eqnarray}
(1),(5) より、{\bf K}^\top{\bf M}単位行列であればよいことが分かります。
\begin{eqnarray}
&&{\bf K}^\top{\bf M}={\bf I}\\
&&\Rightarrow{\bf K}^\top={\bf M}^{-1}\\
&&\Rightarrow{\bf K}=({\bf M}^{-1})^\top\tag{6}\\
\end{eqnarray}
(6) より、法線行列が求まりました。

法線行列に法線ベクトルを掛けるときは、第4成分を0にして掛けてください。

最後に

異方性のある拡大縮小やせん断って私はモデル行列に使うことはないです。
また、ビュー行列は回転行列と平行移動行列からなる剛体変換行列です。
よって、普通にアプリを作成する分には法線行列は不要かと思います。
ですが、念のため法線行列を計算して、GPUに渡す癖をつけても悪くないとも思います。

参考

初めてのWebGL2 p135-p136

目次へ戻る