遠近法(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