透视投影矩阵推导The Perspective Projection Matrix Derivation Part2


DirectX 透视投影矩阵推导,DX和OpenGL有一些区别

  • 坐标系不同:DirectX LHS左手坐标系Z反向指向屏幕,而OpenGL是右手坐标系
  • NDC定义不同: Z的范围为[0,1] OpenGL中为[-1,1]
  • DirectX HLSL中的Matrix默认为 column major(本文中我们还是以row-major来进行推导)

由此我们按照Part1的方法,以DirectX环境中值来进行一遍推导

Step1 正交化处理

对于点P(x,y,z,1)P(x,y,z,1),经过投影变换乘以透视矩阵得到PP'PP'位于Normalized Device Coordinates(NDC)中。

MprojP=PPx[1,1]Py[1,1]Pz[0,1]M_{proj}P = P' \newline
P'{x} \in [-1,1] \newline
P'
{y} \in [-1,1] \newline
P'_{z} \in [0,1]

更具三角形等比公式

P=(nzx,nzy,f(z),1)P'=(\frac{n}{z}x,\frac{n}{z}y,f(z),1), 正交化之前P=(nx,ny,g(z),z)P'=(nx,ny,g(z),z)

g(z)=az+bg(z)=az+b

[????????00ab0010][xyz1]=[nxnyaz+bz]\begin{bmatrix}
? & ? & ? & ? \
? & ? & ? & ? \
0 & 0 & a & b \
0 & 0 & 1 & 0 \
\end{bmatrix}
\begin{bmatrix}
x \
y \
z \
1 \
\end{bmatrix}
=
\begin{bmatrix}
nx \
ny \
az+b\
z
\end{bmatrix}

取NDC近平面左下角Plbn=(l,b,n,1)P_{lbn}=(l,b,n,1)和远平面右上角Prtf=(r,t,f,1)P_{rtf}=(r,t,f,1)

经过投影变换

Plbn=(l,b,n,1)(1,1,0,1)(n,n,0,n)P_{lbn}=(l,b,n,1) \rightarrow (-1,-1,0,1) \leftrightarrow(-n,-n,0,n)

Prtf=(r,t,f,1)(1,1,1,1)(f,f,f,f)P_{rtf}=(r,t,f,1) \rightarrow (1,1,1,1)\leftrightarrow(f,f,f,f)

得到
an+b=0af+b=fan+b=0\newline
af+b=f

求得
a=ffnb=fnfna=\frac{f}{f-n} \newline
b=\frac{fn}{f-n}

[????????00ffnfnfn0010][xyz1]=[??f(z+n)fnz]\begin{bmatrix}
? & ? & ? & ? \
? & ? & ? & ? \
0 & 0 & \frac{f}{f-n} & \frac{fn}{f-n} \
0 & 0 & 1 & 0 \
\end{bmatrix}
\begin{bmatrix}
x \
y \
z \
1 \
\end{bmatrix}
=
\begin{bmatrix}
? \
? \
\frac{f(z+n)}{f-n}\
z
\end{bmatrix}

Step2 求解前两行

类似Part1 我们定义8个矩阵变量.
[ABCDEFGH00ffnfnfn0010]\begin{bmatrix}
A & B & C & D \
E & F & G & H \
0 & 0 & \frac{f}{f-n} & \frac{fn}{f-n} \
0 & 0 & 1 & 0 \
\end{bmatrix}

可以得到 B D E H为0

[A0C00FG000ffnfnfn0010]\begin{bmatrix}
A & 0 & C & 0 \
0 & F & G & 0 \
0 & 0 & \frac{f}{f-n} & \frac{fn}{f-n} \
0 & 0 & 1 & 0 \
\end{bmatrix}

取两点 S(l,b,n,1)(n,n,0,n)S(l,b,n,1) \rightarrow(-n,-n,0,n)T(r,t,n,1)(n,n,0,n)T(r,t,n,1)\rightarrow(n,n,0,n),代入矩阵得到方程组

Al+Cn=nAr+Cn=nFb+Gn=nFt+Gn=nAl+Cn=-n \newline
Ar+Cn=n \newline
Fb+Gn=-n \newline
Ft+Gn=n

求解

A=2nrlC=r+lrlF=2ntbG=t+btbA=\frac{2n}{r-l} \newline
C=-\frac{r+l}{r-l} \newline
F=\frac{2n}{t-b} \newline
G=-\frac{t+b}{t-b} \newline

设viewport对称:

r+l=0rl=wt+b=0tb=hr+l=0 \newline
r-l=w \newline
t+b=0 \newline
t-b=h

得到最终矩阵

[2nw00002nh0000ffnfnfn0010][xyz1]=[2nxw2nyhf(z+n)fnz]\begin{bmatrix}
\frac{2n}{w} & 0 & 0 & 0 \
0 & \frac{2n}{h} & 0 & 0 \
0 & 0 & \frac{f}{f-n} & \frac{fn}{f-n} \
0 & 0 & 1 & 0 \
\end{bmatrix}
\begin{bmatrix}
x \
y \
z \
1 \
\end{bmatrix}
=
\begin{bmatrix}
\frac{2nx}{w} \
\frac{2ny}{h} \
\frac{f(z+n)}{f-n}\
z
\end{bmatrix}