遠近法(perspective)のz値について
参考
右手座標系において、z=-zNearのときz'=-zNear、z=-zFarのときz'=zFarとなるような
\[
z' = az+b
\]
を考え、以下の連立方程式をa,bについて解く。
\[
\left\{
\begin{array}{1}
-N &=& a(-N)+b \\
F &=& a(-F)+b
\end{array}
\right.
\]
連立方程式の一つ目の式をb=の形にし、二つ目の式に代入しaについて解く。
\[
b = -N+aN \\
F = -aF-N+aN \\
F+N = -a(F-N) \\
\therefore a = -\frac{F+N}{F-N} \\
\]
b=の式にaを代入する。
\[
b = -N-\frac{F+N}{F-N}N = \frac{-N(F-N)-N(F+N)}{F-N} \\
\therefore b = -\frac{2FN}{F-N}
\]
結果として以下の変換式が得られる。
\[
z' = -\frac{F+N}{F-N}z-\frac{2FN}{F-N}
\]
WolframAlpha
にて以下のクエリで確認できる。
-N=a*-N+b, F=a*-F+bをa,bについて解く
検証
zNear=1、zFar=10の場合について検証する。
\[
z' = -\frac{10+1}{10-1}z-\frac{2\cdot10\cdot1}{10-1} = -\frac{11}{9}z-\frac{20}{9} \\
w' = -z
\]
z=-1のとき
\[
z' = \frac{11}{9}-\frac{20}{9} = -1 \\
w' = 1 \\
z'/w' = -1
\]
z=-10のとき
\[
z' = \frac{110}{9}-\frac{20}{9} = 10 \\
w' = 10 \\
z'/w' = 1
\]
これらにより深度値(z'/w')は右手座標系で最も近いとき-1、最も遠いとき1になる。
WolframAlpha 用クエリ
a=-(F+N)/(F-N)*z-(2*F*N)/(F-N), N=1, F=10, z=-1
b=-(F+N)/(F-N)*z-(2*F*N)/(F-N), N=1, F=10, z=-10