透视投影矩阵推导

前提条件:右手系坐标,目标将视锥体内的坐标压缩为x,y,z->[-1,1]
下面开始推导
第一步:把x,y方向上的点压缩,也即如下图所示的把视锥体压缩成长方体在这里插入图片描述
P压缩后的点为 P ′ ( x ′ , y ′ , z ′ ) P'(x',y',z') P(x,y,z).则根据相似定律, y z = y ′ − n , x z = x ′ − n \frac{y}{z}=\frac{y'}{-n},\frac{x}{z}=\frac{x'}{-n} zy=ny,zx=nx
故有

y ′ = − n y / z , x ′ = − n x / z ; y'=-{{ny}\Bigg/{z}},x'=-{{nx}\Bigg/{z}}; y=ny/z,x=nx/z;
现在我们可以推导压缩矩阵 M t \boldsymbol{M}_{\boldsymbol{t}} Mt,将x’,y’替换为x,y,z的表达式.

[ ] [ x y z 1 ] = [ x ′ y ′ z ′ 1 ] = [ − n x / z − n y / z z ′ 1 ] \\ \left[ \begin{matrix} & & & \\ & & & \\ & & & \\ & & & \\ \end{matrix} \right] \left[ \begin{array}{c} x\\ y\\ z\\ 1\\ \end{array} \right] =\left[ \begin{array}{c} x'\\ y'\\ z'\\ 1\\ \end{array} \right] =\left[ \begin{array}{c} {{-nx}\Bigg/{z}}\\ -{{ny}\Bigg/{z}}\\ z'\\ 1\\ \end{array} \right] \\ xyz1 = xyz1 = nx/zny/zz1
可以同乘z消除分子,接下来可以推出压缩矩阵的1,2,4行
[ ] [ x y z 1 ] = [ n x n y ? − z ] ⟶ [ n 0 0 0 0 n 0 0 0 0 − 1 0 ] [ x y z 1 ] = [ n x n y ? − z ] \left[ \begin{matrix} & & & \\ & & & \\ & & & \\ & & & \\ \end{matrix} \right] \left[ \begin{array}{c} x\\ y\\ z\\ 1\\ \end{array} \right] =\left[ \begin{array}{c} nx\\ ny\\ ?\\ -z\\ \end{array} \right] \longrightarrow \left[ \begin{matrix} n& 0& 0& 0\\ 0& n& 0& 0\\ & & & \\ 0& 0& -1& 0\\ \end{matrix} \right] \left[ \begin{array}{c} x\\ y\\ z\\ 1\\ \end{array} \right] =\left[ \begin{array}{c} nx\\ ny\\ ?\\ -z\\ \end{array} \right] \\ xyz1 = nxny?z n000n0001000 xyz1 = nxny?z
接下来观察压缩后的长方体,可以发现(0,0,-n)和(0,0,-f)点压缩后坐标不变故有
[ 0 0 − n 1 ] 和 [ 0 0 − f 1 ] [ n 0 0 0 0 n 0 0 0 0 A B 0 0 − 1 0 ] [ 0 0 − n 1 ] = [ 0 0 − A n + B n ] = [ 0 0 − n n n ] , n 2 = A n − B [ n 0 0 0 0 n 0 0 0 0 A B 0 0 − 1 0 ] [ 0 0 − f 1 ] = [ 0 0 − A f + B f ] = [ 0 0 − f f f ] , f 2 = A f − B 解得 A = n + f , B = n f , \left[ \begin{array}{c} 0\\ 0\\ -n\\ 1\\ \end{array} \right] \text{和}\left[ \begin{array}{c} 0\\ 0\\ -f\\ 1\\ \end{array} \right] \\ \left[ \begin{matrix} n& 0& 0& 0\\ 0& n& 0& 0\\ 0& 0& A& B\\ 0& 0& -1& 0\\ \end{matrix} \right] \left[ \begin{array}{c} 0\\ 0\\ -n\\ 1\\ \end{array} \right] =\left[ \begin{array}{c} 0\\ 0\\ -An+B\\ n\\ \end{array} \right] =\left[ \begin{array}{c} 0\\ 0\\ -nn\\ n\\ \end{array} \right] ,n^2=An-B \\ \left[ \begin{matrix} n& 0& 0& 0\\ 0& n& 0& 0\\ 0& 0& A& B\\ 0& 0& -1& 0\\ \end{matrix} \right] \left[ \begin{array}{c} 0\\ 0\\ -f\\ 1\\ \end{array} \right] =\left[ \begin{array}{c} 0\\ 0\\ -Af+B\\ f\\ \end{array} \right] =\left[ \begin{array}{c} 0\\ 0\\ -ff\\ f\\ \end{array} \right] ,f^2=Af-B \\ \text{解得}A=n+f,B=nf, \\ 00n1 00f1 n0000n0000A100B0 00n1 = 00An+Bn = 00nnn ,n2=AnB n0000n0000A100B0 00f1 = 00Af+Bf = 00fff ,f2=AfB解得A=n+f,B=nf,
故此矩阵
[ n 0 0 0 0 n 0 0 0 0 n + f n f 0 0 − 1 0 ] , 即为压缩矩阵, 接下来右乘平移矩阵把长方体中心移动到原点,再右乘缩放矩阵,将长方体变成2*2*2, [ 2 n ∗ tan ⁡ ∗ a s p e c t 0 0 0 0 2 n ∗ tan ⁡ 0 0 0 0 2 f − n 0 0 0 0 1 ] , \left[ \begin{matrix} n& 0& 0& 0\\ 0& n& 0& 0\\ 0& 0& n+f& nf\\ 0& 0& -1& 0\\ \end{matrix} \right] ,\text{即为压缩矩阵,} \\ \text{接下来右乘平移矩阵把长方体中心移动到原点,再右乘缩放矩阵,将长方体变成2*2*2,} \\ \left[ \begin{matrix} \frac{2}{n*\tan *aspect}& 0& 0& 0\\ 0& \frac{2}{n*\tan}& 0& 0\\ 0& 0& \frac{2}{f-n}& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] , \\ n0000n0000n+f100nf0 ,即为压缩矩阵,接下来右乘平移矩阵把长方体中心移动到原点,再右乘缩放矩阵,将长方体变成2*2*2 ntanaspect20000ntan20000fn200001 ,
[ 1 n ∗ tan ⁡ ∗ a s p e c t 0 0 0 0 1 n ∗ tan ⁡ 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 0 0 1 0 0 0 0 1 f + n 2 0 0 0 1 ] [ n 0 0 0 0 n 0 0 0 0 n + f n f 0 0 − 1 0 ] = [ 1 n ∗ tan ⁡ ∗ a s p e c t 0 0 0 0 1 n ∗ tan ⁡ 0 0 0 0 2 n − f 0 0 0 0 1 ] [ n 0 0 0 0 n 0 0 0 0 f + n 2 n f 0 0 − 1 0 ] = [ 1 tan ⁡ ∗ a s p e c t 0 0 0 0 1 tan ⁡ 0 0 0 0 − f + n f − n − 2 n f f − n 0 0 − 1 0 ] \left[ \begin{matrix} \frac{1}{n*\tan *aspect}& 0& 0& 0\\ 0& \frac{1}{n*\tan}& 0& 0\\ 0& 0& \frac{2}{n-f}& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] \left[ \begin{matrix} 1& 0& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1& \frac{f+n}{2}\\ 0& 0& 0& 1\\ \end{matrix} \right] \left[ \begin{matrix} n& 0& 0& 0\\ 0& n& 0& 0\\ 0& 0& n+f& nf\\ 0& 0& -1& 0\\ \end{matrix} \right] \\ =\left[ \begin{matrix} \frac{1}{n*\tan *aspect}& 0& 0& 0\\ 0& \frac{1}{n*\tan}& 0& 0\\ 0& 0& \frac{2}{n-f}& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] \left[ \begin{matrix} n& 0& 0& 0\\ 0& n& 0& 0\\ 0& 0& \frac{f+n}{2}& nf\\ 0& 0& -1& 0\\ \end{matrix} \right] =\left[ \begin{matrix} \frac{1}{\tan *aspect}& 0& 0& 0\\ 0& \frac{1}{\tan}& 0& 0\\ 0& 0& -\frac{f+n}{f-n}& -\frac{2nf}{f-n}\\ 0& 0& -1& 0\\ \end{matrix} \right] ntanaspect10000ntan10000nf200001 100001000010002f+n1 n0000n0000n+f100nf0 = ntanaspect10000ntan10000nf200001 n0000n00002f+n100nf0 = tanaspect10000tan10000fnf+n100fn2nf0
这个最终的矩阵就是OpenGL的透视投影矩阵

透视投影变换矩阵推导过程如下: 假设有一个三维点 $(X,Y,Z)$,它在相机坐标系中的坐标为 $(X_c,Y_c,Z_c)$。相机坐标系的原点为相机位置,$Z_c$ 指向相机朝向的反方向,$X_c$ 和 $Y_c$ 分别与相机的右方向和下方向对齐。 为了把相机坐标系中的点映射到图像平面上,我们需要进行透视投影变换。首先,我们将相机坐标系中的点转换为齐次坐标 $(X_c,Y_c,Z_c,1)$。然后,我们将它乘以一个投影矩阵 $P$,得到一个新的齐次坐标 $(u,v,w,1)$: $$ \begin{bmatrix} u \\ v \\ w \\ 1 \\ \end{bmatrix} = P \cdot \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \\ \end{bmatrix} $$ 其中,$u$ 和 $v$ 分别表示图像平面上的坐标,$w$ 用来进行透视除法,保证 $u$ 和 $v$ 的值在图像平面上。 投影矩阵 $P$ 可以分解为相机内参矩阵 $K$ 和相机外参矩阵 $[R|t]$ 的乘积: $$ P = K [R|t] $$ 其中,$K$ 是一个 $3 \times 3$ 的矩阵,包含了相机的内部参数,如焦距、主点等。$[R|t]$ 是一个 $3 \times 4$ 的矩阵,包含了相机的外部参数,如相机的旋转和平移。 为了推导 $P$ 的具体形式,我们可以先考虑一个简单的情况:相机坐标系的原点与图像平面重合,且相机的朝向与图像平面平行。这种情况下,投影矩阵可以表示为: $$ P = \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} $$ 其中,$f$ 是焦距,表示相机到图像平面的距离。 当相机坐标系的原点和图像平面不重合时,我们可以使用相机外参矩阵 $[R|t]$ 来把相机坐标系的原点变换到图像平面上。具体来说,我们可以将相机坐标系的原点变换为 $(X_c',Y_c',Z_c')$,其中 $(X_c',Y_c',0)$ 是图像平面上的点。这个变换可以表示为: $$ \begin{bmatrix} X_c' \\ Y_c' \\ Z_c' \\ 1 \\ \end{bmatrix} = [R|t] \cdot \begin{bmatrix} 0 \\ 0 \\ 0 \\ 1 \\ \end{bmatrix} $$ 然后,我们可以把 $(X,Y,Z)$ 变换为 $(X',Y',Z')$,其中 $(X',Y')$ 是图像平面上的坐标。这个变换可以表示为: $$ \begin{bmatrix} X' \\ Y' \\ Z' \\ 1 \\ \end{bmatrix} = [R|t] \cdot \begin{bmatrix} X \\ Y \\ Z \\ 1 \\ \end{bmatrix} $$ 最后,我们可以将 $(X',Y',Z')$ 投影到图像平面上,得到一个新的齐次坐标 $(u,v,w,1)$。这个投影可以表示为: $$ \begin{bmatrix} u \\ v \\ w \\ 1 \\ \end{bmatrix} = K \cdot \begin{bmatrix} X'/Z' \\ Y'/Z' \\ 1 \\ \end{bmatrix} $$ 将以上三个变换组合起来,我们可以得到透视投影变换矩阵的形式: $$ P = K [R|t] = \begin{bmatrix} f_x & 0 & c_x & 0 \\ 0 & f_y & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_1 \\ r_{21} & r_{22} & r_{23} & t_2 \\ r_{31} & r_{32} & r_{33} & t_3 \\ \end{bmatrix} $$ 其中,$f_x$ 和 $f_y$ 是 $K$ 矩阵的对角线元素,分别表示 $x$ 和 $y$ 方向上的焦距;$c_x$ 和 $c_y$ 是 $K$ 矩阵的中心点,表示图像平面上的主点;$r_{ij}$ 和 $t_i$ 是 $[R|t]$ 矩阵的元素,表示相机的旋转和平移。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一丈鹿原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值