【讀書筆記】計算機圖形學基礎(虎書)第7章 - 視角


這里翻譯基於另一位前輩同一章節的學習筆記。除了第六章提到的旋轉等操作以外,一個重要的轉換矩陣是將三維物體轉換至二維屏幕視圖的Viewing Transformation(觀察變換),主要用在object-order rendering(物體為順序的渲染)上。從直接的轉換矩陣來看我們只能將所有點或者線框(wireframe)進行展示,並且不能馬上處理如下圖第三個的遠近遮擋關系。我們需要另一個方法來處理前后關系,其中一個方法是我們可以用一個代表遠近的\(z\)值進行渲染優先度的分析,會在之后進行討論。

觀察變換矩陣的本質是將全局坐標系下\((x,y,z)\)坐標投影到以像素為坐標單位的屏幕上。我們通常將整個變換分為多個步驟進行轉換,具體可以見下圖,涉及到物體局部坐標系、全局坐標系、相機坐標系、標准空間與屏幕空間。前瞻來講一下標准空間和屏幕空間的區別,標准空間將整個屏幕視為一個面積為1(或者4,邊是[-1,1])的單位方形,而屏幕空間則由屏幕大小(行列像素個數)來決定。以下小章節按照倒序對整個觀察變換進行一一講解。

1. Viewport Transformation(視口變換)

因為標准空間的定義各有一些不一樣,例如本書利用\([-1,1]\)的方形,也有以左上角為\((0,0)\)右下角為\((1,-1)\)的投影,此節主要介紹思想。總的來說,視口變換要將標准空間平面與像素平面一一對應,按照本書的規范標准空間為\([-1,1]\)的方形而屏幕空間的像素位置按照對應方格的中心為准,因此是\([-1,1]\times[-1,1]\)\([-0.5, n_x-0.5]\times[-0.5,n_y-0.5]\)的空間變換。這里要注意\(n_x-0.5\)里的\(n_x\)是橫軸像素的個數而不是像素的最大序號。考慮到標准空間轉換至屏幕空間,因為標准空間的單位基對應屏幕空間\((n_x/2,n_y/2)\),可以直接依次進行倍率轉換和位移操作,這里位移需要將屏幕中心移動到屏幕的左下角,故移動\((-0.5+n_x/2,-0.5+n_y/2)\),總結得到如下轉換矩陣。

2. Projection Transformation(投影轉換)

投影轉換將相機空間的三維物體轉換至標准空間的二維圖片。整體來講是按照照相機(camera)或者眼睛(eye)構造坐標系,並通過不同的方式將三維物體投影到視覺平面上。

2.1 長方體視野

第一種方法是將視野范圍設置為長方體,如下圖所示。注意這里因為右手坐標系的原因\(z\)軸正方向靠后,因此攝像機的正方向是沿着\(-z\)方向。因此更大的\(z\)值(更小的負值)代表了更近的位置。

具體轉換公式可以見下圖,注意這里是將相機空間轉換到標准二維空間,第四列考慮的是相機空間原點在標准二維空間下的位置。標准二維空間原點在相機空間下是\((\frac{r+l}{2},\cdots,\cdots)\),反向距離則為\((-\frac{r+l}{2},\cdots,\cdots)\)。相機空間的\((r-l,t-b,n-f)\)個單位長對應二維標准空間的2個單位長(這里使用的是\([-1,1]\)的正方體,如果使用其他標准則有改變)。因此,第四列的位置為\((\frac{-\frac{r+l}{2}}{\frac{r-l}{2}},\cdots,\cdots)=(-\frac{r+l}{r-l},\cdots,\cdots)\)。前三列是基變換,即一單位的的二維標准空間基是一單位的全局三維坐標系統通過什么變換得來的。如果通過求逆矩陣來思考第四列則會更加直觀,立方體的中心點是\((\frac{r+l}{2},\cdots,\cdots)\),求對應將全局三維空間轉換到二維標准空間的逆矩陣第四列為\(\frac{r+l}{2}\cdot\frac{2}{r-l}=\frac{r+l}{r-l}\),取逆矩陣增加負號得到\(-\frac{r+l}{r-l}\)

2.2 Projective Transformation(透視轉換)

透視轉換比起之前的投影轉換不僅更符合人體所見的近大遠小原則,而且擴展了可見視野的范圍(中心長方體外擁有額外空間,減少更近更小的一半,增加更遠更大的一半,基於相似三角形原則整體必然增大),具體如下圖。

在講解透視轉換時先加入齊次坐標的另一運用。之前提及齊次坐標可以做到平移的操作,但第四行僅使用了\([0,0,0,1]\)。如果將第四行更改到其他值,則轉換的范圍就進一步拓展到類似於\(x'=\frac{a_1x+b_1y+c_1z+d_1}{ex+fy+gz+h}\)的地步,具體如下。基本上第四行決定了縮放受到\(xyz\)方向值的影響程度。


這里需要注意,雖然整個轉換矩陣是線性的,但是就三維移動的點來講轉換是非線性的。可以見此圖。

在實際計算時,我們假定上為\(y\),右為\(x\),后為\(z\)的右手坐標系,那么向前的方向為\(-z\)。假設遠近平面分別為負值的\(f,n\),那么遠近平面的距離分別為\(-f,-n\)。本書采取的方法是將透視六面體(Frustrum, 截頭體)先轉換成長方體視野再轉換成二維視覺平面,透視轉換還有很多其他的方法。從透視六面體(Frustrum)轉換到長方形視野的轉換矩陣如下,轉換時設置為按照近平面\(n\)的大小創造長方體視野。

公式上,首先通過相似三角形應該得到\(y'=\frac{n}{z}y,x'=\frac{n}{z}x\),因此我們得知一個初始的方法為第一行\([n,0,0,0]\),第二行\([0,n,0,0]\),第四行\([0,0,1,0]\),現在需要考慮第三行。為了讓\(z\)值在轉換后不變,即\(\frac{ax+by+cz+d}{z}=z\),此方程明顯無解,因此\(z\)值一定會有所改變。下方的轉換矩陣使\(f,n\)平面上的\(z\)值不變,中間的按不同比率進行變動,改變方法為\(\frac{(n+f)z-fn}{z}\)


注意其逆矩陣有以下的簡單寫法,無需額外花時間進行逆矩陣運算。第二個逆矩陣依然成立是因為齊次坐標下\(kP\)\(P\)的轉換效果是一致的,故恆可以乘除一個常數,此處乘了一個\(nf\)

整個透視轉換可以簡單的記錄為\(M_{orth}P\),即將透視六面體(Frustrum, 截頭體)先轉換成長方體視野再轉換成二維視覺平面的過程,合並也可以得到以下算式。

2.3 視野(Field of View)

如果我們假設目光穿過中心,則有\(l=-r,b=-t\)。采取長寬比一致的情況,即\(\frac{n_x}{n_y}=\frac{r}{t}\)。因為\(f\)通常通過可見度來設置,我們的透視轉換矩陣里能夠調整的僅僅剩下\(n\)。我們往往設置一個垂直視野(vertical field of view)的角度\(\theta\),即\(tan(\frac{\theta}{2})=\frac{t}{|n|}\)來改變\(n\)的值從而調整整個透視的六面體frustrum。顯而易見當\(\theta\)更大,則\(n\)更接近且整個透視frustum會更大,但遠處更大的\(f\)面被壓縮在同樣大小的\(n\)面投影中,導致遠處場景的壓縮程度更大。

3 攝像機轉換

通常攝像機用相機位置的eye position(e),眼睛所看的方向gaze(g)或者其他(look,forward等),以及向上的方向view up(t)來表示。注意這里\(t\)並不需要垂直向上,只需要\(tg\)構成一個垂直平分世界的平面即可。按照前文所提及的右手坐標系,注意\(z=-g\),右手的\(x\)可以通過\(z\times v\)得出,垂直向上的\(y\)可以通過\(x\times z\)得出。注意中間要將向量長度轉換為\(1\)(normalize)。直接轉換得到以下矩陣,注意\((xyz)\)對應\((uvw)\)。因為將全局空間坐標系轉換到相機空間坐標系,可以先位移再變基。注意變基說的是一個全局單位\(x\)\(uvw\)坐標系下的坐標\((x_u,x_v,x_w)\),坐標為什么是這個可以參考本視頻,主要是因為u在x軸的投影\(x_u\)依據單位長向量的對稱性等於x向量在u方向上的投影,故\(x_uu+x_vv+x_ww=x\)。另一個更為簡單的方法是因為坐標系三者互相垂直,形成正交基,故逆矩陣等於轉置矩陣。

4. 結論
至此,我們完成了從全局坐標系到相機空間到標准空間到屏幕空間的變化,只需要把轉換矩陣從右到左依次相乘即可,見下圖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM