機械学習基礎理論独習

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

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

平面投影される影

影の平面投影

影を表現するときによくテクスチャ(投影マッピング、デプスマッピング)が使われますが、平面投影に限っては不要です。
影を単なる行列で表現できます。
GPUが早くなった今でも影を平面に投影する機会もあるんじゃないかと思って、本記事を書くことにしました。

平面投影する行列の導出

平面の単位法線ベクトルを \bf n、平面上の点を \bf x、原点から平面までの符号付距離を d とおくと、次の式が成り立ちます。

\begin{eqnarray}
{\bf n}^\top{\bf x}+d=0\tag{1}
\end{eqnarray}

光源の位置ベクトルを {\bf l}、オブジェクトの頂点の位置ベクトルを {\bf v} とすると、
光源位置 l と頂点 {\bf v} を通る直線はパラメータ t\in{\mathbb R} を使って以下のように表せます。

\begin{eqnarray}
{\bf r}(t)={\bf l}+t{\bf d}\tag{2}
\end{eqnarray}

ここで、{\bf d}={\bf v}-{\bf l}\cdots(3) としました。
{\bf v} を平面に投影した点の位置ベクトルを {\bf v}'とします。
{\bf v}' は平面と直線の交点なので、式 (2) を式 (1) に代入して、t について解きます。

\begin{eqnarray}
&&{\bf n}^\top\left({\bf l}+t{\bf d}\right)+d=0\\
&\Leftrightarrow&{\bf n}^\top{\bf l}+{\bf n}^\top{\bf d}t+d=0\\
&\Leftrightarrow&\hat{t}=-\dfrac{{\bf n}^\top{\bf l}+d}{{\bf n}^\top{\bf d}}\tag{4}
\end{eqnarray}

(4) を式 (2) に代入します。

\begin{eqnarray}
{\bf v}'=r(\hat{t})&=&{\bf l}-\dfrac{{\bf n}^\top{\bf l}+d}{{\bf n}^\top{\bf d}}{\bf d}\\
&=&{\bf l}-\dfrac{\left({\bf n}^\top{\bf l}+d\right)\left({\bf v}-{\bf l}\right)}{{\bf n}^\top\left({\bf v}-{\bf l}\right)}\\
&=&\dfrac{{\bf n}^\top\left({\bf v}-{\bf l}\right){\bf l}-\left({\bf n}^\top{\bf l}+d\right)\left({\bf v}-{\bf l}\right)}{{\bf n}^\top\left({\bf v}-{\bf l}\right)}\\
&=&\dfrac{{\bf n}^\top{\bf v}{\bf l}-{\bf n}^\top{\bf l}{\bf l}-{\bf n}^\top{\bf l}{\bf v}+{\bf n}^\top{\bf l}{\bf l}-d{\bf v}+d{\bf l}}{{\bf n}^\top\left({\bf v}-{\bf l}\right)}\\
&=&\dfrac{{\bf n}^\top{\bf v}{\bf l}-{\bf n}^\top{\bf l}{\bf v}-d{\bf v}+d{\bf l}}{{\bf n}^\top\left({\bf v}-{\bf l}\right)}\\
&=&\dfrac{\left({\bf n}^\top{\bf l}+d\right){\bf v}-\left({\bf n}^\top{\bf v}+d\right){\bf l}}{{\bf n}^\top\left({\bf l}-{\bf v}\right)}\tag{5}
\end{eqnarray}

(5) を同次座標で表すと以下のようになります。

\begin{eqnarray}
\begin{pmatrix}v'_x\\v'_y\\v'_z\\v'_w\end{pmatrix}=
\begin{pmatrix}
\left({\bf n}^\top{\bf l}+d\right){\bf v}-\left({\bf n}^\top{\bf v}+d\right){\bf l}\\
{\bf n}^\top\left({\bf l}-{\bf v}\right)
\end{pmatrix}
=
\begin{pmatrix}
\left({\bf n}^\top{\bf l}+d\right)v_x-\left({\bf n}^\top{\bf v}+d\right)l_x\\
\left({\bf n}^\top{\bf l}+d\right)v_y-\left({\bf n}^\top{\bf v}+d\right)l_y\\
\left({\bf n}^\top{\bf l}+d\right)v_z-\left({\bf n}^\top{\bf v}+d\right)l_z\\
{\bf n}^\top\left({\bf l}-{\bf v}\right)
\end{pmatrix}\tag{6}
\end{eqnarray}

(6) を行列を使って表すと以下のように書けます。

\begin{eqnarray}
\begin{pmatrix}v'_x\\v'_y\\v'_z\\v'_w\end{pmatrix}=
\begin{pmatrix}
{\bf n}^\top{\bf l}+d-n_xl_x & -n_yl_x & -n_zl_x & -dl_x\\
 -n_xl_y & {\bf n}^\top{\bf l}+d-n_yl_y & n_zl_y & -dl_y\\
 -n_xl_z & -n_yl_z & {\bf n}^\top{\bf l}+d-n_zl_z & -dl_z\\
 -n_x & -n_y & -n_z & {\bf n}^\top{\bf l} 
\end{pmatrix}
\begin{pmatrix}v_x\\v_y\\v_z\\1\end{pmatrix}\tag{7}
\end{eqnarray}

(7) より、平面投影する行列が求まりました。

参考文献

リアルタイムシャドウ p20-p22

目次へ戻る