透视投影推导

本文章为毕业设计的附录

 

投影公式的作用

投影公式将变换几何体到一个新的空间体中,称为规范视域体(canonical view volume),规范视域体的精确坐标可能在不同的图形API之间互不相同,但作为讨论起见,把它认为是从(-1, -1, 0)延伸至(1, 1, 1)的盒子,这也是Direct3D中使用的。一旦所有顶点被映射到规范视域体,只有它们的x和y坐标被用于映射到屏幕上。这并不代表z坐标是无用的,它通常被深度缓冲用于可见度测试。这就是为什么变换到一个新的空间体中,而不是投影到一个平面上。

正交投影(Orthographic Projection)

        正交投影,所有的投影线都与最终的绘图表面垂直,是一种相对简单的投影技术。正交投影的视域体,也就是包含所有需要显示的几何体的可视空间——是一个将被变换到规范视域体的轴对齐盒子

       视域体由6个面定义:

        

        因为视域体和规范视域体都是轴对齐盒子,这种类型的投影很像每个坐标点只是丢弃了z坐标。对象在3D空间中的大小和在投影中的大小相同,即使一个对象比另一个对象距离摄像机远很多。在3D空间中平行的直线在最终的图像上也是平行的。正交投影虽然用的少,但是他的推导过程有一部分可以用在下文的透视投影。

       正交投影推导最简单的方法可能是3个坐标轴分开考虑,并且计算如何沿着每个坐标轴将点从视域体映射到规范视域体。从x轴开始,视域体中的点的x坐标范围在[l, r],想把它变换到范围在[-1, 1]:

        现在,范围的一端是0,而x值的范围是2个单位宽,从1到-1,所以把各项乘以2/(r-l)。注意r-l是视域体的宽度,因此始终是一个正数,所以不用担心不等号会改变方向:

    

        最终:

        这个不等式的中间项告诉了我们把x转换到规范视域体的公式:

       同理,只要用y替代x,用t替代r,用b替代l:

        最后,需要推导z的变换公式。z的推导有点不同,因为需要把z映射到范围[0, 1]而不是[-1, 1],但看上去很相似。z坐标最开始在范围[n,f]:

        这样便给出了z的变换公式

        现在,可以准备写正交投影矩阵了。总结到目前为止的工作,推导了3个投影公式:

        如果写成矩阵形式,就得到了:

        

        透视投影(Perspective Projection)

        透视投影是稍复杂的一种投影方法,并且用的越来越平凡,因为它创造了距离感,因此会生成更逼真的图像。从几何上说,这种方法与正交投影不同的地方在于透视投影的视域体是一个平截头体——也就是,一个截断的金字塔,而不是一个轴对称盒子。

        视域体的近平面从(l,b, n)延伸至(r, t, n)。远平面范围是从原点发射穿过近平面四个点的射线直至与平面z=f相交。由于视域体从原点进一步延伸,它变得越来越宽大;将这个形状变换到规范视域体盒子;视域体的远端比视域体近端压缩的更厉害。因此,视域体远端的物体会变得更小,这就给了距离感。

        由于空间体形状的这种变换,透视投影不能像正交投影那样简单的表达为一个平移和一个缩放。它可以分2个步骤:

        第1步: 给定视域体中的点(x, y, z),把它投影到近平面z=n。由于投影点在近平面上,所以它的x坐标范围在[l, r],y坐标范围在[b, t]。

        第2步: 使用正交投影中的公式,把x坐标从[l, r]映射到[-1, 1],把y坐标范围从[b, t]映射到[-1, 1]。如下图,两个三角形明显相似。

     

则图中L2为

         因此,x坐标是x * n/z,y坐标是y * n/z。第一步做完了。

        第二步只是简单的执行你上一部分做的同样的映射,所以是时候回顾下正交投影的推导公式了。回想下把x和y坐标映射到规范视域体,像这样:

        现在你可以再次调用这些公式,除非你要考虑到投影;所以,把x用x * n/z代替,把y用y * n/z代替:

        现在,通过乘以z:

        这些结果有点奇怪。为了把这些等式写进矩阵,你需要把它们写成这种形式:

        但很明显,现在还做不到,所以现在看起来进入了僵局。应该做什么呢?如果你能找到个办法获得z'z的公式就像x'z和y'z那样,你就可以写一个变换矩阵把(x, y, z)映射到(x'z, y'z, z'z)。然后,你只需要把各部分除以点z,你就会得到你想要的(x', y', z')。

        因为你知道z到z'的转换不依赖于x和y,你知道你想要一个公式形如z'z= pz + q,p和q是常量。并且,你可以很容易的找到那些常量,因为你知道在两种特殊情况下如何得到z': 因为你要把[n, f]映射到[0, 1],你知道当z=n时z'=0,和z=f时z'=1。当你把第一组值代入z'z = pz + q,你可以解得:

        现在,把第二组值代入,得到:

        把q的值代入等式,你可以很容易的解得p:

        现在你有p的值了,并且刚刚你求得了q= –pn,所以你可以解得q:

        最后,把p和q的表达式代入最原始的公式中,得:

        你就快完成了,但是你处理这个问题的不寻常的性质需要你也处理齐次坐标w。通常情况下,只是简单的设置w' = 1 ——你可能已经注意到在一个基本的变换下最后一行总是[0, 0, 0, 1]---但是现在你在为点(x'z, y'z, z'z, w'z)写一个变换。所以取而代之的,把w' = 1写成w'z = z。因此最后用于透视投影的等式如下:

        现在,当你把这个等式写成矩阵的形式,得到:

        当你把这个矩阵用于点(x, y, z, 1),它将产生(x'z, y'z, z'z, w'z)。这就是透视投影矩阵,而这个矩阵生成的(x'z, y'z, z'z, w'z),当他进行齐次除法,除以z,得到(x', y', z', w'),即(x', y', z', 1),其中(x', y', z'),由于我们是用在视锥体的点做的推导,则该点一定在上文所述的从(-1, -1, 0)延伸至(1, 1, 1)的盒子里,即不会被裁剪,则满足x', y', z'的绝对值都小于1,即x'z, y'z, z'z的绝对值都小于等于w'z的绝对值。

而推广到整个空间,空间内任意一个点,经过透视投影矩阵变换后,也会生成一个与(x'z, y'z, z'z, w'z) 同样形式的点(x,y,z,w),此时如果该点在视锥体内,那他必须满足:

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
透视投影变换矩阵的推导过程如下: 假设有一个三维点 $(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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值