从屏幕空间变换回局部空间

114 阅读2分钟

模型空间(Local Space), 世界空间(World Space), 视空间(View/Eye Space)间变换点或向量是容易的, 只需要操作矩阵与逆矩阵即可.

点或向量NDC屏幕空间(Screen Space)间变换也是容易的, 不做介绍.

真正的难点是如何将点或向量NDC变换回到视空间.

将点从NDC变换回视空间(以透视投影为例)

有投影矩阵:

[A0000B0000T1T200E10]\begin{bmatrix} A & 0 & 0 & 0\\ 0 & B & 0 & 0\\ 0 & 0 & T_1 & T_2\\ 0 & 0 & E_1 & 0\\ \end{bmatrix}

有在视空间上的点(齐次坐标, Pw=1.0P_w = 1.0表示该齐次坐标代表一个点)

P=(PxPyPz1.0)P = \begin{pmatrix} P_x \\ P_y \\ P_z \\ 1.0 \end{pmatrix}

已知N=C/Cw(C:P在裁剪空间的表示,N:PNDC中的表示)N = C/C_w(C: P在裁剪空间的表示, N: P在NDC中的表示), 可变形为C=NCwC = NC_w. 但CwC_w是未知量, 我们需要根据已有条件去推断它, 即建立这样一个关系: f:NCwf: N\rightarrow C_w.

推断f:NCwf: N\rightarrow C_w

已知

Cw=E1Pz(1)C_w = E_1P_z\tag{1}

C=NCw\because C=NC_w Cz=NzCw\therefore C_z=N_zC_w\Longrightarrow

T1Pz+T2=NzCw(2)T_1P_z+T_2=N_zC_w\tag{2}

变形(1)式, 得:

Pz=Cw/E1P_z=C_w/E_1

带入(2)式, 得:

T1E1Cw+T2=NzCw(NzT1E1)Cw=T2Cw=T2NzT1E1\frac{T_1}{E_1}C_w+T_2=N_zC_w\\ \Rightarrow(N_z-\frac{T_1}{E_1})C_w=T_2\\ \Rightarrow C_w=\frac{T_2}{N_z-\frac{T_1}{E_1}}\\

已知CwC_w, 那么NDC裁剪空间的变换即为

C=NCwC=NT2NzT1E1C=NC_w\Rightarrow C=N\frac{T2}{N_z - \frac{T1}{E1}}

裁剪空间视空间就简单了, 乘以一个投影矩阵的逆矩阵就可以了

P=Proj1CP=Proj1(NT2NzT1E1)P=Proj^{-1}C\Rightarrow P=Proj^{-1}(N\frac{T2}{N_z - \frac{T1}{E1}})

向量能否在视空间NDC间自由变换(在透视变换中)

先说答案, 不能.

视空间上的向量可以用齐次坐标表示为

P=(PxPyPz0.0)\overrightarrow{P}= \begin{pmatrix} P_x \\ P_y \\ P_z \\ 0.0 \end{pmatrix}

变换到裁剪空间

C=(APxBPyT1PzE1Pz)\overrightarrow{C}= \begin{pmatrix} AP_x \\ BP_y \\ T_1P_z \\ E_1P_z \end{pmatrix}

经过透视除法到NDC

N=(APx/E1PzBPy/E1PzT1/E11.0)\overrightarrow{N}= \begin{pmatrix} AP_x/E_1P_z \\ BP_y/E_1P_z \\ T_1/E_1 \\ 1.0 \end{pmatrix}

容易发现, Nz=T1/E1N_z=T_1/E_1, T1/E1T_1/E_1常大于1, 也就是说向量P\overrightarrow{P}经过变换后绝大多数情况下会被直接裁剪掉, 就算通过, P\overrightarrow{P}也会被拍扁到Z平面T1/E1T_1/E_1上, 丢失深度信息.

所以向量P\overrightarrow{P}不可能从视空间变换到NDC; 同理, 向量N\overrightarrow{N}也不可能从NDC变换到视空间.

但要注意, 向量在视空间裁剪空间间变换是没有问题的, 因为不牵涉到透视除法.

那么, 在正射投影中, 向量能否在视空间NDC间自由变换呢?

能!

为什么?

因为没有该死的透视除法了🙃.

小贴士: 正射投影矩阵长这样👉

[A0000B0000T1T20001]\begin{bmatrix} A & 0 & 0 & 0\\ 0 & B & 0 & 0\\ 0 & 0 & T_1 & T_2\\ 0 & 0 & 0 & 1\\ \end{bmatrix}

参考资料