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⎦⎥⎥⎤=⎣⎢⎢⎡m1m2m3m4m5m6m7m8m9m10m11m12m13m14m15m16⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎡m1∗x+m5∗y+m9∗z+m13m2∗x+m6∗y+m10∗z+m14m3∗x+m7∗y+m11∗z+m15m4∗x+m8∗y+m12∗z+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⎦⎥⎥⎤=⎣⎢⎢⎡m1∗x+m2∗y+m3∗z+m4m5∗x+m6∗y+m7∗z+m8m9∗x+m10∗y+m11∗z+m12m13∗x+m14∗y+m15∗z+m16⎦以上是关于MVP变换矩阵推导及C++实现的主要内容,如果未能解决你的问题,请参考以下文章