從3D空間到2D空間中的映射稱爲viewing transformation。本章將學習如何利用矩陣運算,將已知的3D空間物體映射(可能是平行投影,也可能是透視投影)到2D空間(像平面)中。

7.1 Viewing Transformations

viewing transformations是一系列操作的總稱,這些操作主要完成從3D空間的位置(笛卡爾坐標系下的(x,y,z))到圖像坐標((u,v))的變換。這一系列操作通常可分爲三個變換:

  1. camera transformationeye transformation:用於調整相機位置和位姿;
  2. projection transformation:根據投影類型,將物體從相機空間中映射到x[1,1]y[1,1]的區間中,這個區間圖像稱爲unit image
  3. viewport transformationwindowing transformation:將unit image變換成所需的圖像尺寸。

camera transformation將點的空間坐標轉換到相機坐標系下,也稱爲相機空間;projection transformation將點從相機空間中變換到標準視圖躰中,也就是(x,y,z)[1,1]3的立方體中;viewport transformation將標準視圖躰變換到屏幕空間,也就是最後成像。

7.1.1 The Viewport Transformation

假設所有希望看到的物體都在標準視圖躰((x,y,z)[1,1]3)内,相機觀察方向為z,正交于標準視圖躰。縣規定x=1對應圖像左邊界,x=+1對應圖像右邊界,y=1對應圖像下邊界,y=+1對應圖像上邊界。假設圖像寬高為nxnyviewport transformation就是將平面[1,1]2變換到矩形[0.5,nx0.5]×[0.5,ny0.5]中。

這裏忽略了z軸坐標的原因是,點在空間中的投影距離,并不影響它在像平面中的位置。所以可得到viewport matrix

(7.2)Mvp=[nx200nx120ny20ny1200100001]

7.1.2 The Orthographic Projection Transformation

通常我們并不只希望獲取標準視圖體内的幾何體,而希望在觀察方向和角度固定(沿z+y正立)情況下,能獲得任意矩形體内的幾何體。我們在viewport matrix右側再乘上一個矩陣來獲得所希望的結果,而不是去修改viewport matrix

先定義任意矩形體為[l,r]×[b,t]×[f,n],如下圖所示:

通常稱這樣的矩形骵為``orthographic view volume``,其中:

注意,通常觀察方向都是沿著z方向,正立方向都是沿著+y軸,對於近平面n的值就始終大於遠平面f的值,即n>f。如下圖所示:

現在只要將orthographic view volume變換到canonical view volume,之後在利用viewport matrix變換即可。

(7.3)Morth=[2rl00r+lrl02tb0t+btb002nfn+fnf0001]

繪製orthographic view volume的3D綫段時,就可以結合矩陣(7.2)和矩陣(7.3)來獲取兩個端點在圖像中的位置坐標。

[xpixelypixelzcanonical1]=(MvpMorth)[xyz1]

算法框架如下:

7.1.3 The Camera Transformation

在3D空間中,我們視點位置和觀察角度通常都是任意的,因此,常用以下三個量來定義視點:

  1. “眼睛”的位置e
  2. 視綫方向g;
  3. 正立方向t

如下圖所示

有了這三個信息,就能夠在視點位置構造一個坐標系uvw,也是用於描述相機空間的坐標系。

w=g||g||u=t×w||t×w||v=w×u

被觀察物體改用坐標系uvw表示,這樣,只需要變換視點位置e和基坐標uvw,就能將視點和被觀察物體從世界坐標系oxyz變換到相機坐標系euvw中。

坐標系閒的變換在第六章中做了詳細説明,這裏就不多説,直接上公式:

Mcam=[uvwe0001]1=[xuyuzu0xvyvzv0xwywzw00001][100xe010ye001ze0001]

結合前面的變換,整個viewing transformation的框架如下所示:

總結下,整個viewing transformation過程可以想像成拍照過程,先選好鏡頭和設置相片尺寸(viewport transformation);擺放好相機和被拍攝物體(camera transformation);按下快門(projection transformation)。

7.2 Projective Transformation

射影變換是在相機空間中進行的,通過camera transformation后,視點位置位於相機空間的原點,觀察方向沿著z軸。

在透視投影中,物體在像平面的尺寸,與物體離視點距離的倒數(1/z)成正比。如下圖:

figure7.8

圖中,d表示視平面離視點的距離,ys表示物體在視平面上y軸上的成像位置。利用相似三角形,很容易得到: ys=dzy

一般的仿射變換為: x=ax+by+cz+d

這裏約束齊次坐標系最後一維w=1;若取消這個約束,那麽可以擴展出更多變換,變換形式變化成如下形式: x=ax+by+cz+dex+fy+gz+h

這樣就可獲得關於xyz的三個變換函數:

x=a1x+b1y+c1z+d1ex+fy+gz+hy=a2x+b2y+c2z+d2ex+fy+gz+hz=a3x+b3y+c3z+d3ex+fy+gz+h

這三個變換函數的唯一約束就是分母是相同的。同樣也可使用矩陣形式表示:

[x~y~z~w~]=[a1b1c1d1a2b2c2d2a3b3c3d3efgh][xyz1](x,y,z)=(x~/w~,y~/w~,z~/w~)

可用這種形式表示的變換都可稱爲射影變換(projective transformation)單應性

7.3 Perspective Projection

假設,在3D空間中,視點位於原點,觀測方向沿z軸,可是距離由遠近平面限制。 在透視變換中,將近平面作爲像平面,這樣可簡化推導。更簡單的理解是,先將物體透視投影到一個矩形體上,再利用正交投影進行後續操作。如下面兩圖所示:

這裏先回顧圖(7.8),將圖中ys的計算用矩陣可表示爲:

[ys1][d00010][yz1]

類似的,在3D空間中,xy均可按上面的方式處理,得到變換矩陣:

P=[n0000n00????0010]

這個矩陣中的第1、2、4行已實現了透視方程,而第3行是與z坐標有關,這行的計算值會在之後物體遮擋部分使用到(z-buffer算法)。那第3行的參數是什麽呢?這裏可做如下假設來獲取第3行的參數:

  1. 齊次坐標係中,坐標(x,y,z,1)(kx,ky,kz,k)是表示同一個點;
  2. 位於近平面上的點,經過投影后仍在近平面上;
  3. 位於遠平面上的點,經過投影后仍在遠平面上;

根據這以上的假設,可知:

(1)P[xyz1]=[nxny?z]

對於近平面上的點變換前後始終是:

[xyn1][xyn1]=[nxnyn2n]

與公式(1)對比可知,第3行的計算方式如下:

(2)[00AB][xyn1]=n2An+B=n2

同理,對於遠平面可得: (3)Af+B=f2

聯立等式(2)、(3),求解方程組可得:

{An+B=n2Af+B=f2{A=n+fB=nf

這樣,就能獲得完整的透視變換矩陣:

P=[n0000n0000n+fnf0010]

對於view volume中任一點進行透視變換可得:

P[xyz1]=[nxny(n+f)zfnz][nxznyzn+fnfz1]

而對於矩陣P的逆變換同樣非常簡單:

P1=[1n00001n000001001nfn+fnf]P1=[f0000f00000nf001n+f]

至此,將透視變換矩陣和之前的正交投影矩陣結合,就能得到完整的透視投影矩陣:

Mper=MorthP=[2nrl0l+rlr002ntbt+bbt000f+nnf2fnfn0010]

這樣使用透視投影變換的viewing transformation矩陣可變爲:

M=MvpMorthPMcam

算法框架為:

7.4 透視投影變換的一些特點

投影前後,直綫依然是直綫,平面依然是平面;以綫段爲例,假設原綫段為: q+t(Qq)

經過變換矩陣M后: Mq+t(MQMq)r+t(Rr)

對於3D綫段可變爲:

r+t(Rr)wr+t(wRwr)rwr+f(t)(RwRrwr)

其中,f(t)=wRtwr+t(wRwr)。這一系列變換過程并未改變點的順序,所以從綫段依然變換爲綫段,平面依然變換爲平面。

7.5 Field-of-View

通常,我們會使用(l,r,b,t)n來定義可視窗口,其中:

l=r,b=t

如果成像尺寸(像素)為nx×ny,那麽: nxny=rt

這個比例可稱爲aspect ratio。如果按下圖中所示,在定義θ角度,就能夠簡化可視窗口模型。

其中: (4)tanθ2=t|n|

θ就稱爲field-of-view,等式(4)中定義了垂直方向的field-of-view,同理也可定義水平方向field-of-view。這樣就能將可視窗口模型簡化爲(n,θx,θy,ratioaspect)即可。

FQA

聲明

該文檔是本人閲讀書籍《Fundamentals of Computer Graphics, Fourth_Edition》和學習課程《Games-101:现代计算机图形学入门》時整理的閲讀筆記,文檔中所有圖片主要來自本書截圖、Games-101課件截圖和網絡公開圖片。若發現錯誤,歡迎討論指正:uninitmatrix@gmail.com