視野変換の覚書

視野変換

視野変換のための行列を得る

必要となる座標・空間ベクトル
  • 目の位置 Eye Point = (e_{x}, e_{y}, e_{z})
  • 注視している位置 Target Point  = ( t_{x}, t_{y}, t_{z} )
  • 視線ベクトル


\vec{EV} 
=\left( \begin{array}{c}E_{x}\\E_{y}\\E_{z}\end{array}\right)
=\left( \begin{array}{c}e_{x}-t_{x}\\e_{y}-t_{y}\\e_{z}-t_{z}\end{array}\right)

  • 視線ベクトルの頭上方向のベクトル


\vec{UV}
=\left( \begin{array}{c}U_{x}\\U_{y}\\U_{z}\end{array}\right)
= \left(\begin{array}{c}u_{x}\\u_{y}\\u_{z}\end{array}\right)
, 通常は \left(\begin{array}{c}0\\1\\0\end{array}\right)

Z軸について
  • 視線ベクトルの長さ

 |\vec{EV}|
=\sqrt{{E_{x}}^{2}+{E_{y}}^{2}+{E_{z}}^{2}}
=\sqrt{(e_{x}-t_{x})^{2}+(e_{y}-t_{y})^{2}+(e_{z}-t_{z})^{2}}

  • 視線ベクトルのノルム(単位ベクトル)をZ軸周りのベクトルとする

\vec{Z} = \dfrac{\vec{EV}}{|\vec{EV}|}
=\left(\begin{array}{c}
\dfrac{E_{x}}{\sqrt{{E_{x}}^{2}+{E_{y}}^{2}+{E_{z}}^{2}}}\\
\dfrac{E_{y}}{\sqrt{{E_{x}}^{2}+{E_{y}}^{2}+{E_{z}}^{2}}}\\
\dfrac{E_{z}}{\sqrt{{E_{x}}^{2}+{E_{y}}^{2}+{E_{z}}^{2}}}\\
\end{array}\right)
=\left(\begin{array}{c}
\dfrac{e_{x}-t_{x}}{\sqrt{(e_{x}-t_{x})^{2}+(e_{y}-t_{y})^{2}+(e_{z}-t_{z})^{2}}}\\
\dfrac{e_{y}-t_{y}}{\sqrt{(e_{x}-t_{x})^{2}+(e_{y}-t_{y})^{2}+(e_{z}-t_{z})^{2}}}\\
\dfrac{e_{z}-t_{z}}{\sqrt{(e_{x}-t_{x})^{2}+(e_{y}-t_{y})^{2}+(e_{z}-t_{z})^{2}}}
\end{array}\right)
=\left(\begin{array}{c}Z_{x}\\Z_{y}\\Z_{z}\end{array}\right)


X軸について
  • 頭上方向のベクトルとZ軸のベクトルとのクロス積


\vec{UZ}=\vec{UV}\times\vec{Z}
=\left(\begin{array}{c}U_{x}\\U_{y}\\U_{z}\end{array}\right)\times\left(\begin{array}{c}Z_{x}\\Z_{y}\\Z_{z}\end{array}\right)
=\left(\begin{array}{c}U_{z}Z_{y}-U_{y}Z_{z}\\U_{x}Z_{z}-U_{z}Z_{x}\\U_{y}Z_{x}-U_{x}Z_{y}\end{array}\right)
=\left(\begin{array}{c}UZ_{x}\\UZ_{y}\\UZ_{z}\end{array}\right)

  • クロス積の長さを求める

|\vec{UZ}|=\sqrt{{UZ_{x}}^{2}+{UZ_{y}}^{2}+{UZ_{z}}^{2}}
=\sqrt{(U_{z}Z_{y}-U_{y}Z_{z})^{2}+(U_{x}Z_{z}-U_{z}Z_{x})^{2}+(U_{y}Z_{x}-U_{x}Z_{y})^{2}}

  • クロス積を単位ベクトルとしたものをX軸周りのベクトルとする


\vec{X}
=\dfrac{\vec{UZ}}{|\vec{UZ}|}
=\left(\begin{array}{c}
\dfrac{U_{z}Z_{y}-U_{y}Z_{z}}{\sqrt{(U_{z}Z_{y}-U_{y}Z_{z})^{2}+(U_{x}Z_{z}-U_{z}Z_{x})^{2}+(U_{y}Z_{x}-U_{x}Z_{y})^{2}}}\\
\dfrac{U_{x}Z_{z}-U_{z}Z_{x}}{\sqrt{(U_{z}Z_{y}-U_{y}Z_{z})^{2}+(U_{x}Z_{z}-U_{z}Z_{x})^{2}+(U_{y}Z_{x}-U_{x}Z_{y})^{2}}}\\
\dfrac{U_{y}Z_{x}-U_{x}Z_{y}}{\sqrt{(U_{z}Z_{y}-U_{y}Z_{z})^{2}+(U_{x}Z_{z}-U_{z}Z_{x})^{2}+(U_{y}Z_{x}-U_{x}Z_{y})^{2}}}
\end{array}\right)
=\left(\begin{array}{c}X_{x}\\X_{y}\\X_{z}\end{array}\right)

Y軸について
  • X軸周りのベクトルとZ軸周りのベクトルのクロス積をY軸周りのベクトルとする


\vec{Y}=\vec{X}\times\vec{Z}
=\left(\begin{array}{c}X_{x}\\X_{y}\\X_{z}\end{array}\right)\times\left(\begin{array}{c}Z_{x}\\Z_{y}\\Z_{z}\end{array}\right)
=\left(\begin{array}{c}X_{z}Z_{y}-X_{y}Z_{z}\\X_{x}Z_{z}-X_{z}Z_{x}\\X_{y}Z_{x}-X_{x}Z_{y}\end{array}\right)
=\left(\begin{array}{c}Y_{x}\\Y_{y}\\Y_{z}\end{array}\right)


3軸のベクトルから行列を構成する


M=\left(\begin{array}{cccc}
X_{x} & X_{y} & X_{z} & -(\vec{EV}\cdot\vec{X})\\
Y_{x} & Y_{y} & Y_{z} & -(\vec{EV}\cdot\vec{Y})\\
Z_{x} & Z_{y} & Z_{z} & -(\vec{EV}\cdot\vec{Z})\\
0 & 0 & 0 & 1
\end{array}\right)
=\left(\begin{array}{cccc}
X_{x} & X_{y} & X_{z} & -(E_{x}X_{x}+E_{y}X_{y}+E_{z}X_{z})\\
Y_{x} & Y_{y} & Y_{z} & -(E_{x}Y_{x}+E_{y}Y_{y}+E_{z}Y_{z})\\
Z_{x} & Z_{y} & Z_{z} & -(E_{x}Z_{x}+E_{y}Z_{y}+E_{z}Z_{z})\\
0 & 0 & 0 & 1
\end{array}\right)


点 p(px,py,pz)で視野変換を計算する


p\cdot M=\left(\begin{array}{c}p_{x}\\p_{y}\\p_{z}\\1\end{array}\right)\cdot M
=\left(\begin{array}{c}
p_{x}X_{x}+p_{y}X_{y}+p_{z}X_{z}-E_{x}X_{x}-E_{y}X_{y}-E_{z}X_{z}\\
p_{x}Y_{x}+p_{y}Y_{y}+p_{z}Y_{z}-E_{x}Y_{x}-E_{y}Y_{y}-E_{z}Y_{z}\\
p_{x}Z_{x}+p_{y}Z_{y}+p_{z}Z_{z}-E_{x}Z_{x}-E_{y}Z_{y}-E_{z}Z_{z}\\
1
\end{array}\right)
=\left(\begin{array}{c}P_{x}\\P_{y}\\P_{z}\\1\end{array}\right)


視野錐台による透視投影変換行列

正規化

 
M_{a} = \left(\begin{array}{cccc}
\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{array}\right)

透視変換

 
  M_{b} = \left(\begin{array}{cccc}
  near & 0 & 0 & 0 \\
0 & near & 0 & 0 \\
0 & 0 & \dfrac{far+near}{2} & far\cdot near \\
0 & 0 & -1 & 0
\end{array}\right)

剪断(せんだん)

 
  M_{c} = \left(\begin{array}{cccc}
  1 & 0 & \dfrac{right+left}{2\cdot near} & 0 \\
0 & 1 & \dfrac{top+bottom}{2\cdot near} & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1 
\end{array}\right)

変換行列


  M_{p} = M_{a}\cdot M_{b}\cdot M_{c} =
\left(\begin{array}{cccc}
\dfrac{2\cdot near}{right-left} & 0 & \dfrac{right+left}{right-left} & 0 \\
0 & \dfrac{2\cdot near}{top-bottom} & \dfrac{top+bottom}{top-bottom} & 0 \\
0 & 0 & -\dfrac{far+near}{far-near} & -\dfrac{2\cdot far \cdot near}{far-near} \\
0 & 0 & -1 & 0
\end{array}\right)