Viewing Transformation(觀測變換)
一.View/Camera Transformation(視圖變換)
視圖變換主要包含模型變換和視圖(攝像機)變換,統稱為視圖變換。
什么是視圖變換?
模型-視圖-投影變換,簡稱“MVP變換”
-
M:model transformation
- 設置好場景
- ex: 選好地方人擺好姿勢
-
V:view tranforamtion
- 設置好Camera的look at方向和up方向
- ex:找到一個角度放置照相機
-
P:projection tranformation
- 將camera看向的3d內容轉換為2d畫面
- ex:拍照
model/view變換常常同時進行,由下方視圖變換章節可知,做視圖變換時根據相對靜止,模型也同時應用變換。
如何做視圖變換?
1.定義照相機
- postion 定義相機的位置
- look-at/gaze direction 定義相機看向的方向
- up direction 設定相機的up-direction
一個位置,兩個向量,則可以確定一個相機,以上則是觀測矩陣所需要的初始的定義。
2.觀察
前提:當物體與相機保持相對靜止時,相機與物體無論如何移動,觀察的結果不變。
因此,進行以下的處理:
-
(1) 處理:變換相機到標準中心:
放在原點、up方向為向上的y軸,看向-z方向
(2) 模型隨相機一起運動
好處:簡化很多操作
- 設相機在e點上,look at/gaze direction的方向為g,up方向為t
- 現在需要把相機移動到原點,向量g旋轉到-z上,t旋轉到y正半軸上。
基本步驟:
- 平移,將e點移動到原點
- 旋轉g到-z方向
- 旋轉向上方向t到+y上
- 前面步驟完成后,自然而然地gxt的方向就在+x方向了。
上述步驟使用矩陣表示
-
Tview 平移矩陣
Rview 旋轉矩陣
由g,t,gxt旋轉到-z,y,x上矩陣難寫,可以利用旋轉矩陣是正交矩陣(正交矩陣的逆等于轉置)的特性:
- 先求Rview的逆->Rview-1(即x,y,-z旋轉到gxt,t,g),
- 再對Rview-1求轉置得到Rview。
二、Projection Transformatio(投影變換)
正交投影:假設相機拿到無限遠,近平面與遠平面完全一樣大小。
透視投影,frustum中內容成像到近平面上
1、正交投影<br />Orthographic projection
無近大遠小.
基本思想
- 設置camera在原點,gaze /look at方向為-z,up方向為+y
- 舍棄物體z值,使物體的z都等于0,至此所有物體都只在x軸跟y軸上,攝像機看到的就是x、y平面上的一張圖。
- 將物體都擠壓到規范正方形[-1,1][-1,1],這一步是約定俗稱的操作,為了方便后面的計算。
圖形學中的實際操作:
- 定義空間中的立方體,[lxr]x[b,t]x[f,n]。f<n,因為右手系,camera延著-z方向看
- 中心位于((r+l)/2,(t+b)/2,(n+f)/2)的立方體延著(-(r+l)/2,-(t+b)/2,-(n+f)/2)平移到原點。
- 將其給拉成一個[-1,1]的正則(canonical)立方體
數學上的表現
2、透視投影:<br />Perspective projection
符合人眼成像,近大遠小,平行線遠處會相交
基本思想:
- 將frustom擠壓成一個長方體
- 再做一次正交投影
如何擠?
定義:
在擠壓的過程中,近平面任何一個點的x,y,z值永遠不會發生變化。
在擠壓過程中,遠平面上的Z值不會發生變化。
擠壓過程中,遠平面的中心點也不會發生變化。
擠壓過程:
-
從側面觀察,根據相似三角形可得y'=(n/z)*y
-
同理可得x’
-
結果的點可以寫成一個齊次坐標矩陣,然后同乘z后,仍然表示同一個點
-
寫出變換矩陣表達式,原來的點經過變換矩陣后,得到第3步表示的點
-
由第4步,可以反推變換矩陣的形式如下:
-
M的第3行一定與z'有關系。
-
根據前述的定義:
-
近平面上的點x、y、z值不變。取點(x,y,n),得到結果后同乘n
觀察結果第3行=n*n,與x、y無關,因此M前兩項必為0:M的第3行=(0,0,A,B)
遠平面上的點的z值不變。取點(0,0,f),代入上述求到的(0,0,A,B)——變換矩陣第三行
綜上兩個等式,變換矩陣求解完畢
課后思考:
在將frustum擠壓為Cuboid的過程中,已知遠平面和近平面的Z'不變,那么近平面與遠平面之間的z,z’相對z如何變化,更近了還是更遠了?
-
解答
設任意點(x,y,z)經M變換
注意點:camera在原點看向-z方向,所以n+f<0
綜上,z’相對z減小,更接近遠平面了
小結:
本節課主要講述觀測變換(Viewing Transformation)——三維的場景轉換為二維的畫面。觀測變換包括:
- 視圖變換(M、V)
- 視圖變換包含模型變換(Model Transformation)與視圖變換Viewing Transformation,兩者通常同時進行,統稱為視圖變換。
- 這一步的目的是將攝像機擺放到look at/gaze方向為-z方向,up為+y,位置為原點的方向,包含平移與旋轉過程,物體跟隨相機同步變換。
- 變換矩陣最終實際上是作用到物體上,因為應用到物體后,我們就知道這時攝像機就已經擺放到指定位置。
- 求旋轉變換矩陣的過程中根據正交矩陣的性質,可以通過求逆矩陣的方式計算,計算非常方便。
- 投影
投影分為:
-
正交投影
- 求將立方體映射到[-1,1]x[-1,1]x[-1,1]的標準立方體(canonical cube)的變換矩陣。
- 無近大遠小,工程制圖應用多。
-
透視投影
- 先將四棱錐frustum“壓縮成”立方體
- 再進行正交投影。
- 近大遠小,更符合人眼
更多
CocosCreator3.4.2原生二次開發的正確姿勢——手把手教你接SDK
關于作者
我是羽毛,一名游戲研發工程師,一名野生攝影同學。我的公眾號主要分享自己的一些游戲項目開發過程中的功能總結及日常開發筆記。也希望能通過平臺的交流,與更多有想法的同學交流認識,共同成長。
歡迎大家在日常開發過程中,如果覺得有需要討論解決、分享或者探討的內容,在公眾號后臺或者文章留言處給我反饋,提供寫作的方向,從另一個角度也盡量讓寫作內容更貼近大家的需求以及痛點,在此謝謝各位同學.
另外羽毛也提供付費技術咨詢的服務,有需求的同學可以公眾號后臺私信添加微信。
今日技能你學廢了嗎?
<div align ="center">
<h2>更多精彩歡迎關注微信公眾號“羽毛不會飛”</h2>
<img src="https://upload-images.jianshu.io/upload_images/21178773-2e5d33fde1edc63e.png" width="80%"/>
<img src="https://upload-images.jianshu.io/upload_images/21178773-ebca0bcc56f0bd3e.png" />
</div>
本文由mdnice多平臺發布