向量
在 3D 笛卡尔坐标系,⼀个顶点就是XYZ坐标空间上的⼀个位置。⽽在空间中给定的⼀个位置,恰恰是由⼀个单独的 XYZ 定义的,⽽这这样的 XYZ 就是向量。
向量在X轴上的向量 (1,0,0) 向量⻓度为1。我们称为⻓度为1的向量为单位向量。
向量长度计算公式如果⼀个向量不是单位向量,⽽我们把它缩放到1。这个过程叫做标准化。将⼀个向量进⾏标准化就是将它的缩为1。也叫做单位化向量。单位向量表示一个方向。
向量 点乘 (dot product)
点乘只能发⽣在2个向量之间进⾏。
2个(三维向量)单元向量之间进⾏点乘运算将得到⼀个标量(不是三维向量,是⼀个标量)。它表示两个向量之间的夹⻆。
前提条件: 2个向量必须为单位向量
动作: 2个三维向量之间进⾏点乘
结构: 返回⼀个[-1,1]范围的值,这个值其实就是 夹⻆的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);
向量 点乘 (cross product)
2个向量之间叉乘就可以得到另外⼀个向量,新的向量会与原来2个向量定义的平⾯垂直。同时进⾏叉乘,不必为单位向量。通常用于计算法线。
前提: 2个普通向量
动作: 向量与向量叉乘
结果: 向量(垂直于原来2个向量定义的平⾯的向量)
math3d 库中提供了关于叉乘的API
//m3dCrossProduct3 函数获得2个向量之间的叉乘结果得到⼀个新的向量
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const
M3DVector3f v);
矩阵
在其他编程标准中,许多矩阵库定义⼀个矩阵时,使⽤⼆维数组
;
OpenGL的约定⾥,更多倾向使⽤⼀维数组
;这样做的原因是: OpenGL 使⽤的是 Column-Major(以列为主)矩阵排序的约定。
⼀个4*4矩阵是如何在3D空间中表示⼀个位置和⽅向的
列向量进⾏了特别的标注:矩阵的最后⼀⾏都为0,只有最后⼀个元素为1
单元矩阵初始化⽅式
// 单元矩阵初始化⽅式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
};
//单元矩阵初始化⽅式3
void m3dLoadIdentity44f(M3DMatrix44f m);
将⼀个向量 * 单元矩阵 ,就相当于⼀个向量 * 1
不会发⽣任何改变
在线性代数数学的维度,为了便于书写.。所以坐标计算,都是从左往右顺序,进⾏计算。如下列公式:
变换后顶点向量 = V_local * M_model * M_view * M_pro
变换后顶点向量 = 顶点 * 模型矩阵 * 观察矩阵 * 投影矩阵
在OpenGL 的维度。如下列公式:
变换顶点向量 = M_pro * M_view * M_model * V_local
变换顶点向量 = 投影矩阵 * 视图变换矩阵 * 模型矩阵 * 顶点
变换
变换 | 解释 |
---|---|
视图变换 | 指定观察者位置 |
模型变换 | 在场景中移动物体 |
模型视图 | 描述视图/模型变换的二元性(2种看到模型转换的方式) |
投影 | 改变视景体大小和设置它的投影方式 |
视口 | 伪变化,对窗口上最终输出进行缩放 |
模型变换
- 平移
void m3dTranslationMatrix44(M3DMatrix44f m, float x, float y, float z);
m:平移后获得的新的矩阵(输出的结果)
x:在X轴的平移距离
y:在Y轴的平移距离
z:在Z轴的平移距离
- 旋转
m3dRotationMatrix44(m3dDegToRad(45.0), float x, float y, float z);
m3dDegToRad(45.0) : 角度转弧度
x:围绕X轴旋转
y:围绕Y轴旋转
z:围绕Z轴旋转
- 缩放
void m3dScaleMatrix44(M3DMatrix44f m, float xScale, float yScale, float zScale);
m:缩放后获得的新的矩阵(输出的结果)
xScale:在X轴的缩放比
yScale:在Y轴的缩放比
zScale:在Z轴的缩放比
当缩放比为成负数时,实际上是对图像的反转
- 综合变换
void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, const M3DMatrix44f b);
product:变换后获得的新的矩阵(输出的结果)
a:一种变换
b:一种变换
变换的顺序会改变最终的结果
模型变换可以看到上方和下方都执行了平移&旋转操作,但是最终结果并不相同,是因为这些变换都是基于模型本身坐标系执行的,结果也在本身的坐标系中体现。
网友评论