Viewing Transformation(觀測(cè)變換)
一.View/Camera Transformation(視圖變換)
視圖變換主要包含模型變換和視圖(攝像機(jī))變換,統(tǒng)稱為視圖變換。
什么是視圖變換?
模型-視圖-投影變換,簡(jiǎn)稱“MVP變換”
-
M:model transformation
- 設(shè)置好場(chǎng)景
- ex: 選好地方人擺好姿勢(shì)
-
V:view tranforamtion
- 設(shè)置好Camera的look at方向和up方向
- ex:找到一個(gè)角度放置照相機(jī)
-
P:projection tranformation
- 將camera看向的3d內(nèi)容轉(zhuǎn)換為2d畫(huà)面
- ex:拍照
model/view變換常常同時(shí)進(jìn)行,由下方視圖變換章節(jié)可知,做視圖變換時(shí)根據(jù)相對(duì)靜止,模型也同時(shí)應(yīng)用變換。
如何做視圖變換?
1.定義照相機(jī)
- postion 定義相機(jī)的位置
- look-at/gaze direction 定義相機(jī)看向的方向
- up direction 設(shè)定相機(jī)的up-direction

一個(gè)位置,兩個(gè)向量,則可以確定一個(gè)相機(jī),以上則是觀測(cè)矩陣所需要的初始的定義。
2.觀察
前提:當(dāng)物體與相機(jī)保持相對(duì)靜止時(shí),相機(jī)與物體無(wú)論如何移動(dòng),觀察的結(jié)果不變。
因此,進(jìn)行以下的處理:
-
(1) 處理:變換相機(jī)到標(biāo)準(zhǔn)中心:
放在原點(diǎn)、up方向?yàn)橄蛏系膟軸,看向-z方向
(2) 模型隨相機(jī)一起運(yùn)動(dòng)

好處:簡(jiǎn)化很多操作
- 設(shè)相機(jī)在e點(diǎn)上,look at/gaze direction的方向?yàn)間,up方向?yàn)閠
- 現(xiàn)在需要把相機(jī)移動(dòng)到原點(diǎn),向量g旋轉(zhuǎn)到-z上,t旋轉(zhuǎn)到y(tǒng)正半軸上。

基本步驟:
- 平移,將e點(diǎn)移動(dòng)到原點(diǎn)
- 旋轉(zhuǎn)g到-z方向
- 旋轉(zhuǎn)向上方向t到+y上
- 前面步驟完成后,自然而然地gxt的方向就在+x方向了。

上述步驟使用矩陣表示
-
Tview 平移矩陣
Rview 旋轉(zhuǎn)矩陣
由g,t,gxt旋轉(zhuǎn)到-z,y,x上矩陣難寫,可以利用旋轉(zhuǎn)矩陣是正交矩陣(正交矩陣的逆等于轉(zhuǎn)置)的特性:
- 先求Rview的逆->Rview-1(即x,y,-z旋轉(zhuǎn)到gxt,t,g),
- 再對(duì)Rview-1求轉(zhuǎn)置得到Rview。
二、Projection Transformatio(投影變換)

正交投影:假設(shè)相機(jī)拿到無(wú)限遠(yuǎn),近平面與遠(yuǎn)平面完全一樣大小。
透視投影,frustum中內(nèi)容成像到近平面上
1、正交投影<br />Orthographic projection
無(wú)近大遠(yuǎn)小.

基本思想
- 設(shè)置camera在原點(diǎn),gaze /look at方向?yàn)?z,up方向?yàn)?y
- 舍棄物體z值,使物體的z都等于0,至此所有物體都只在x軸跟y軸上,攝像機(jī)看到的就是x、y平面上的一張圖。
- 將物體都擠壓到規(guī)范正方形[-1,1][-1,1],這一步是約定俗稱的操作,為了方便后面的計(jì)算。
圖形學(xué)中的實(shí)際操作:
- 定義空間中的立方體,[lxr]x[b,t]x[f,n]。f<n,因?yàn)橛沂窒?,camera延著-z方向看
- 中心位于((r+l)/2,(t+b)/2,(n+f)/2)的立方體延著(-(r+l)/2,-(t+b)/2,-(n+f)/2)平移到原點(diǎn)。
- 將其給拉成一個(gè)[-1,1]的正則(canonical)立方體
數(shù)學(xué)上的表現(xiàn)

2、透視投影:<br />Perspective projection
符合人眼成像,近大遠(yuǎn)小,平行線遠(yuǎn)處會(huì)相交


基本思想:
- 將frustom擠壓成一個(gè)長(zhǎng)方體
- 再做一次正交投影

如何擠?
定義:
在擠壓的過(guò)程中,近平面任何一個(gè)點(diǎn)的x,y,z值永遠(yuǎn)不會(huì)發(fā)生變化。
在擠壓過(guò)程中,遠(yuǎn)平面上的Z值不會(huì)發(fā)生變化。
擠壓過(guò)程中,遠(yuǎn)平面的中心點(diǎn)也不會(huì)發(fā)生變化。
擠壓過(guò)程:
-
從側(cè)面觀察,根據(jù)相似三角形可得y'=(n/z)*y
-
同理可得x’
-
結(jié)果的點(diǎn)可以寫成一個(gè)齊次坐標(biāo)矩陣,然后同乘z后,仍然表示同一個(gè)點(diǎn)
-
寫出變換矩陣表達(dá)式,原來(lái)的點(diǎn)經(jīng)過(guò)變換矩陣后,得到第3步表示的點(diǎn)
-
由第4步,可以反推變換矩陣的形式如下:
-
M的第3行一定與z'有關(guān)系。
-
根據(jù)前述的定義:
-
近平面上的點(diǎn)x、y、z值不變。取點(diǎn)(x,y,n),得到結(jié)果后同乘n
觀察結(jié)果第3行=n*n,與x、y無(wú)關(guān),因此M前兩項(xiàng)必為0:M的第3行=(0,0,A,B)
遠(yuǎn)平面上的點(diǎn)的z值不變。取點(diǎn)(0,0,f),代入上述求到的(0,0,A,B)——變換矩陣第三行

綜上兩個(gè)等式,變換矩陣求解完畢

課后思考:
在將frustum擠壓為Cuboid的過(guò)程中,已知遠(yuǎn)平面和近平面的Z'不變,那么近平面與遠(yuǎn)平面之間的z,z’相對(duì)z如何變化,更近了還是更遠(yuǎn)了?
-
解答
設(shè)任意點(diǎn)(x,y,z)經(jīng)M變換
注意點(diǎn):camera在原點(diǎn)看向-z方向,所以n+f<0
綜上,z’相對(duì)z減小,更接近遠(yuǎn)平面了
小結(jié):
本節(jié)課主要講述觀測(cè)變換(Viewing Transformation)——三維的場(chǎng)景轉(zhuǎn)換為二維的畫(huà)面。觀測(cè)變換包括:
- 視圖變換(M、V)
- 視圖變換包含模型變換(Model Transformation)與視圖變換Viewing Transformation,兩者通常同時(shí)進(jìn)行,統(tǒng)稱為視圖變換。
- 這一步的目的是將攝像機(jī)擺放到look at/gaze方向?yàn)?z方向,up為+y,位置為原點(diǎn)的方向,包含平移與旋轉(zhuǎn)過(guò)程,物體跟隨相機(jī)同步變換。
- 變換矩陣最終實(shí)際上是作用到物體上,因?yàn)閼?yīng)用到物體后,我們就知道這時(shí)攝像機(jī)就已經(jīng)擺放到指定位置。
- 求旋轉(zhuǎn)變換矩陣的過(guò)程中根據(jù)正交矩陣的性質(zhì),可以通過(guò)求逆矩陣的方式計(jì)算,計(jì)算非常方便。
- 投影
投影分為:
-
正交投影
- 求將立方體映射到[-1,1]x[-1,1]x[-1,1]的標(biāo)準(zhǔn)立方體(canonical cube)的變換矩陣。
- 無(wú)近大遠(yuǎn)小,工程制圖應(yīng)用多。
-
透視投影
- 先將四棱錐frustum“壓縮成”立方體
- 再進(jìn)行正交投影。
- 近大遠(yuǎn)小,更符合人眼
更多
現(xiàn)代計(jì)算機(jī)圖形學(xué)入門-L3-變換.1
現(xiàn)代計(jì)算機(jī)圖形學(xué)入門-L2 ——線性代數(shù)
現(xiàn)代計(jì)算機(jī)圖形學(xué)入門-L1
CocosCreator3.4.2原生二次開(kāi)發(fā)的正確姿勢(shì)——手把手教你接SDK
關(guān)于作者
我是羽毛,一名游戲研發(fā)工程師,一名野生攝影同學(xué)。我的公眾號(hào)主要分享自己的一些游戲項(xiàng)目開(kāi)發(fā)過(guò)程中的功能總結(jié)及日常開(kāi)發(fā)筆記。也希望能通過(guò)平臺(tái)的交流,與更多有想法的同學(xué)交流認(rèn)識(shí),共同成長(zhǎng)。
歡迎大家在日常開(kāi)發(fā)過(guò)程中,如果覺(jué)得有需要討論解決、分享或者探討的內(nèi)容,在公眾號(hào)后臺(tái)或者文章留言處給我反饋,提供寫作的方向,從另一個(gè)角度也盡量讓寫作內(nèi)容更貼近大家的需求以及痛點(diǎn),在此謝謝各位同學(xué).
另外羽毛也提供付費(fèi)技術(shù)咨詢的服務(wù),有需求的同學(xué)可以公眾號(hào)后臺(tái)私信添加微信。

今日技能你學(xué)廢了嗎?
<div align ="center">
<h2>更多精彩歡迎關(guān)注微信公眾號(hào)“羽毛不會(huì)飛”</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多平臺(tái)發(fā)布










