六、OpenGL中的向量和矩阵

572 阅读3分钟

向量

  • 数学中:形象的用一个带有箭头的线段指代向量,线段长度表示向量的大小,箭头所指方向为向量的方向。所以说向量我们可以理解为一个同时具有大小和方向的量。
  • OpenGL:在 3D 笛卡尔坐标系中的⼀个顶点,也就是由XYZ三个值构成一个值就是向量。
  • 单位向量:向量长度为1的向量,向量的长度也叫向量的模。
  • 单位化向量:如果⼀个向量不是单位向量, ⽽我们把它缩放到1的过程(只保留方向)。

OpenGL[math3d]对于向量的定义

math3d库中存在2种数据类型,分别表示三维和四维向量。 M3DVector3f表示⼀个三维向量(x, y, z) M3DVector4f表示⼀个四维向量(x, y, z, w) 典型情况下w坐标设为1.0,x,y,z值通过除以w来进⾏缩放。

 typedef float M3DVector3f[3];
 typedef float M3DVector4f[4];
 //声明一个三分量向量操作:
 M3DVector3f vVector3;
  //声明一个四分量的操作:
 M3DVector4f vVector4 =  {0.0f,0.0f,1.0f,1.0f};
 //声明一个三分量顶点数组,例如生成一个三角形
 M3DVector3f vVerts[] = {
 -0.5f,0.0f,0.0f,
 0.5f,0.0f,0.0f,
 0.0f,0.5f,0.0f
 };
向量的点乘

2个向量进行点乘后会得到一个标量,它表示两个向量之间的夹⻆。

 //实现点乘方法:
 // 方法1:返回的是-1,1之间的值。它代表这个2个向量的余弦值。
 float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
 //方法2:返回2个向量之间的弧度值。
 float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
向量的叉乘

2个向量进行叉乘可以得到另外⼀个向量,新的向量会与原来2个向量定义的平⾯垂直(法线)

 void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);

矩阵

简单来说矩阵就是一个矩形的数字、符号或表达式数组。矩阵中每一项叫做矩阵的元素。 OpenGL中使用一维数组来表示一个矩阵(约定试用列优先矩阵)。 列向量进⾏了特别的标注:矩阵的最后⼀⾏都为0,只有最后⼀个元素为1。 在其他编程标准中, 许多矩阵库定义一个矩阵时,使⽤用二维数组;OpenGL的约定⾥里,更多倾向使用 一维数组; 这样做的原因是: OpenGL 使用的是 Column-Major(以列为主)矩阵排序的约定;

单元矩阵
 //单元矩阵初始化方式1                       
 GLFloat m[] = {
 1,0,0,0, //X Column
 0,1,0,0, //Y Column
 0,0,1,0, //Z Column
 0,0,0,1 // Translation
 }
 //单元矩阵初始化方式2
 M3DMatrix44f m = {
 1,0,0,0, //X Column
 0,1,0,0, //Y Column
 0,0,1,0, //Z Column
 0,0,0,1 // Translation
 }
 //单元矩阵初始化方式2
 void m3dLoadIdentity44f(M3DMatrix44f m);

单元矩阵在 OpenGL 的维度,有以下公式: 变换顶点向量 = M_pro * M_view * M_model * V_local 变换顶点向量 = 投影矩阵 ✖ 视图变换矩阵 ✖ 模型矩阵 ✖ 顶点

矩阵左乘
  1. 从栈顶获取栈顶矩阵 复制到 mTemp
  2. 将栈顶矩阵 mTemp 左乘 mMatrix
  3. 将结果放回栈顶空间⾥;