Computer Graphics note(2):視圖變換&投影變換

前提

Games101 lecture4-lecture5
考慮將三位物體轉換二維圖像需要的步驟,我們需要以下變換來達成目的,
model transformation(模型(基礎)變換–Object就位)
view/camera transformation(視圖變換–調整相機)
projection transformation(投影變換–變換到[1,1]3[-1,1]^3,忽略深度信息zz,變成[1,1]2[-1,1]^2)
viewport transformation(視口變換–投影到屏幕空間)
如下圖所示(Fundamentals of Computer Graphics (3rd Edition) 7.1 Viewing Transformations Figure 7.2):

在這裏插入圖片描述

視圖變換

​ 首先需要定義一個相機,一個相機有三個屬性,位置(Positon)e\pmb{e},觀測方向(Look-at/ gaze direction)g\pmb{g}和向上方向(Up direction)t\pmb{t}
​ 同時只要相機和物體之間沒有相對運動,觀測結果就不會改變,則可以讓相機固定在原點,向上方向爲YY方向,看向Z-Z方向,而這就需要通過變換矩陣MviewM_view來自達成(需要注意的是物體也會隨着相機移動而移動,因爲要保證兩者之間沒有相對運動),該矩陣需要完成如下操作:

  1. 將原來在任意點e\pmb{e}的相機平移到原點
  2. 將觀測方向g\pmb{g}旋轉到Z-Z方向
  3. 將向上方向t\pmb{t}旋轉到YY方向
  4. 將{g\pmb{g}Xt\pmb{t}}方向旋轉到XX方向(當前兩個方向旋轉完成之後,XX方向自然對齊)
    如下圖所示:

在這裏插入圖片描述

MviewM_{view}先平移在旋轉(和仿射變換不同),即Mview=RviewTviewM_{view}=R_{view}T_{view}
最後結果如下:
Mview=RviewTview=[xgXtygXtzgXt0xtytzt0xgygzg00001][100xe010ye001ze0001] M_{view}=R_{view}T_{view}=\begin{bmatrix} x_{gXt} &y_{gXt}&z_{gXt}&0\\ x_t&y_t&z_t&0\\ x_{-g}&y_{-g}&z_{-g}&0\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} 1&0&0& -x_e\\ 0&1&0& -y_e\\ 0&0&1& -z_e\\ 0&0&0& 1\end{bmatrix}

推導過程

首先是平移到原點,可以很自然的寫出其平移矩陣TviewT_view如下:
Tview=[100xe010ye001ze0001] T_view=\begin{bmatrix} 1&0&0& -x_e\\ 0&1&0& -y_e\\ 0&0&1& -z_e\\ 0&0&0& 1\end{bmatrix}
接着考慮旋轉,將任意方向旋轉到X,Y,ZX,Y,-Z方向上不容易寫出,但是可以考慮其逆變換,寫出將X(1,0,0),Y(0,1,0),Z(0,0,1)X(1,0,0),Y(0,1,0),Z(0,0,1)旋轉到{g\pmb{g}Xt\pmb{t}},t\pmb{t},g\pmb{-g}的旋轉矩陣Rview1R_{view}^{-1},並且由於旋轉矩陣是正交矩陣,所以只要寫出Rview1R_{view}^{-1},其轉置矩陣即爲所求,如下所示:
Rview1=[xgXtxtxg0ygXtytyg0zgXtztzg00001] R_{view}^{-1}=\begin{bmatrix} x_{gXt} &x_t&x_{-g}&0\\ y_{gXt} &y_t&y_{-g}&0\\ z_{gXt} &z_t&z_{-g}&0\\ 0&0&0&1 \end{bmatrix}
可以通過將上述矩陣應用與三軸來檢驗其正確性。RviewR_{view}如下所示:
Rview=Rview(1)(1)=RviewT=[xgXtygXtzgXt0xtytzt0xgygzg00001] R_{view} = R_{view}^{(-1)(-1)}=R_{view}^T= \begin{bmatrix} x_{gXt} &y_{gXt}&z_{gXt}&0\\ x_t&y_t&z_t&0\\ x_{-g}&y_{-g}&z_{-g}&0\\ 0&0&0&1 \end{bmatrix}
所以最終的MviewM_{view}如開頭所示。

投影變換

投影變換目的就是將物體變換到[1,1]3[-1,1]^3。想要得到二維圖像,可以去掉zz,變成[1,1]2[-1,1]^2。變換分爲兩種,正交(orthographic)投影和透視(prespective)投影。透視投影存在近大遠小的現象,而正交投影則不會,這是兩者的本質區別,兩者分別如下圖所示:
圖片來源:https://stackoverflow.com/questions/36573283/from-perspective-picture-to-orthographic-picture

在這裏插入圖片描述

上圖中透視投影圍成一個視錐(四棱錐),而視錐中從某一個深度到另一個深度之間的區域叫做frustumfrustum,而透視投影就是將frustumfrustum中的東西顯示到近平面(NearNear clipclip planeplane)上。

正交投影(右手系)

首先定義一個空間中的立方體(只需定義6個面,左右上下前後),[l,r][l,r]x[b,t][b,t]x[f,n][f,n],需要注意的是遠平面(ff)和近平面(nn),有n>f\pmb{n}>\pmb{f}因爲看向Z-Z(右手系),所以物體越遠則其對應的ZZ的值越小,反之越大。如果是左手系則越遠ZZ越大,因爲看向的+Z+Z方向。然後將立方體中心平移到原點,並將其縮放canonicalcanonical(正則規範標準立方體) cube[1,1]3cube [-1,1]^3,忽略zz,則變爲[1,1]2[-1,1]^2
如下圖所示:

在這裏插入圖片描述

先將立方體中心(r+l2,t+b2,n+f2)(\frac{r+l}{2},\frac{t+b}{2},\frac{n+f}{2})平移到原點,然後縮放到[1,1]3[-1,1]^3(長寬高爲22),這裏的縮放其實就是將立方體的長寬高縮放爲22,其變換矩陣MorthoM_{ortho}如下:
Mortho=[2rl00002tb00002nf00001][100r+l2010t+b2001n+f20001]=[2rl00r+lrl02tb0t+btb002nfn+fnf0001] M_{ortho}=\begin{bmatrix} \frac{2}{r-l} &0&0&0\\ 0& \frac{2}{t-b} &0&0\\ 0&0& \frac{2}{n-f} &0\\ 0&0&0 &1 \end{bmatrix} \begin{bmatrix} 1&0&0& -\frac{r+l}{2}\\ 0&1&0& -\frac{t+b}{2}\\ 0&0&1& -\frac{n+f}{2}\\ 0&0&0& 1 \end{bmatrix}=\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}

透視投影

視錐定義

透視投影的視錐定義只要定義兩個東西1.垂直可視角度$Y2.2.寬高比aspect$,如下圖所示:

在這裏插入圖片描述
從側面觀察,則近平面距離相機距離爲n|n|,如下圖所示:
在這裏插入圖片描述

怎麼做透視投影Mpersp=MorthoMpersp>orthoM_{persp}=M_{ortho}M_{persp->ortho}

  1. 首先將frustumfrustum擠壓成一個長方體(Mpersp>orthoM_{persp->ortho})([l,r][l,r]x[b,t][b,t]x[f,n][f,n],);
  2. 然後再做一次正交投影(MorthoM_{ortho},已知)。即可完成投影到近平面的任務。

如下圖所示:

在這裏插入圖片描述

前提規定

  1. 在擠壓過程(第一步)中frustumfrustum的近平面nn上點不變;

  2. ff平面的ZZ值不變,因爲只是在收縮;

  3. ff平面的中心點是不會改變的(擠壓完還是中心點)。

推導過程

先單獨考慮擠壓過程,我們需要找到一個矩陣來完成變換。
考慮下圖,從視錐的側面看,我們需要將(x,y,z)(x,y,z)擠壓到和近平面上點(x,y,z)(x',y',z')一樣的高度,考慮相似三角形,則有y=nzyy'=\frac{n}{z}y;同理(從上面看),對於xx而言有x=nzxx'=\frac{n}{z}x

需要注意的是,這裏n,z\pmb{n},\pmb{z}在圖上表示的是距離原點的距離(負ZZ方向),所以是個負數。

在這裏插入圖片描述

至此,已知擠壓過程x,yx,y的變換,zz未知,將上述變換用齊次座標,同時在基礎變換中我們提到過對於齊次座標而言,(x,y,z,w)T(w!=0)(x,y,z,w)^T(w!=0)表示的點即爲(xw,yw,zw,1)T(\frac{x}{w},\frac{y}{w},\frac{z}{w},1)^T。 所以有如下關係:
Mpersp>ortho[xyz1]=[nzxnzy?1]=z[nxny?z] M_{persp->ortho}\begin{bmatrix} x\\y\\z\\1 \end{bmatrix}=\begin{bmatrix} \frac{n}{z}x \\ \frac{n}{z}y \\ ? \\1 \end{bmatrix}\stackrel{同乘z}{=}\begin{bmatrix} nx\\ny\\?\\z \end{bmatrix}
從中可以反推出Mpersp>orthoM_{persp->ortho}如下:
Mpersp>ortho=[n0000n00????0010] M_{persp->ortho}=\begin{bmatrix} n&0&0&0 \\ 0&n&0&0 \\ ?&?&?&? \\ 0&0&1&0 \end{bmatrix}
同時因爲擠壓過程中近平面點不變,遠平面點ZZ值不變。則對於一個近平面上點(x,y,n,1)T(x,y,n,1)^T(假設近平面上的zz的值爲nn)。考慮齊次座標中一個點可以有很多不同的表示,同理則有(x,y,n,1)T=n(nx,ny,n2,n)T(x,y,n,1)^T\stackrel{同乘n}{=}(nx,ny,n^2,n)^T變換後是不變的。所以有如下關係:
Mpersp>ortho[xyn1]=[nxny?z]=[nxnyn2n] M_{persp->ortho}\begin{bmatrix} x\\y\\n\\1 \end{bmatrix}=\begin{bmatrix} nx\\ny\\?\\z \end{bmatrix}=\begin{bmatrix} nx\\ny\\n^2\\n \end{bmatrix}

則可以推出變換矩陣的第三行爲(0,0,A,B)(0,0,A,B),即有式子(1)(1)如下:
[00AB][xyn1]=n2(1) \begin{bmatrix} 0&0&A&B \end{bmatrix}\begin{bmatrix} x\\y\\n\\1 \end{bmatrix}=n^2\tag{1}

再考慮ff平面中zz不變,且中心點不變,則對於其中心點(0,0,f,1)(0,0,f,1)(假設遠平面上zz值爲ff)。則有如下關係式子(2)(2):
[00f1]=f[00f2f][00AB][00f1]=[00f2f](2) \begin{bmatrix} 0\\0\\f\\1 \end{bmatrix}\stackrel{同乘f}{=}\begin{bmatrix} 0\\0\\f^2\\f \end{bmatrix}\Rightarrow\begin{bmatrix} 0&0&A&B \end{bmatrix}\begin{bmatrix} 0\\0\\f\\1 \end{bmatrix}=\begin{bmatrix} 0\\0\\f^2\\f \end{bmatrix}\tag{2}
(1)(2)(1)(2)可得,如下結果
{An+B=n2Af+B=f2{A=n+fB=nf \begin{cases} An+B=n^2\\ Af+B=f^2 \end{cases}\Rightarrow\begin{cases} A=n+f\\ B=-nf \end{cases}
則有
Mpersp>ortho=[n0000n0000n+fnf0010] M_{persp->ortho}=\begin{bmatrix} n&0&0&0 \\ 0&n&0&0 \\ 0&0&n+f&-nf \\ 0&0&1&0 \end{bmatrix}
所以透視投影變換矩陣計算如下:
Mpersp=MorthoMpersp>ortho=[2nrl0r+lrl002ntbt+btb000n+fnf2nfnf0010] M_{persp}=M_{ortho}M_{persp->ortho}=\begin{bmatrix} \frac{2n}{r-l}&0&-\frac{r+l}{r-l}&0\\ 0&\frac{2n}{t-b}&-\frac{t+b}{t-b}&0\\ 0&0&\frac{n+f}{n-f}&-\frac{2nf}{n-f}\\ 0&0&1&0 \end{bmatrix}

Question:frustum中間的點的變化

frustumfrustum中間任何一個位置,比如點(x,y,n+f2,1)T(x,y,\frac{n+f}{2},1)^T,經過擠壓之後(不做第二步正交)更加靠近遠平面還是近平面?(遠平面)

推導過程

先將Mpersp>orthoM_{persp->ortho}應用到該點上,如下:
Mpersp>ortho[xyn+f21]=[nxny(n+f)22nfn+f2]=n+f2[2nxn+f2nyn+fn+f2nfn+f1] M_{persp->ortho}\begin{bmatrix} x\\y\\\frac{n+f}{2}\\1 \end{bmatrix}=\begin{bmatrix} nx\\ny\\ \frac{(n+f)^2}{2}-nf\\ \frac{n+f}{2} \end{bmatrix}\stackrel{規範化,同除以\frac{n+f}{2}}{=}\begin{bmatrix} \frac{2nx}{n+f}\\ \frac{2ny}{n+f} \\ n+f-\frac{2nf}{n+f}\\1 \end{bmatrix}

比較變換前後兩點的ZZ值大小,如下:
n+f2nfn+fn+f2=n+f22nfn+f=(n+f)24nf2(n+f)=(nf)22(n+f) \begin{aligned} n+f-\frac{2nf}{n+f}-\frac{n+f}{2} &= \frac{n+f}{2}-\frac{2nf}{n+f} \\ &= \frac{(n+f)^2-4nf}{2(n+f)}\\ &= \frac{(n-f)^2}{2(n+f)} \end{aligned}

前面提到此時的n,fn,f是個負數,所以有(nf)2>0(n-f)^2>0(n+f)<0(n+f)<0,即更加靠近遠平面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章