向量篇
在3D笛卡尔坐标系中,我们通过向量(x,y,z)来确定顶点位置。
向量的模也就是我们通常所说的长度,他可以通过下图公式计算出来:
长度为1的向量我们又叫单位向量,我们可以将任一向量转化为单位向量(将x,y,z分别除以向量的模)。
向量可以进行加减计算,在OpenGL开发中,具有价值的计算就是向量的点乘和叉乘。
点乘(dot product),两个单位向量点乘会得到一个标量,即两个向量的夹角的cos值。
叉乘(cross product),两个向量叉乘会得到一个新的向量,这个向量跟原来两个向量定义的平面垂直。
在GLTools库中有一个组件叫做 Math3d,他为我们提供了很多3D数学相关api:
math3d 库中提供了了关于点乘的API
//1.m3dDotProduct3 函数获得2个向量量之间的点乘结果;
float m3dDotProduct3(const M3DVector3f u, const M3DVector3f v);
//2.m3dGetAngleBetweenVector3 即可获取2个向量量之间夹⻆角的弧度值;
float m3dGetAngleBetweenVector3(const M3DVector3f u, const M3DVector3f v);
math3d 库中提供了了关于叉乘的API
//1.m3dCrossProduct3 函数获得2个向量量之间的叉乘结果得到⼀一个新的向量量
void m3dCrossProduct3(M3DVector3f result, const M3DVector3f u, const M3DVector3f v);
矩阵篇
何为矩阵:
部分概念:
如果矩阵只有一行或者一列,既可叫做向量又可叫做矩阵。
主对角线上都是1,其余元素都为0,这样的矩阵叫做单元矩阵。
矩阵可以进行叉乘,矩阵叉乘的前提是前一个矩阵的列数等于后一个矩阵的行数。
OpenGL中,使用较多的矩阵都是一维数组创建的,且规定使用以列为主的矩阵排序。其中列向量进行了特殊的标注,表示这是以列为主的矩阵,主要体现为矩阵的最后一行都是0,只有最后一个元素为1。
OpenGL中的矩阵都是4x4的,每一列都是由4个元素组成的向量。
OpenGL中,初始化矩阵的三种方式:
矩阵相乘的理解:
线性代数角度
在数学中,顶点一般以行向量来表示,所以为了满足矩阵相乘的基本规则(前一个矩阵的列数等于后一个矩阵的行数),顶点在左,mvp在右,即:
顶点向量 = 顶点 * 模型矩阵 * 视图变换矩阵 * 投影矩阵
OpenGL维度
在OpenGL中,顶点规定以向量来表示,即顶点在右,mvp在左,同时矩阵相乘不满足交换律,mvp顺序也得相应得调整为pvm,这样的方式我们叫左乘:
顶点向量 = 投影矩阵 * 视图变换矩阵 * 模型矩阵 * 顶点
矩阵相乘源码理解:
- 从栈顶获取栈顶矩阵 复制到 mTemp
- 将栈顶矩阵 mTemp 左乘 mMatrix
- 将结果放回栈顶空间⾥里里。