Perspective transformation

透视变换Perspective Transformation

什么是透视变换?图片 透视变换是一个投影过程,其中透视变换就像将人的眼睛当做一个中心点,外部世界是一个大平面,在眼睛与这个平面之间形成一个椎体,然后将这个平面上的内容投射到眼睛内。

为什么变换之后的空间被称为裁切空间?裁切就是把不需要的部分去除掉,就是这幅图片中一样,投影平面在左侧

而在投影中心另一侧的右侧的点我们是不需要的,假设这个点的坐标为

(2,5,10)

应用计算之后是

x=210=0.2y=510=0.5z=1010=1

那么这个计算过程是如何进行的呢?根据相似三角形


Figure 1 (从P投射到P')

我们有

BA=zblue=1EA=zgreen=3=BC=yEF=yy=yzbluezgreen

其中,由于我们的摄像机是看向z方向的,所以zgreen在计算的时候前面要加号,这就是式子y=510=0.5z的值为10,计算是为10


Look at the projection from another aspect

步骤

假设我们有一个矩阵

[1000010000100001]

我们先让z坐标分量等于1,这样计算后的z就等于1,就可以满足如Figure 1中的

z=z=1

接下来,再调整w分量从

[0,0,0,1][0,0,1,0]

这样一来,当除以w分量从齐次转三维中的点时,除以w分量相当于除以了z分量,经过这样调整后我们有

[1000010000110000]

其计算过程正好是我们想要的

(x=x1+y0+z0+10=xy=x0+y1+z0+10=yz=x0+y0+z(1)+10=zw=x0+y0+z(1)+10=zx=x=xw=z,y=y=yw=z,z=z=zw=z=1.

其中z=zw=zz=1,  x=xw=xz,  y=yw=yz接下来我们就需要详细计算每个部分了

计算投影点的xy坐标,将范围映射到[-1,1]

[2nrl0...002ntb...0r+lrlt+btb...100...0]

将投影点的z坐标重新映射到范围[-1,1]

(我们根据齐次转三维点时, (x,y,z)这三个分量都要除以w分量,我们有

(x,y,z)=(x/w,y/w,z/w)

其中xyz无影响),则上一步骤中的矩阵可以设为

[2nrl00002ntb00r+lrlt+btbA100B0]

其中AB是我们要求的,则可以列出等式

z=0x+0y+Az+Bww=zAz+Bw=z.

注意这里的w=1(x,y,z,w=1)中的w,而不是这个矩阵中的w分量
再根据我们已知z正好落在near近平面时应当等于1,正好落在far远平面时应当等于1, 我们可以列出式子

((z=n)A+B(z=(n)=n)=1 when z=n(z=f)A+B(z=(f)=f)=1 when z=f(nA+B=n(1)fA+B=f(2)A=f+nfnB=2fnfn

(也可以映射到[0,1]范围内)

补充资料

  1. 关于Px=PxPz

链接: https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/projection-matrices-what-you-need-to-know-first

  1. 为什么除以了z呢?投影过程中的相似三角形中的比例关系

  2. 关于透视矩阵中的齐次项的1

链接: https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/building-basic-perspective-projection-matrix

将原来透视矩阵中的(0,0,0,1)变为(0,0,1,0)之后, 就说当我们用这个透视矩阵的w分量乘以一个齐次点

(x,y,z,1)

时,我们有

x0+y0+z1+10=z

也就是说,这个齐次点w的值经过矩阵计算之后从之前的1变为了z,同时,齐次点(x,y,z)变为三维点时需要经过(x/w,y/w,z/w),此时这样就有

(x/w,y/w,z/w)(x/z,y/z,z/z)
  1. 关于透视矩阵中的z项的1

链接: https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/building-basic-perspective-projection-matrix

因为摄像机是朝向z方向的,所以摄像机前所有的点的z坐标都是负的,这就是为什么【资料1】中

x=xz

中的z前方带有负号

透视变换矩阵

Mpersp=[2nrl0l+rlr002ntbb+tbt000f+nfn2nfnf0010]

Mpersp=[2nrl00002ntb00r+lrlt+btbf+nfn1002nfnf0]
(注意其中两者之间的负号)

则我们有

[x,y,z,w]=[xyzw=1]Mpersp

其中

w=0x+0y1z+01=z

计算并验证一下,假设n=1f=20公式

f+nfnz2fnfnz

代入nf并计算得

2119z4019z

其中2119=1.14019=2.1则得到结果

z=11.112.11=3.2z=11.112.11=1z=201.1202.120=0.995z=211.1212.121=1.1