六、OpenGL 中的向量、矩阵

2020-07-17  本文已影响0人  致青春_bf42

向量

1. 首先让我们了解什么是标量

标量亦称“无向量”。有些物理量,只具有数值大小,而没有方向,部分有正负之分。这些量之间的运算遵循一般的代数法则。用通俗的说法,标量是只有大小,没有方向的量。
物理学中,标量指在坐标变换下保持不变的物理量。

2. 那什么是向量呢?

向量是有方向的标量,即不仅有大小,还有方向

2.1 单位向量

在 X轴上的向量 (1,0,0). 向量⻓度为1. 我们称为⻓度为1的向量为单位向量.
向量⻓度(向量的模)计算公式: 如果⼀个向量不是单位向量, ⽽我们把它缩放到1.这个过程叫做标准化. 将⼀个向量进⾏标准化就是将它的缩为1; 也叫做单位化向量

向量长度通过下列公式计算
2251862-a4150ad957f82d09.png
2.2 向量 点乘
2251862-e68f9ca988b7a75c.png
#mark m3dDotProduct3:获得2个向量量之间的点乘结果,即余弦值 = cos α
float  m3dDotProduct3(const M3DVector3f u,const M3DVector3f v)
 #mark m3dGetAngleBetweenVector3:获取2个向量之间夹⻆的弧度值,即α = arccos(余弦值)
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
2.3 向量 叉乘
2251862-5e6585de9ac775a4.png
#mark m3dCrossProduct3 函数获得2个向量之间的叉乘结果得到⼀个新的向量
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);
2.3 OpenGL 如何定义向量 [ math3d 库]

math3d库,有2个数据类型,能够表示⼀个三维或者四维向量。

//三维向量/四维向量的声明
typedef float M3DVector3f[3];
typedef float M3DVector4f[4];
//声明⼀个三维向量 M3DVector3f:类型 vVector:变量名
M3DVector3f vVector;
//声明⼀个四维向量并初始化⼀个四维向量
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
};

矩阵

1. 我们为什么要用矩阵

假设, 在空间有⼀个点.使⽤ xyz 描述它的位置. 此时让其围绕任意位置旋转⼀定⻆度后. 我们需要知道这个点的新的位置. 此时需要通过矩阵进⾏计算;
为什么?
因为新的位置的x 不单纯与原来的x还和旋转的参数有关. 甚⾄于y和z坐标有关;矩阵只有⼀⾏或者⼀列都是合理的. 只有⼀⾏或者⼀列数字可以称为向量. 也可以称为矩阵;

2. 单位矩阵
2.1 矩阵分类
2251862-3c95268cd1ee2e11.png
2.2 矩阵的点乘
2251862-10d9214dcad60b5e.png
2.3 矩阵的叉乘
2.4 OpenGL中的矩阵
#mark 1.通过GLFloat定义一个一维数组
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
}

#mark  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
}

#mark  3.单元矩阵初始化⽅式
void m3dLoadIdentity44f(M3DMatrix44f m); 

2.5 OpenGL中的矩阵相乘
2.5.1 线性代数角度去分析
截屏2020-07-17 下午2.09.45.png
2.5.2 OpenGL角度
OpenGL矩阵堆栈中矩阵相乘源码分析
源码分析

而我们在观察者不动、物体动的观察方式中,根据之前Demo代码可知

代码分析
    //2.模型视图矩阵栈堆,压栈
    modelViewMatrix.PushMatrix();
    
    //3.获取摄像头矩阵
    M3DMatrix44f mCamera;
    //从camereaFrame中获取矩阵到mCamera
    cameraFrame.GetCameraMatrix(mCamera);
    //模型视图堆栈的 矩阵与mCamera矩阵 相乘之后,存储到modelViewMatrix矩阵堆栈中
    modelViewMatrix.MultMatrix(mCamera);
    
    //4.创建矩阵mObjectFrame
    M3DMatrix44f mObjectFrame;
    //从ObjectFrame 获取矩阵到mOjectFrame中
    objectFrame.GetMatrix(mObjectFrame);
    //将modelViewMatrix 的堆栈中的矩阵 与 mOjbectFrame 矩阵相乘,存储到modelViewMatrix矩阵堆栈中
    modelViewMatrix.MultMatrix(mObjectFrame);
2251862-fa5b4e4f8e28fcd5.png
上一篇 下一篇

猜你喜欢

热点阅读