天天看點

計算機圖形學中的MVP矩陣0. M V P MVP MVP的用途1. M o d e l Model Model(模型變換)2. V i e w View View(視圖變換)3. P r o j e c t i o n Projection Projection (投影變換)在MVP之後應該做什麼?

MVP變換(games101)

  • 0. M V P MVP MVP的用途
  • 1. M o d e l Model Model(模型變換)
  • 2. V i e w View View(視圖變換)
  • 3. P r o j e c t i o n Projection Projection (投影變換)
    • 3.1. O r t h o g r a p h i c Orthographic Orthographic p r o j e c t i o n projection projection(正交投影)
    • 3.2. P e r s p e c t i v e Perspective Perspective p r o j e c t i o n projection projection(透視投影)
  • 在MVP之後應該做什麼?

0. M V P MVP MVP的用途

想像成相機,思考怎樣拍照片(以拍攝物體為例)

  1. 首先調整好拍攝物體,對物體進行模型變換 ( M o d e l t r a n s f o r m a t i o n ) (Model transformation) (Modeltransformation)
  2. 放置好相機的位置上,調整好相機的拍攝角度 ( V i e w t r a n s f o r m a t i o n ) (View transformation) (Viewtransformation)
  3. 拍攝照片,實作3D物體變成2D圖檔 ( P r o j e c t i o n t r a n s f o r m a t i o n ) (Projection transformation) (Projectiontransformation)

1. M o d e l Model Model(模型變換)

顧名思義對模型進行一系列的平移旋轉縮放達到目标物體場景,具體的實作見連結: 計算機圖形學中的矩陣變化.

2. V i e w View View(視圖變換)

視圖變換所需參數

  1. 相機的位置上 e e e
  2. 相機的觀察方向 g ( L o o k − a t ) g (Look-at ) g(Look−at)
  3. 相機的上方向 t ( U p d i r e c t i o n ) t(Up direction) t(Updirection)
  4. 相機的右方向 g × t g × t g×t

如圖所示為相機的初始位置

計算機圖形學中的MVP矩陣0. M V P MVP MVP的用途1. M o d e l Model Model(模型變換)2. V i e w View View(視圖變換)3. P r o j e c t i o n Projection Projection (投影變換)在MVP之後應該做什麼?

把相機看作空間中的一個物體,若将相機和其他的物體同時進行移動(進行同一種的位移變換),那麼其他的物體和相機就會是一種相對靜止,隻移動物體或者隻移動Camera,最後可能都會得到同一個結果,這樣約定相機并不移動,相機放在 ( 0 , 0 , 0 ) (0,0,0) (0,0,0)的位置,相機朝向也固定為指向 − Z -Z −Z,這個位置為标準位置

這時我們所需要考慮的就是如何把相機移動到标準位置

具體做法如下:

  1. 先将相機的位置移動到原點 ( o r i g i n ) (origin) (origin)
  2. 将 g g g旋轉到 − z -z −z軸方向
  3. 将 g × t g×t g×t旋轉到x軸方向
  4. 将 g × t g×t g×t旋轉到x軸方向
    計算機圖形學中的MVP矩陣0. M V P MVP MVP的用途1. M o d e l Model Model(模型變換)2. V i e w View View(視圖變換)3. P r o j e c t i o n Projection Projection (投影變換)在MVP之後應該做什麼?
    M v i e w M_{v i e w} Mview​矩陣的具體實作:

将 M v i e w M_{v i e w} Mview​矩陣分解為 R v i e w R_{v i e w} Rview​和 T v i e w T_{v i e w} Tview​兩種變換矩陣,其中 T v i e w T_{v i e w} Tview​為位移矩陣,将相機移動到原點, R v i e w R_{v i e w} Rview​為旋轉矩陣,将相機沿着幾個方向軸旋轉到坐标系的位置。

M view  = R view  T view  M_{\text {view }}=R_{\text {view }} T_{\text {view }} Mview ​=Rview ​Tview ​

T v i e w T_{v i e w} Tview​矩陣,将相機移動到原點,即将 ( x e , y e , z e ) (xe,ye,ze) (xe,ye,ze)移動到 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),則 x , y , z x,y,z x,y,z上的位移量分别為 − x e , − y e , − z e -xe,-ye,-ze −xe,−ye,−ze。

T v i e w = [ 1 0 0 − x e 0 1 0 − y e 0 0 1 − z e 0 0 0 1 ] T_{v i e w}=\left[\begin{array}{cccc}1 & 0 & 0 & -x_{e} \\ 0 & 1 & 0 & -y_{e} \\ 0 & 0 & 1 & -z_{e} \\ 0 & 0 & 0 & 1\end{array}\right] Tview​=⎣⎢⎢⎡​1000​0100​0010​−xe​−ye​−ze​1​⎦⎥⎥⎤​

R v i e w R_{v i e w} Rview​矩陣要做的事就是将 g g g旋轉到 − z -z −z軸, t t t旋轉到 Y Y Y軸, ( g × t ) (g × t) (g×t)旋轉到 x x x軸。如果這樣直接旋轉太麻煩, − z -z −z的方向向量為 ( 0 , 0 , − 1 ) , y (0,0,-1),y (0,0,−1),y軸的方向向量為 ( 0 , 1 , 0 ) (0,1,0) (0,1,0), x x x軸的方向向量為 ( 1 , 0 , 0 ) (1,0,0) (1,0,0),明顯可以看出,從 − z -z −z旋轉到 g g g,從 y y y旋轉到 t t t,從 x x x軸旋轉到 ( g × t ) (g×t) (g×t)更為簡單,這個旋轉矩陣為:

R v i e w = [ x g ^ × t ^ y g ^ × t ^ z g ^ × t ^ 0 x t y t z t 0 x − g y − g z − g 0 0 0 0 1 ] R_{v i e w}=\left[\begin{array}{cccc}x_{\hat{g} \times \hat{t}} & y_{\hat{g} \times \hat{t}} & z_{\hat{g} \times \hat{t}} & 0 \\ x_{t} & y_{t} & z_{t} & 0 \\ x_{-g} & y_{-g} & z_{-g} & 0 \\ 0 & 0 & 0 & 1\end{array}\right] Rview​=⎣⎢⎢⎡​xg^​×t^​xt​x−g​0​yg^​×t^​yt​y−g​0​zg^​×t^​zt​z−g​0​0001​⎦⎥⎥⎤​

再求這個矩陣的逆矩陣,即逆變換,就可以得到相機的三個方向旋轉到坐标系的三個軸的變換矩陣。因為旋轉矩陣都是正交矩陣,是以其逆矩陣 = 轉置矩陣。

R view  − 1 = [ x g ^ × t ^ x t x − g 0 y g ^ × t ^ y t y − g 0 z g ^ × t ^ z t z − g 0 0 0 0 1 ] R_{\text {view }}^{-1}=\left[\begin{array}{cccc}x_{\hat{g} \times \hat{t}} & x_{t} & x_{-g} & 0 \\ y_{\hat{g} \times \hat{t}} & y_{t} & y_{-g} & 0 \\ z_{\hat{g} \times \hat{t}} & z_{t} & z_{-g} & 0 \\ 0 & 0 & 0 & 1\end{array}\right] Rview −1​=⎣⎢⎢⎡​xg^​×t^​yg^​×t^​zg^​×t^​0​xt​yt​zt​0​x−g​y−g​z−g​0​0001​⎦⎥⎥⎤​

3. P r o j e c t i o n Projection Projection (投影變換)

投影就是将3D的圖形投影到2D的平面上,即将三維物體轉換成能在能在螢幕上顯示的二維圖像。投影主要分成正交投影和透視投影,如圖所示

計算機圖形學中的MVP矩陣0. M V P MVP MVP的用途1. M o d e l Model Model(模型變換)2. V i e w View View(視圖變換)3. P r o j e c t i o n Projection Projection (投影變換)在MVP之後應該做什麼?
  • 正交投影是假設Camera位于無限遠的位置,投影出來的物體不論近處還是遠處,大小都是一樣大,适用于工程制圖。
  • 透視投影進大遠小,更符合人眼的觀察效果;

3.1. O r t h o g r a p h i c Orthographic Orthographic p r o j e c t i o n projection projection(正交投影)

粗暴做法1.0

正交投影是把相機固定在原點上, l o o k − a t look-at look−at方向為 − z -z −z軸, u p up up方向為 y y y軸,如果要對物體進行正交投影,隻需要将三維坐标中的z坐标直接丢棄,就能夠得到投影的結果,如圖所示,投影平面為 z = 0 z = 0 z=0,直接丢棄 z z z坐标或者直接令 z z z坐标為 0 0 0,就可以得到投影的效果。

正常操作2.0

在坐标系統,使用六個數即可定義個立方體 如 x = 1 如x=1 如x=1代表一個面, x = − 1 x=-1 x=−1代表一個面,六個數定義6個面,包圍起來的立體就是立方體,用 l ( l e f t ) l(left) l(left), r ( r i g h i t ) r(righit) r(righit) , b ( b o t t o m ) b(bottom) b(bottom) , t ( t o p ) t(top) t(top) , f ( f a r ) f(far) f(far) , n ( n e a r ) n(near) n(near)六個數定義一個立方體.

計算機圖形學中的MVP矩陣0. M V P MVP MVP的用途1. M o d e l Model Model(模型變換)2. V i e w View View(視圖變換)3. P r o j e c t i o n Projection Projection (投影變換)在MVP之後應該做什麼?

最右邊的立方體先經過平移,縮放,最終投影的立方體在[-1,1]之間。正交投影矩陣表示為

M ortho  = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] M_{\text {ortho }}=\left[\begin{array}{cccc}\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{array}\right]\left[\begin{array}{cccc}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{array}\right] Mortho ​=⎣⎢⎢⎡​r−l2​000​0t−b2​00​00n−f2​0​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​1000​0100​0010​−2r+l​−2t+b​−2n+f​1​⎦⎥⎥⎤​

3.2. P e r s p e c t i v e Perspective Perspective p r o j e c t i o n projection projection(透視投影)

在學習透視投影之前,要先了解一些知識:

( x , y , z , 1 ) (x,y,z,1) (x,y,z,1), ( k x , k y , k z , k ! = 0 ) (kx,ky,kz,k!=0) (kx,ky,kz,k!=0), ( x z , y z , z 2 , z ! = 0 ) (xz,yz,z^2,z!=0) (xz,yz,z2,z!=0),全都代表了同一個 ( x , y , z ) (x,y,z) (x,y,z)點。齊次坐标 ( x , y , z , w ) (x,y,z,w) (x,y,z,w)所代表的點為 ( x / w , y / w , z / w ) (x/w , y/w , z/w) (x/w,y/w,z/w)。

要進行透視投影的話,需要完成兩步

1. M persp  →  ortho  M_{\text {persp } \rightarrow \text { ortho }} Mpersp → ortho ​

2. M persp  = M ortho  M persp  →  ortho  M_{\text {persp }}=M_{\text {ortho }} M_{\text {persp } \rightarrow \text { ortho }} Mpersp ​=Mortho ​Mpersp → ortho ​

什麼意思呢?我們可以将透視投影看成兩部分,首先先把透視投影的遠近平面擠壓,到一個平面上,然後根據正交投影的方式實作成像

綜上所述,透視投影矩陣為

M persp  = M ortho  M persp  →  ortho  M_{\text {persp }}=M_{\text {ortho }} M_{\text {persp } \rightarrow \text { ortho }} Mpersp ​=Mortho ​Mpersp → ortho ​= [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] \left[\begin{array}{cccc}\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{array}\right]\left[\begin{array}{cccc}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{array}\right] ⎣⎢⎢⎡​r−l2​000​0t−b2​00​00n−f2​0​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​1000​0100​0010​−2r+l​−2t+b​−2n+f​1​⎦⎥⎥⎤​ ( n 0 0 0 0 n 0 0 0 0 n + f − n × f 0 0 1 0 ) \left(\begin{array}{cccc}n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -n \times f \\ 0 & 0 & 1 & 0\end{array}\right) ⎝⎜⎜⎛​n000​0n00​00n+f1​00−n×f0​⎠⎟⎟⎞​

在MVP之後應該做什麼?

回顧一下MVP:

1. m o d e l model model t r a n s f o r m a t i o n transformation transformation( p l a c i n g placing placing o b j e c t s ) objects) objects)

  • v i e w view view t r a n s f o r m a t i o n ( p l a c i n g transformation(placing transformation(placing c a m e r a ) camera) camera)
  • P r o j e c t i o n t r a n s f o r m a t i o n Projection transformation Projectiontransformation
  • O r t h o g r a p h i c Orthographic Orthographic p r o j e c t i o n ( c u b o i d projection(cuboid projection(cuboid t o to to “ c a n o n i c a l ” “canonical” “canonical” c u b e [ − 1 , 1 ] 3 ) cube [-1,1]^3) cube[−1,1]3)(長方體轉換到規範立方體當中)
  • P e r s p e c t i v e Perspective Perspective p r o j e c t i o n ( f r u s t u m projection(frustum projection(frustum t o to to “ c a n o n i c a l ” “canonical” “canonical” c u b e ) cube) cube)(平截頭體轉換為規範立方體)

    在最後投影變換結束後,我們所需要的圖像被投影到了規範立方體中,那麼應該對規範立方體進行怎樣的處理?

    将規範立方體的投影顯示到螢幕上(Screen)

    在轉化時有兩點要注意:

  • 與 z z z無關( z z z的值其實是物體在世界空間中的深度值,但是目前我們隻有一個物體,是以不考慮他)
  • 對 x o y xoy xoy平面進行轉換, [ − 1 , 1 ] 2 [-1,1]^2 [−1,1]2轉換到 [ 0 , w i d t h ] × [ 0 , h e i g h t ] [0,width] × [0,height] [0,width]×[0,height]

M viewport  = ( w i d t h 2 0 0  width  2 0  height  2 0  height  2 0 0 1 0 0 0 0 1 ) M_{\text {viewport }}=\left(\begin{array}{cccc}\frac{w i d t h}{2} & 0 & 0 & \frac{\text { width }}{2} \\ 0 & \frac{\text { height }}{2} & 0 & \frac{\text { height }}{2} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1\end{array}\right) Mviewport ​=⎝⎜⎜⎛​2width​000​02 height ​00​0010​2 width ​2 height ​01​⎠⎟⎟⎞​

稱這個矩陣為視口矩陣。

這個矩陣的具體實作首先對物體進行位移,因為規範立方體中的中心位于原點的位置,而螢幕空間的坐标是從左下角開始為原點 ( 0 , 0 ) (0,0) (0,0),不存在負坐标,是以先将規範立方體的中心移動到 ( w i d t h / 2 , h e i g h t / 2 ) (width/2,height/2) (width/2,height/2)的位置,然後再對規範立方體進行拉伸,拉伸比例如矩陣所示。因為與 z z z無關,是以對 z z z不做任何變換。

繼續閱讀