透视变换Perspective Transformation
什么是透视变换?图片 透视变换是一个投影过程,其中透视变换就像将人的眼睛当做一个中心点,外部世界是一个大平面,在眼睛与这个平面之间形成一个椎体,然后将这个平面上的内容投射到眼睛内。
为什么变换之后的空间被称为裁切空间?裁切就是把不需要的部分去除掉,就是这幅图片中一样,投影平面在左侧
而在投影中心另一侧的右侧的点我们是不需要的,假设这个点的坐标为
(2,5,10)
应用计算之后是
x′=−102=−0.2
y′=−105=−0.5
z′=−1010=−1
那么这个计算过程是如何进行的呢?根据相似三角形

Figure 1 (从P投射到P')
我们有
EA=zgreen=3BA=zblue=1=EF=yBC=y′
y′=zgreeny∗zblue
其中,由于我们的摄像机是看向−z方向的,所以zgreen在计算的时候前面要加−号,这就是式子y′=−105=−0.5中z的值为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分量,经过这样调整后我们有
1000010000−1000−10
其计算过程正好是我们想要的
x′=w′=−zx′=x,y′=w′=−zy′=y,z′=w′=−zz′=−z=1.
其中z′=wz=−z−z=1, x′=wx=−zx, y′=wy=−zy接下来我们就需要详细计算每个部分了
计算投影点的x′和y′坐标,将范围映射到[-1,1]
r−l2n0r−lr+l00t−b2nt−bt+b0............00−10
将投影点的z坐标重新映射到范围[-1,1]
(我们根据齐次转三维点时, (x,y,z)这三个分量都要除以w分量,我们有
(x′,y′,z′)=(x/w,y/w,z/w)
其中x和y对z无影响),则上一步骤中的矩阵可以设为
r−l2n0r−lr+l00t−b2nt−bt+b000AB00−10
其中A和B是我们要求的,则可以列出等式
z′=w=−z0∗x+0∗y+A∗z+B∗w→w=−zAz+B.
注意这里的w=1是(x,y,z,w=1)中的w,而不是这个矩阵中的w分量
再根据我们已知z正好落在near近平面时应当等于−1,正好落在far远平面时应当等于1, 我们可以列出式子
(−z=−(−n)=n)(z=−n)A+B=−1(−z=−(−f)=f)(z=−f)A+B=1 when z=n when z=f
→ (−nA+B=−n −fA+B=f(1)(2)
A=−f−nf+n
B=−f−n2fn
(也可以映射到[0,1]范围内)
补充资料
- 关于Px′=−PzPx
链接: https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/projection-matrices-what-you-need-to-know-first
-
为什么除以了−z呢?投影过程中的相似三角形中的比例关系
-
关于透视矩阵中的齐次项的−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)
时,我们有
x⋅0+y⋅0+z⋅−1+1⋅0=−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)
- 关于透视矩阵中的z项的−1
链接: https://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/building-basic-perspective-projection-matrix
因为摄像机是朝向−z方向的,所以摄像机前所有的点的z坐标都是负的,这就是为什么【资料1】中
x′=−zx
中的z前方带有负号
透视变换矩阵
Mpersp=r−l2n0000t−b2n00l−rl+rb−tb+tf−nf+n100n−f2nf0
或
Mpersp=r−l2n0r−lr+l00t−b2nt−bt+b000−f−nf+n−n−f2nf00−10
(注意其中两者之间的负号)
则我们有
[x′,y′,z′,w′]=xyzw=1∗Mpersp
其中
w′=0⋅x+0⋅y−1⋅z+0⋅1=−z
计算并验证一下,假设n=1,f=20公式
−z−f−nf+n∗z−f−n2fn
代入n和f并计算得
−z−1921∗z−1940
其中19−21=−1.1和19−40=−2.1则得到结果
z=1→−1−1.1∗1−2.1=3.2
z=−1→1−1.1∗−1−2.1=−1
z=−20→20−1.1∗−20−2.1=0.995
z=−21→21−1.1∗−21−2.1=1.1