向量相关
向量
定义:既有大小,又有方向的一个几何对象。
单位向量:不论方向,大小为1的向量
向量大小(长度/模)的计算公式
向量的模的计算
非单位向量(x, y, z)转化为单位向量
2251862-21ee5fab7252ed0e.png
在 math3d 库中提供关于向量的类型typedef float M3DVector3f[3]; typedef float M3DVector4f[4];
//三维向量
typedef float M3DVector3f[3];
//四维向量
typedef float M3DVector4f[4];
向量点乘
2个(三维向量)单元向量之间进行点乘运算将得到一个标量,它表示两个向量之间的夹角(余弦值cos)。
在 math3d 库中提供关于点乘的API
//1.m3dDotProduct3 函数获得2个向量量之间的点乘结果
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
//2.m3dGetAngleBetweenVector3 即可获取2个向量量之间夹⻆角的弧度值
float m3dGetAngleBetweenVector3(const M3DVector3f u,const
M3DVector3f v);
向量叉乘
2个向量量 之间叉乘就可以得到另外⼀一个向量量,新的向量量会与原来2个向量量定义的平⾯面垂直。
两个向量的顺序不能随意调换,不然角度会相反。
在 math3d 库中提供关于点乘的API
//1.m3dCrossProduct3 函数获得2个向量量之间的叉乘结果得到⼀一个新的向量量
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const
M3DVector3f v)
矩阵相关
矩阵
矩阵分类:
- 行优先矩阵:一行一行读取
- 列优先矩阵:一列一列读取。OpenGL使用约定。
两者的关系为:行优先矩阵经过转置,即可的到列优先矩阵
在 math3d 库中提供关于矩阵的API
//三维矩阵
typedef float M3DMatrix33f[9];
//四维矩阵
typedef float M3DMatrix44f[16];
单位矩阵
主对角线上数据都是1,其余元素都是0,即为单元矩阵。
向量 X 单元矩阵 = 向量 X 1,不会发生任何变化。
向量与单元矩阵相乘的前提是:
向量的列数 == 单元矩阵的行数。
如4x4和4x1可以获得4x1向量
若4x1和4x4虽然不会报错,但是无意义,不符合矩阵规定
在 math3d 库中提供关于单元矩阵的API
//单元矩阵的初始化方式
void m3dLoadIdentity44f(M3DMatrix44f m);
OpenGL矩阵变换
在线性代数维度的坐标计算,一般是从左往右计算,且使用行优先矩阵
变换后顶点向量量 = V_local * M_model * M_view * M_pro
变换后顶点向量量 = 顶点(1x4) * 模型矩阵(4x4) * 观察矩阵(4x4) * 投影矩阵(4x4)
在OpenGL维度的坐标计算,一般是从右往左计算,且使用行优先矩阵
OpenGL矩阵变换变换顶点向量量 = M_pro * M_view * M_model * V_local
变换顶点向量量 = 投影矩阵(4x4) * 视图变换矩阵(4x4) * 模型矩阵(4x4) * 顶点(4x1)
OpenGL中代码如下
代码段
矩阵左乘
- 从栈顶获取栈顶矩阵 复制到 mTemp
- 将栈顶矩阵 mTemp 左乘 mMatrix
- 将结果放回栈顶空间⾥
网友评论