Games101 透视投影矩阵推导

目录

齐次坐标

透视投影

透视投影的四棱锥体挤压为正交投影的长方体 

变换规定

转换过程

观察1

 观察2 

关于任意一点挤压后向哪里移动的问题,简单推导了一下 


齐次坐标

如下,(x, y, z, 1) 表示空间中的xyz点,让它每个分量乘以k,k!=0,得到的齐次坐标也是表示空间中的这个点,同样,乘以z,得到的也是xyz这个点

透视投影

从一个点往外延伸出来一个四棱锥,这个点就是相机,定义 远平面f 和 近平面n,透视投影视椎体的区别就在于它的远平面要比近平面更大,那么如何计算这个不规则的视体矩阵呢?

  1. 将透视相机的Frustum挤压为正交相机的Cuboid
  2. 再用正交投影矩阵相乘与上方变换矩阵相乘,即可得到最终的透视投影矩阵

 

透视投影的四棱锥体挤压为正交投影的长方体 

变换规定

  1. 近平面上的点,挤压后也不会变化
  2. 远平面上的点的z值是f,挤压后的z值仍然是f,它的z值不会发生变化,只是整体在向里面收缩
  3. 箭头指向的远平面中心点,挤压后仍然是中心点(0,0,f)

         

转换过程

 如下,从侧面看向Frustum,蓝色箭头指向的是相机摆放的位置,上方向是Y,朝向-Z方向看,往右边看到的区域是近,远平面的一半

已知n,z,远平面上的xyz点,要把y挤压为 y',根据相似三角形可得 y'/y = n/z

满足如下规律 

 

当然,对于x,同样满足相似三角形规律

 

可得出结论,给定任何一点xyz,它被挤压后的点坐标一定是 (nx/z, ny/z, unkown, 1)T, 挤压的变换的矩阵左乘xyz点即可得到这个点

根据齐次坐标性质,另如下中间的齐次坐标点同乘z,得到的坐标依然不变,那么经过挤压变换后的点,依然可以用右边齐次坐标表示

现在,已知挤压变换后的 x y w 三个分量, 已经可以写出变换矩阵的 1 2 4 行的值

那么,第三行的行向量又是多少呢? 

 

观察

  • 任何一个点在近的平面上经过挤压后不会发生任何变化,也就是,对于近平面上的点(x, y, n, 1) 经过矩阵变换后得到的点仍然是 (x, y, n, 1) (近平面的z值为n)
  • 任何一个点在远的平面上经过挤压后它的xy值会朝里挤,但z值不会发生变化

观察1

挤压后的近平面上的点依然是(x, y, n, 1),另每个分量乘以 n,得到(nx,ny,n^2, n),依然表示这个点,那么我们就探讨什么样的挤压矩阵左乘(x, y, n, 1) 会 得到 (nx,ny,n^2, n)

上面已经推导出挤压变换矩阵的第 1 2 4 行向量,思考: 第三行的向量 *(x, y, n, 1)= n^2

由于点乘的结果是n^2,则必定跟xy没关系,讨论 A和B的取值即可

这里A和B的值并不能确定,因为 A=n, B=0 成立,  A=0, B=n^2 也成立

 观察2 

远平面的中心点经过挤压后它的坐标仍不会变化,依然是(0,0,f)由于w分量需要存储z值,另分量同乘以f,得到下图最右侧齐次坐标,从上 近平面,我们依然讨论挤压矩阵的第三行向量, 向量 * (0, 0, f, 1) = f^2

综观察1,观察2,可以得出如下两个等式

 

n, y已知,两个式子,两个未知数, 很容易得出 A,B的值

至此可解出 Mpersp -> ortho 透视投影的Frustum挤压为正交相机的Cuboid 的变换矩阵

接下来,将 挤压变换矩阵 乘以 正交投影的投影矩阵 即可求出最终的透视投影矩阵

正交投影矩阵推导:Games101 正交投影矩阵推导-优快云博客

 

关于任意一点挤压后向哪里移动的问题,简单推导了一下 

透视投影变换矩阵推导过程如下: 假设有一个三维点 $(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、付费专栏及课程。

余额充值