MVP变换矩阵推导及C++实现

Posted 湖广午王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 . \\beginbmatrix x1 \\\\ y1 \\\\ z1 \\\\ w1 \\endbmatrix = \\beginbmatrix m1 & m5 & m9 &m13 \\\\ m2& m6 & m10 &m14\\\\ m3 & m7 &m11&m15\\\\ m4&m8&m12&m16 \\endbmatrix \\beginbmatrix x\\\\ y\\\\ z\\\\ 1 \\endbmatrix = \\beginbmatrix 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 \\endbmatrix \\right .\\tag1 x1y1z1w1=m1m2m3m4m5m6m7m8m9m10m11m12m13m14m15m16xyz1=m1x+m5y+m9z+m13m2x+m6y+m10z+m14m3x+m7y+m11z+m15m4x+m8y+m12z+m16(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 . \\beginbmatrix x1&y1&z1&w1 \\endbmatrix = \\beginbmatrix x & y & z & 1 \\endbmatrix \\beginbmatrix m1 & m5 & m9 &m13 \\\\ m2& m6 & m10 &m14\\\\ m3 & m7 &m11&m15\\\\ m4&m8&m12&m16 \\endbmatrix = \\beginbmatrix 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 \\endbmatrix \\right .\\tag1 [x1y1z1w1]=[xyz1]m1m2m3m4m5m6m7m8m9m10m11m12m13m14m15m16=m1x+m2y+m3z+m4m5x+m6y+m7z+m8m9x+m10y+m11z+m12m13x+m14y+m15z+m16以上是关于MVP变换矩阵推导及C++实现的主要内容,如果未能解决你的问题,请参考以下文章

MVP变换矩阵推导及C++实现

计算机图形学-MVP变换之视图(Model)变换

计算机图形学-MVP变换之投影(Projection)变换

✠OpenGL-3-数学基础

Cg入门10:Vertex Shader - 几何变换 —MVP矩阵变换

Cg入门10:Vertex Shader - 几何变换 —MVP矩阵变换