games101學(xué)習(xí)筆記02-MVP變換p4
目錄
一、MVP變換
模型變換 視圖變換 投影變換
二、視圖變換
三、投影變換
正交投影 透視投影
正文
一、MVP變換
mvp包括模型變換(model transportation),視圖變換(view transportation)和投影變換(projection transportation)。
以現(xiàn)實(shí)中拍照為例,模型變換即擺放場(chǎng)景中物體位置,視圖變換即擺放攝像機(jī)的位置,投影變換即拍照成像。
相機(jī)如何定義:相機(jī)位置Position、相機(jī)朝向Look-at、向上方向up(決定畫面是否傾斜)

二、模型變換
將局部坐標(biāo)轉(zhuǎn)換到世界坐標(biāo)。
三、視圖變換
將世界坐標(biāo)轉(zhuǎn)換到視圖坐標(biāo)。
當(dāng)相機(jī)場(chǎng)景中所有其他物體相對(duì)位置不變時(shí),呈現(xiàn)畫面一定不變,因此畫面的變換只需要看相對(duì)位置的變換。為了方便起見,視圖坐標(biāo)把相機(jī)看做是靜止的,把相機(jī)的位置看做是坐標(biāo)軸的原點(diǎn),相機(jī)的向上方向?yàn)閥軸,相機(jī)的朝向?yàn)?z軸。而其他所有物體在相機(jī)的坐標(biāo)系中移動(dòng)。

步驟如下:
1.先把相機(jī)局部坐標(biāo)中的中心點(diǎn)e平移到世界坐標(biāo)的原點(diǎn)。平移矩陣如下:

2.把g旋轉(zhuǎn)到與-z平行
把一個(gè)一般的向量旋轉(zhuǎn)到與坐標(biāo)軸平行比較麻煩,但把坐標(biāo)軸旋轉(zhuǎn)到與一般的向量平行很簡(jiǎn)單,因此這一步可以先寫出-z軸旋轉(zhuǎn)到g的變換,再求矩陣的逆(轉(zhuǎn)置)。
-z旋轉(zhuǎn)到g的旋轉(zhuǎn)矩陣:

再求轉(zhuǎn)置:

3.把t旋轉(zhuǎn)到與y平行
與2同理。
當(dāng)相機(jī)進(jìn)行視圖變換移動(dòng)到坐標(biāo)軸時(shí),場(chǎng)景中的物體也進(jìn)行相同的視圖變換,就可以保證成像依然沒(méi)有變化。
二、投影變換
將視圖坐標(biāo)轉(zhuǎn)換成裁剪坐標(biāo)??梢岳斫鉃椋谖矬w和相機(jī)位置之間設(shè)置一個(gè)屏,把物體的坐標(biāo)變換為在屏上的坐標(biāo)。
分為透視投影perspective?projection與正交投影orthographic?projection。

1.正交投影
設(shè)想把相機(jī)拉到無(wú)窮遠(yuǎn)位置,則無(wú)論物體的遠(yuǎn)近,其拍攝的物體的投影大小都與物體本身是一致的。即忽略深度信息,沒(méi)有近大遠(yuǎn)小。
對(duì)于正交投影,把攝像機(jī)看作原點(diǎn),朝向看作-z軸,向上方向看作y軸。如下圖。在這張圖中,只是簡(jiǎn)單地把物體坐標(biāo)信息中z軸的信息去掉,變成只含x,y的二維坐標(biāo),就得到了字母E的正交投影的坐標(biāo)了。在該圖中,E在屏幕后方,點(diǎn)在屏幕前方,但是投影在屏幕上卻無(wú)法看出前后關(guān)系。

為了方便后續(xù)工作,在正式的正交變換中,會(huì)把一個(gè)一般的立方體變成標(biāo)準(zhǔn)立方體。

先把物體中心移動(dòng)到原點(diǎn),即每條邊挪動(dòng)中點(diǎn)到坐標(biāo)軸的距離(下圖右邊的矩陣)。再進(jìn)行縮放(左邊矩陣)。

2.透視投影
滿足近大遠(yuǎn)小,許多平行關(guān)系在投影中不再平行。
透視投影變換如何進(jìn)行:
先變成正交,再進(jìn)行正交投影。
(1)把透視投影轉(zhuǎn)換成正交投影
如下圖,這個(gè)六面體向左側(cè)延伸匯聚的點(diǎn)就是相機(jī)中心點(diǎn)。n處表示近處的平面,f處表示遠(yuǎn)處的平面。其中的實(shí)線表示了f平面到n平面的透視關(guān)系。
想象將f處平面擠壓,變成一個(gè)和n處平面大小一致的平面,那么其中的透視線也將變得平行。也就是變成了正交投影。這一步具體來(lái)講,應(yīng)該是保持近平面不變,遠(yuǎn)處的平面的前后距離不改變,而圍繞中心點(diǎn)進(jìn)行放縮。


接下來(lái)將求出變換矩陣。
側(cè)面圖如下。只看特定點(diǎn)(x,y,z),在平面上的投影點(diǎn)為該點(diǎn)擠壓后的結(jié)果,根據(jù)相似三角形得到。同理x'=n/z*x。

則(x',y',z')用齊次坐標(biāo)表示為(n/z*x,n/z*y,?,1)T,相當(dāng)于(nx,ny,?,z)T。
也就是說(shuō),對(duì)(x,y,z,1)T進(jìn)行透視轉(zhuǎn)正交的變換后(左乘變換矩陣M),得到(nx,ny,?,z)T。則可以計(jì)算出這個(gè)變換矩陣如下。

(在下文中用M代稱)
不妨設(shè)四個(gè)問(wèn)號(hào)的值為P,Q,A,B。為了解出它們的值,還需加入新的條件。
條件一,在距離n所在的平面上(即近平面)的點(diǎn),在近平面上投影不變。在近平面上的點(diǎn),就是把(x,y,z,1)T中的替換成n,也就是(x,y,n,1)T。為方便計(jì)算,乘個(gè)n轉(zhuǎn)化為(nx,ny,n2,n)T。
數(shù)學(xué)表示為M·(x,y,n,1)T=(nx,ny,n2,n)T。對(duì)于第三項(xiàng)n2的計(jì)算,有n2=Px+Qy+An+B。
則結(jié)論為P=Q=0,An+B=n2,A、B未知。
條件二,遠(yuǎn)平面上的中心點(diǎn)的位置不發(fā)生改變。
數(shù)學(xué)表示為M·(0,0,f,1)T=(0,0,f2,f)T。
則結(jié)論為Af+B=f2。
根據(jù)兩個(gè)結(jié)論,解方程組即可。

(2)進(jìn)行正交投影變換
