这篇文章主要是讲了矩阵的相乘、旋转、平移、缩放、绕轴翻转、求逆、求转置等运算。
矩阵一共写了两套,一个是给2D元素使用的,一套是给3D对象使用的,这里为了减少篇幅,只写4*4的矩阵的运算,原理和3*3矩阵一直,相比之下比3*3矩阵困难,理解了4*4的运算自然也就理解3*3的运算了。
矩阵相乘: 先说什么是行什么是列,横着的就是行,竖着的就是列。可以看一下图片1.1,别弄过了。不然一会计算一起全都弄饭了算起来就全错。 计算说的简单点就是每一行乘上每一列,然后把算出来的结果保存到一个新的矩阵对应的n行m列中。其实这个可以从结果出发反着看比较容易能看懂,比如说我要计算mat[0][0]这个mat的第0行第0列怎么算? 就是让
a[0][0]*b[0][0]+
a[0][1]*b[1][0]+
a[0][2]*b[2][0]+
a[0][3]*b[3][0] 得到的结果就是mat[0][0]想要的结果
程序1.1
Matrix3D Matrix3D::operator*(Matrix3D &mat) { Matrix3D temp; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { temp.m[i][j] = m[i][0] * mat.m[0][j] + m[i][1] * mat.m[1][j] + m[i][2] * mat.m[2][j] + m[i][3] * mat.m[3][j]; } } return temp; }
矩阵绕X轴旋转:直接套用图1.2 公式就可以:
但是大家一定会有疑问,公式里不是这样的呀?为什么行列正好反过来了,这是因为OpenGL虽然用的是行矩阵,但是是列主序。相当于存空间信息的时候要以列主序的方式去存。
下文有具体解释什么是行主序,什么是列主序列,这里就不展开讲这个了。
https://www.jianshu.com/p/bfc8327eaad3
程序1.2
void Matrix3D::XRotate(float angle) { m[1][1] =cos(GL_PI/180*angle) ; m[1][2] =sin(GL_PI/180*angle) ; m[2][1] =-sin(GL_PI/180*angle); m[2][2] =cos(GL_PI/180*angle) ; }
矩阵绕Y轴旋转:同上直接套图1.3公式,空间信息存成列主序列:
程序1.3
void Matrix3D::YRotate(float angle) { m[0][0] =cos(GL_PI/180*angle); m[0][2] =-sin(GL_PI/180*angle) ; m[2][0] = sin(GL_PI / 180 * angle); m[2][2] =cos(GL_PI/180*angle); }
矩阵绕Z轴旋转:同上直接套图1.4公式,空间信息存成列主序列: