1. 程式人生 > >MVP變換矩陣推導及C++實現

MVP變換矩陣推導及C++實現

在進行影象處理時,經常會用到矩陣,尤其在遊戲中,基本都會存在一個Camera的概念,實際上,這個Camera一般就是矩陣或者是對矩陣的封裝。一個4x4矩陣,可以將平移、旋轉、縮放等變換操作包含在內。但是為了便於理解與控制,這個最終的矩陣,往往是由一系列便於理解的引數來運算得出的。而Model-View-Projection變換模型就是最常用,一般來說,我們並不必去實現它們,因為有太多的工具類可以直接使用。但是理解它們的原理會讓我們更好的理解3D(包括2D)的圖形變換。

矩陣的基礎知識

在高數中,我們都學過矩陣的基本運算及一些基本定律。在我之前的部落格Android OpenGLES2.0(十)——OpenGL中的平移、旋轉、縮放

中,也提到了矩陣運算,不過之前的矩陣是使用了Android自帶的工具類。在本篇部落格中,將會說明如何去實現一個矩陣工具類。所以我們需要對矩陣運算及相關定律理解的更加透徹。
我們所需要使用到的矩陣運算,主要就是矩陣的乘法、轉置等相關運算及操作。

向量和矩陣的乘法

我們使用矩陣去實現圖形的3D變換,實際上,通常就是對圖形的所有點去做3D變換,而每個點的位置,都可以看做是一個向量,同時,向量也是特殊的矩陣。矩陣和列向量的乘法在之前的部落格有提到,這裡再貼一次。
(1)

[ x 1
y 1 z 1 w 1
]
= [ m 1 m 5 m 9 m 13 m 2 m 6 m 10 m 14 m 3 m 7 m 11 m 15 m 4 m 8 m 12 m 16 ] [ x y z 1 ] = [ m 1 x + m 5 y + m 9 z + m 13 m 2 x + m 6 y + m 10 z + m 14 m 3 x + m 7 y + m 11 z + m 15 m 4 x + m 8 y + m 12 z + m 16 ]
\left . \begin{bmatrix} x1 \\ y1 \\ z1 \\ w1 \end{bmatrix} = \begin{bmatrix} m1 & m5 & m9 &m13 \\ m2& m6 & m10 &m14\\ m3 & m7 &m11&m15\\ m4&m8&m12&m16 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} = \begin{bmatrix} m1*x + m5*y + m9*z +m13 \\ m2*x + m6*y + m10*z +m14\\ m3*x + m7*y + m11*z +m15\\ m4*x + m8*y + m12*z +m16 \end{bmatrix} \right .\tag{1}
矩陣和行向量的乘法與此類似,只是列向量是右乘,行向量是左乘。
(1) [ x 1 y 1 z 1 w 1 ] = [ x y z 1 ] [ m 1 m 5 m 9 m 13 m 2 m 6 m 10 m 14 m 3 m 7 m 11 m 15 m 4 m 8 m 12 m 16 ] = [ m 1 x + m 2 y + m 3 z + m 4 m 5 x + m 6 y + m 7 z + m 8 m 9 x + m 10 y + m 11 z + m 12 m 13 x + m 14 y + m 15 z + m 16 ] \left . \begin{bmatrix} x1&y1&z1&w1 \end{bmatrix} = \begin{bmatrix} x & y & z & 1 \end{bmatrix} \begin{bmatrix} m1 & m5 & m9 &m13 \\ m2& m6 & m10 &m14\\ m3 & m7 &m11&m15\\ m4&m8&m12&m16 \end{bmatrix} = \begin{bmatrix} m1*x + m2*y + m3*z +m4 \\ m5*x + m6*y + m7*z +m8\\ m9*x + m10*y + m11*z +m12\\ m13*x + m14*y + m15*z +m16 \end{bmatrix} \right .\tag{1}