向量
在 3D 笛卡尔坐标系,一个顶点,就是 XYZ 坐标空间上的一个位置。而这个位置是由一个唯一的 XYZ 定义的,而这样的 XYZ 就是向量。
- 标量:只有大小,没有方向。
- 矢量:既有大小,又有方向(有方向的标量)
向量的模计算公式:
单位向量
(1,0,0), (0,1,0), (0,0,1),分别称为 X 轴,Y 轴,Z 轴上的单位向量。
如果一个向量不是单位向量,而我们把它缩放到 1,这个过程叫做标准化。(x, y, z),x,y,z不全为0,它的标准化计算:
向量点乘
对于向量 A = (x1, y1, z1) ,向量 B = (x2, y2, z2), 则向量A点乘向量 B:
A·B = x1 * x2 + y1 * y2 + z1 * z2
同时有
A·B = |A||B|Cosθ
以上可见,向量的点乘结果为一个标量,即一个数值。向量点乘符合乘法交换律,即:A·B = B·A。
OpenGL 对于点乘相应的 API:
//1.m3dDotProduct3 函数获得2个向量之间的点乘结果;
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
//2.m3dGetAngleBetweenVector3 即可获取2个向量之间夹角的弧度值;
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
向量叉乘
- 向量 A 叉乘 B 的结果为一个新的向量C;
- 且向量 C 的长度:|C| = |A||B|Sinθ;
- 向量 C 的方向垂直于向量 A 且垂直于向量 B,即垂直于 A,B 形成的平面。
A x B = C
OpenGL 对于叉乘相应的 API:
//1.m3dCrossProduct3 函数获得2个向量量之间的叉乘结果得到一个新的向量
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);
OpenGL 中的向量
有两个数据类型:
- M3DVector3f 表示一个三维向量(x, y, z)
- M3DVector4f 表示一个四维向量(x, y, z, w)
代码示例:
//三维向量
M3DVector3f[3] vVertex = {0, 0, 1};
//四维向量
M3DVector4f vVertex = {0,0,1,1};
//声明一个三分量顶点数组,例如⽣成一个三⻆形
M3DVector3f vVerts[] = {
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,0.5f,0.0f
};
矩阵(Matrix)
矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。
分类
- 行优先矩阵:逐行读取
- 列优先矩阵:逐列读取
- 行优先矩阵经过转置可得到列优先矩阵
例如:一个3x4 的数组:
通过行优先机制的编译器,意思为优先保留第1行的所有元素
通过列优先机制的编译器,意思为优先保留第1列的所有元素
单元矩阵
- 主对角线上数据都是1,其余元素都是0
- 向量 X 单元矩阵 = 向量,不会发生任何变化
矩阵的点乘
- 两个矩阵的行数和列数必须相等才能进行点乘
- 两个矩阵相乘,结果为两个矩阵对应元素相乘组成的矩阵,即
矩阵的叉乘
- 两个矩阵叉乘必须满足第一个矩阵的列数与第二个矩阵的行数相等
- 矩阵叉乘不满足交换律
OpenGL 中的矩阵
在其他编程标准中, 许多矩阵库定义一个矩阵时,使⽤二维数组;OpenGL 的约定里,更多倾向使⽤一维数组;这样做的原因是: OpenGL 使用的是 Column-Major(以列列为主)矩阵排序的约定。
OpenGL 中的 4x4 的矩阵,每一列都是由4个元素组成的向量,第一列表示x轴方向,第二列表示y轴方向,第三列表示z轴方向,第四列表示交换位置
一个4*4矩阵是如何在3D空间中表示一个位置和方向的,列向量进行了特别的标注:矩阵的最后一⾏都为0,只有最后一个元素为1。
初始化一个单元矩阵
- 通过GLFloat定义一个一维数组
GLfloat vMatrix[] = {
1, 0, 0, 0, // X Column
0, 1, 0, 0, //Y Column
0, 0, 1, 0, //Z Column
0, 0, 0, 1 //Translation
};
- 通过 M3DMatrix44f 创建
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
};
- 通过 m3dLoadIdentity44f 创建
void m3dLoadIdentity44f(M3DMatrix44f m);
矩阵变换
- 数学角度
数学中为了方便计算,都是以行矩阵为标准,从左到右的顺序进行计算,所以在数学中,顶点将以行向量的方式表示
变换后顶点向量 = V_local * M_model * M_view * M_pro
变换后顶点向量量 = 顶点 ✖ 模型矩阵 ✖ 观察矩阵 ✖ 投影矩阵
- OpenGL 的维度
变换顶点向量量 = M_pro * M_view * M_model * V_local
变换顶点向量量 = 投影矩阵 ✖ 视图变换矩阵 ✖ 模型矩阵 ✖ 顶点
网友评论