向量:
在3D笛卡尔坐标系中,A点在XYZ轴上对应的位置分别为OC,OD,OB,在X轴上,我们用X(蓝色部分)(1,0,0)表示长度为1的向量为单位向量(Y轴,Z轴以此类推)。OA的向量就可以表示为{x,y,z};
向量的乘法
点乘只能发生在两个向量之间,且点乘时,两向量必须是单位向量,如果不是,需要将向量进行单位化后,再点乘,所以我们在两个向量点乘的时候,如果不是单位向量,我们必须先转化为单位向量
两单位向量点乘,最后得到的结果是两个向量之间的夹角,即余弦(cos值)
如果OA和OB不是单位向量,先转化为单位向量,然后点乘,得到 1.pngmath3d 库中提供了关于点乘的API
1.m3dDotProduct3 函数获得2个向量之间的点乘结果;
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
2.m3dGetAngleBetweenVector3 即可获取2个向量之间夹⻆的弧度值;
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
math3d库,有2个数据类型,能够表示⼀个三维或者四维向量:
M3DVector3f可以表示⼀个三维向量(x,y,z);
M3DVector4f则可以表示⼀个四维向量(x,y,z,w);
在典型情况下,w坐标设为1.0。x,y,z值通过除以w,来进⾏缩放。⽽除以1.0则本质上不改变x,y,z值。
三维向量/四维向量的声明
typedef float M3DVector3f[3];
typedef float M3DVector4f[4];
声明⼀个三维向量M3DVector3f:类型vVector:变量名
M3DVector3f vVector;
声明⼀个四维向量并初始化⼀个四维向量
M3DVector4f vVertex = {0,0,1,1};
矩阵:
特点:
1)主对角线上数据都是1,其余元素都是0,即为单元矩阵
2)单位矩阵相乘满足交换法则,即:向量 X 单元矩阵 = 向量 X 1,不会发生任何变化
3) 向量与单元矩阵相乘的前提是:向量的列数 == 单元矩阵的行数
叉乘:A*B,A的列数==B的行数
单元矩阵Matrix:
//单元矩阵初始化⽅式①
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
}
// 单元矩阵初始化⽅式 ②
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
}
//单元矩阵初始化⽅式③
void m3dLoadIdentity44f(M3DMatrix44f m);
在线性代数数学的维度,为了便于书写. 所以坐标计算. 都是从左往右顺序,进⾏计算. 如下列公式:
变换后顶点向量= V_local * M_model * M_view * M_pro
变换后顶点向量= 顶点 ✖ 模型矩阵 ✖ 观察矩阵 ✖ 投影矩阵;
1.从栈顶获取栈顶矩阵 复制到mTemp
- 将栈顶矩阵mTemp 左乘mMatrix
-
将结果放回栈顶空间⾥
1.png
网友评论