OpenGL中的3D数学

2020-07-17  本文已影响0人  魔杰西

向量篇

在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,这样的方式我们叫左乘:
                                                        顶点向量 = 投影矩阵 * 视图变换矩阵 * 模型矩阵 * 顶点

矩阵相乘源码理解:
  1. 从栈顶获取栈顶矩阵 复制到 mTemp
  2. 将栈顶矩阵 mTemp 左乘 mMatrix
  3. 将结果放回栈顶空间⾥里里。
上一篇 下一篇

猜你喜欢

热点阅读