機械学習基礎理論独習

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

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

平行投影

平行投影とは

ビュー座標系からクリッピング座標系への変換を投影変換といい、平行投影とはその1種です。
具体的には、空間上に直方体(視体積)を定め、それを原点が中心とした辺の長さが2の直方体(標準視体積)へ移す変換のことです。
ビュー座標系の視体積が直方体なら、「平行投影」で、錐台の時は「透視投影」と言います。(透視投影のときは、視体積と言わず視錐台ということもあるようです。)

クリッピング座標系と正規化デバイス座標系

クリッピング座標系は4次元です。なので、図示ができません。
それを標準座標に直した(xyz成分をw成分で除算した)のが正規化デバイス座標系です。
本記事では、平行投影に関する説明ですが、ビュー座標系における視体積を正規化デバイス座標系の標準視体積に変換することで求めます。

平行投影変換行列


ビュー座標系は右手座標系、正規化デバイス座標系は左手座標系とします。
ビュー座標系における視体積のxyz軸の最小値最大値をそれぞれ left,right,bottom,top,far,near とします。

まずは、zを-1倍することにより、右手座標系から左手座標系へ変換します。
この変換で、near\rightarrow-near,far\rightarrow-far となります。

次に、視体積の中心を原点に移します。
この変換前の視体積の中心の座標は、\left(\dfrac{right+left}{2},\dfrac{top+bottom}{2},\dfrac{(-far)+(-near)}{2}=-\dfrac{far+near}{2}\right) です。
このときの変換行列 {\bf M}_{centering} は以下のようになります。

\begin{eqnarray}
{\bf M}_{centering}=
\begin{pmatrix}
1 & 0 & 0 & -\dfrac{right+left}{2}\\
0 & 1 & 0 & -\dfrac{top+bottom}{2}\\
0 & 0 & 1 & \dfrac{far+near}{2}\\
0 & 0 & 0 & 1
\end{pmatrix}\tag{1}
\end{eqnarray}

最後に、視体積の辺の長さを2にします。
この変換前の視体積のxyz軸の長さは、right-left,top-bottom,(-far)-(-near)=-(far-near) です。
このときの変換行列 {\bf M}_{scaling} は以下のようになります。

\begin{eqnarray}
{\bf M}_{scaling}=
\begin{pmatrix}
\dfrac{2}{right-left} & 0 & 0 & 0\\
0 & \dfrac{2}{top-bottom} & 0 & 0\\
0 & 0 & -\dfrac{2}{far-near} & 0\\
0 & 0 & 0 & 1
\end{pmatrix}\tag{2}
\end{eqnarray}

求める平行投影の変換行列を {\bf M}_{ortho} とします。それは、{\bf M}_{centering},{\bf M}_{scaling} を掛け合わせたものとなります。

\begin{eqnarray}
{\bf M}_{ortho}&=&{\bf M}_{scaling}{\bf M}_{centering}\\
&=&
\begin{pmatrix}
\dfrac{2}{right-left} & 0 & 0 & 0\\
0 & \dfrac{2}{top-bottom} & 0 & 0\\
0 & 0 & -\dfrac{2}{far-near} & 0\\
0 & 0 & 0 & 1
\end{pmatrix}
\begin{pmatrix}
1 & 0 & 0 & -\dfrac{right+left}{2}\\
0 & 1 & 0 & -\dfrac{top+bottom}{2}\\
0 & 0 & 1 & \dfrac{far+near}{2}\\
0 & 0 & 0 & 1
\end{pmatrix}\\
&=&
\begin{pmatrix}
\dfrac{2}{right-left} & 0 & 0 & -\dfrac{right+left}{right-left}\\
0 & \dfrac{2}{top-bottom} & 0 & -\dfrac{top+bottom}{top-bottom}\\
0 & 0 & -\dfrac{2}{far-near} & -\dfrac{far+near}{far-near}\\
0 & 0 & 0 & 1
\end{pmatrix}\tag{3}
\end{eqnarray}

near,farの値は何を渡せばよいのか?

検算すると、-near-1 へ、-far1 へ移ります。
よって、near=-zmax,far=-zmin と渡してください。

z反転に関する考察

平行投影変換行列によって、 -near-1 へ、 -far1 へ移るんですが、これは望んだ変換ではありませんよね。
これを解決する、すなわち、near-1 へ、far1 に移すには、(3) の行列の右側にz反転する行列を掛ければよいです。
ですがそうしなかったのは、平行投影変換行列といえば (3) の形が一般的だからです。
WebGL/OpenGLGPUに自分で作成した行列が渡せますので、(3) の形が使いたくない人は、自身で作成してみてください。
(3) は上図を見てもらえばわかりますが、前方面を -near、後方面を -far とする視体積を標準視体積に変換するだけですから、
前方面、後方面についているマイナスを呼び出す側で相殺(-1をかける)しなければならないというわけです。

別名

クリッピング座標系は、同次クリッピング座標系とも言います。
正規化デバイス座標系はクリッピング座標系とも言います。(これは良くないと思う)
そうすると、クリッピング座標系は4次元か3次元のどっちやねんって話になりますが、一般的に「クリッピング座標系は4次元」でよいと思います。
平行投影は直交投影または正射影とも言います。
投影変換は射影変換とも言います。

目次へ戻る