Chapter 7 Viewing
7.1 Viewing Transformations
大多数图形系统都包含以下三个转换序列
- Camera Transformation, Eye Transformation
- Projection Transformation
- Viewport Trasnformation, Window Transformation
The Viewport Transformation
假定当前的几何物体位于标准视体内,标准视体是一个三维盒体,坐标都满足 ( x , y , z ) ∈ [ − 1 , − 1 ] 3 (x,y,z)\in[-1, -1]^3 (x,y,z)∈[−1,−1]3,如图
在图像边缘的像素都有距离像素中心半个像素的偏离,如果要在 n x ∗ n y n_x*n_y nx∗ny大小的屏幕上画出图像,所以需要将 [ − 1 , 1 ] [-1, 1] [−1,1]映射到 [ − 0.5 , n x − 0.5 ] ∗ [ − 0.5 , n y − 0.5 ] [-0.5, n_x-0.5]*[-0.5, n_y-0.5] [−0.5,nx−0.5]∗[−0.5,ny−0.5]的范围内。
如果希望通过正交摄像机从-z方向进行观察,那么可以使用以下转换进行处理
[ x s c r e e n y s c r e e n 1 ] = [ n x 2 0 n x − 1 2 0 n y 2 n y − 1 2 0 0 1 ] [ x c a n o n i c a l y c a n o n i c a l 1 ] \begin{bmatrix} x_{screen} \\ y_{screen} \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{n_x}{2} & 0 & \frac{n_x - 1}{2} \\ 0 & \frac{n_y}{2} & \frac{n_y - 1}{2} \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x_{canonical} \\ y_{canonical} \\ 1 \end{bmatrix} ⎣⎡xscreenyscreen1⎦⎤=⎣⎡2nx0002ny02nx−12ny−11⎦⎤⎣⎡xcanonicalycanonical1⎦⎤
目前z轴值没有发挥作用,目前就只做保留
M v p = [ n x 2 0 0 n x − 1 2 0 n y 2 0 n y − 1 2 0 0 1 0 0 0 0 1 ] M_{vp} = \begin{bmatrix} \frac{n_x}{2} & 0 & 0 & \frac{n_x - 1}{2} \\ 0 & \frac{n_y}{2} & 0 & \frac{n_y - 1}{2} \\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} Mvp=⎣⎢⎢⎡2nx00002ny0000102nx−12ny−101⎦⎥⎥⎤
7.1.2 The Orthographic Projection Transformation
正交投影中,观察方向是-z,正上方向为+y,视体是一个沿z轴的一个长方体,它的范围是 [ l , r ] ∗ [ b , t ] ∗ [ f , n ] [l,r]*[b,t]*[f,n] [l,r]∗[b,t]∗[f,n],这个长方体称为正交视体。
从正交视体转换到标准视体的矩阵为
M o r t h = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] M_{orth} = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{n+f}{n-f} \\ 0 & 0 & 0 & 1 \end{bmatrix} Morth=⎣⎢⎢⎡r−l20000t−b20000n−f20−r−lr+l−t−bt+b−n−fn+f1⎦⎥⎥⎤
7.1.3 The Camera Transformation
将物体从世界坐标转换到正交摄像机观察坐标的转换矩阵
M c a m = [ u ⃗ v ⃗ w ⃗ e ⃗ 0 0 0 1 ] M_{cam} = \begin{bmatrix} \vec{u} & \vec{v} & \vec{w} & \vec{e} \\ 0 & 0 & 0 & 1 \end{bmatrix} Mcam=[u0v0w0e1]
7.2 Projection Transformations
透视的关键属性是屏幕上物体的大小与观察位置与物体在-z轴方向长度的倒数成比例
表达成为
y s = d z y y_s=\frac{d}{z}y ys=zdy
由于该类型的转换会有一个输入的向量位于分母上,所以不能直接使用仿射变换,可以使用对齐次坐标的在仿射变换中的机制的简单概括来处理除法。
我们使用齐次向量 [ x y z 1 ] T [x\ y\ z\ 1]^T [x y z 1]T来表示点 ( x , y , z ) (x,y,z) (x,y,z),额外的坐标值 w w w总为1,这是因为仿射变换的第四行为 [ 0 0 0 1 ] T [0\ 0\ 0\ 1]^T [0 0 0 1]T,与其认为它是进行转换乘法带来的额外值,我们可以认为它是 x , y , z x,y,z x,y,z坐标的分母,因此 [ x y z w ] T [x\ y\ z\ w]^T [x y z w]T实际表示点 ( x / w , y / w , z / w ) (x/w,y/w,z/w) (x/w,y/w,z/w),当 w = 1 w=1 w=1时,它可以被忽略,但当 w w w不为1时它提供了一个更广泛的转换范围。
具体的来说,线性变换可以表示为
x ′ = a x + b y + c z x' = ax + by + cz x′=ax+by+cz
仿射变换将其扩展为
x ′ = a x + b y + c z + d x' = ax + by + cz + d x′=ax+by+cz+d
将 w w w看做分母可以进一步增加变换的可能性
x ′ = a x + b y + c z + d e x + f y + g z + h x' = \frac{ax + by + cz + d}{ex + fy + gz + h} x′=ex+fy+gz+hax+by+cz+d
可以被称为 x , y , z x,y,z x,y,z的线性有理函数(linear rational function),但是它的限制是三个维度的分母是相同的
x ′ = a 1 x + b 1 y + c 1 z + d 1 e x + f y + g z + h y ′ = a 2 x + b 2 y + c 2 z + d 2 e x + f y + g z + h z ′ = a 3 x + b 3 y + c 3 z + d 3 e x + f y + g z + h x' = \frac{a_1x + b_1y + c_1z + d_1}{ex + fy + gz + h} \\ y' = \frac{a_2x + b_2y + c_2z + d_2}{ex + fy + gz + h} \\ z' = \frac{a_3x + b_3y + c_3z + d_3}{ex + fy + gz + h} x′=ex+fy+gz+ha1x+b1y+c1z+d1y′=ex+fy+gz+ha2x+b2y+c2z+d2z′=ex+fy+gz+ha3x+b3y+c3z+d3
表示为矩阵形式
[ x ^ y ^ z ^ w ^ ] = [ a 1 b 1 c 1 d 1 a 2 b 2 c 2 d 2 a 3 b 3 c 3 d 3 e f g g ] [ x y z 1 ] \begin{bmatrix} \hat{x} \\ \hat{y} \\ \hat{z} \\ \hat{w} \end{bmatrix}=\begin{bmatrix} a_1 & b_1 & c_1 & d_1 \\ a_2 & b_2 & c_2 & d_2 \\ a_3 & b_3 & c_3 & d_3 \\ e & f & g & g \end{bmatrix}\begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} ⎣⎢⎢⎡x^y^z^w^⎦⎥⎥⎤=⎣⎢⎢⎡a1a2a3eb1b2b3fc1c2c3gd1d2d3g⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
和
( x ′ , y ′ , z ′ ) = ( x ^ / w ^ , y ^ / w ^ , z ^ / w ^ ) (x', y', z') = (\hat{x}/\hat{w},\hat{y}/\hat{w},\hat{z}/\hat{w}) (x′,y′,z′)=(x^/w^,y^/w^,z^/w^)
这种转换也被称为投影变换(projective transformation)或者homography
任何标量与矩阵相乘得到的结果都是等价的。
对于齐次向量进行多次变换是没有问题的,不需要考虑 w w w的值,即使在某些中间阶段 w w w的值会为0,只有当我们需要获得笛卡尔坐标时才需要作除以 w w w的操作。
7.3 Persepctive Projection
投影变换使视线投影时除以 z z z值的过程变得容易。图(7-4)中的变换可以表示为
[ y s 1 ] [ d 0 0 0 1 0 ] [ y z 1 ] \begin{bmatrix} y_s \\ 1 \end{bmatrix}~\begin{bmatrix} d & 0 & 0 \\ 0 & 1 & 0 \end{bmatrix}\begin{bmatrix} y \\ z \\ 1 \end{bmatrix} [ys1] [d00100]⎣⎡yz1⎦⎤
它将2D齐次向量 [ y ; z ; 1 ] T [y;z;1]^T [y;z;1]T转换成1D齐次向量 [ d y z ] T [dy\ z]^T [dy z]T,他表示1D点 ( d y / z ) (dy/z) (dy/z)
在3D透视投影矩阵中,由于按照惯例摄像机的朝向为 − z -z −z方向,所以距离是 − z -z −z,结合视锥的远近截面的概念,近截面会作为投影面,所以图像的距离为 − n -n −n。
所以有 y s = ( n / z ) y y_s=(n/z)y ys=(n/z)y, x x x轴向也是一样,这个变换可以表示为透视矩阵
P = [ n 0 0 0 0 n 0 0 0 0 n + f − f n 0 0 1 0 ] P = \begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -fn \\ 0 & 0 & 1 & 0 \end{bmatrix} P=⎣⎢⎢⎡n0000n0000n+f100−fn0⎦⎥⎥⎤
这个矩阵可以起到透视的效果,位于近平面上的点不变,位于远平面上的点挤压x与y的值
P [ x y z 1 ] = [ n x n y ( n + f ) z − f n z ] ∼ [ n x z n y z n + f − f n z 1 ] P\begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}=\begin{bmatrix} nx \\ ny \\ (n+f)z-fn \\ z \end{bmatrix} \sim \begin{bmatrix} \frac{nx}{z} \\ \frac{ny}{z} \\ n + f - \frac{fn}{z} \\ 1 \end{bmatrix} P⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎡nxny(n+f)z−fnz⎦⎥⎥⎤∼⎣⎢⎢⎡znxznyn+f−zfn1⎦⎥⎥⎤
该转换除了对 x x x和 y y y进行了投影缩放之外,还将 z z z值限定在了远近截面之间,可以作为深度值使用。该变换的逆操作为
P − 1 = [ 1 n 0 0 0 0 1 n 0 0 0 0 0 1 0 0 − 1 f n n + f f n ] P^{-1}=\begin{bmatrix} \frac{1}{n} & 0 & 0 & 0 \\ 0 & \frac{1}{n} & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & -\frac{1}{fn} & \frac{n+f}{fn} \\ \end{bmatrix} P−1=⎣⎢⎢⎡n10000n100000−fn1001fnn+f⎦⎥⎥⎤
对于齐次想来来说乘以某个标量不会改变其意义,所以可以进一步化简为
P − 1 = [ f 0 0 0 0 f 0 0 0 0 0 f n 0 0 − 1 n + f ] P^{-1}=\begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 0 & fn \\ 0 & 0 & -1 & n+f \\ \end{bmatrix} P−1=⎣⎢⎢⎡f0000f00000−100fnn+f⎦⎥⎥⎤
结合 P P P和 M o r t h M_{orth} Morth可以生成投影矩阵
M p e r = M o r t h P = [ 2 n r − l 0 l + r l − r 0 0 2 n t − b b + t b − t 0 0 0 f + n n − f 2 f n f − n 0 0 1 0 ] M_{per}=M_{orth}P=\\ \begin{bmatrix} \frac{2n}{r-l} & 0 & \frac{l+r}{l-r} & 0 \\ 0 & \frac{2n}{t-b} & \frac{b+t}{b-t} & 0 \\ 0 & 0 & \frac{f+n}{n-f} & \frac{2fn}{f-n} \\ 0 & 0 & 1 & 0 \end{bmatrix} Mper=MorthP=⎣⎢⎢⎡r−l2n0000t−b2n00l−rl+rb−tb+tn−ff+n100f−n2fn0⎦⎥⎥⎤
7.4 Some Properties of the Perspective Transform
投影变换的最重要的性质是它将线转化为线、平面转化为面。
7.5 Field-of-View
从图中可以看出
t a n θ 2 = t ∣ n ∣ tan\frac{\theta}{2} = \frac{t}{|n|} tan2θ=∣n∣t