美文网首页
OpenGL-16-向量

OpenGL-16-向量

作者: 宇宙那么大丶 | 来源:发表于2020-08-04 23:30 被阅读0次

一、认识向量

标量:例如1、2、3等一个具体的数值。

向量:在3D笛卡尔坐标中,一个顶点(x,y,z)代表了在空间中的一个位置,在数学思维中,这个顶点就是一个向量。相比标量它不仅有大小,还有方向。

列向量、横向量:当然,向量也分为列向量、横向量。OpenGL中用的是列向量。

  • 为什么要使⽤⾏向量?(偏向于书写⽅便)
    1.在⽂字中使⽤⾏向量的形式更加好书写;
    2.⽤矩阵乘法实现坐标系转换时,向量左乘矩阵的形式更加⽅便
    3.DirectX使⽤的是⾏向量

  • 为什么要使⽤列向量?
    1.等式中使⽤列向量形式更好
    2.多本计算机图形学都是使⽤的列向量
    4.OpenGL 使⽤的是列向量


零向量:

负向量:相当于一个向量 * -1 得到一个大小一样,方向相反的向量。主要就是用于拿到一个反方向的向量,例如回弹效果。

单位向量:长度为1的向量就是单位向量。例如:[1,0,0]、[0,1,0]、[0,0,1]

标准化向量:如果一个向量不是单位向量,那我们把它缩放到1的过程就是标准化。

  • 标准化向量 ≠ 单位向量。它们只是长度一样,都是1。

二、向量的模

向量的长度也叫向量的摸,计算公式:


三、向量间的计算

1、标量 ✖️ 向量
2、标量 ➗ 向量

注意

  • 标量和向量相乘时,不需要写称号。 将2个量挨着写就表示他们相乘,通常把标量写左边
  • 标量与向量的乘除法优先级高于加减法
  • 标量不能除以向量,并且向量也不能除以另一个向量
  • 负向量属于乘法的特殊情况,是向量乘以标量-1
  • 乘除法的几何意义:把标量K当做缩放因子,使得整个向量成倍放大或者缩小,或者K=-1,直接调转方向
3、标准化计算

如何单位化向量?
(x / ||xyz||, y / ||xyz||, z / ||xyz||); (注:||xyz||就是这个向量的长度)
使⽤⼀个⾮零向量除以它的模, 就可以得到⽅向相同的单位向量;

4、向量间的加减法

注意

  • 向量不能与标量或者维度不同的向量进行相加减
  • 跟小学数学一样,加法满足交换律,减法不满足(除了两个向量相等的情况,可以硬说成满足)
  • 加减法的几何意义:平移两个向量,让向量A的头连接向量B的尾,然后从A的尾指向B的头画一个向量,这就是向量加法的‘三角形法则’。减法与之类似。
5、向量之间的距离计算
6、向量点乘

点乘:求两个向量直接的夹角,两个向量点乘的结果是一个标量。

image.png
7、向量叉乘
  • 任意向量叉乘自身,都等于零向量


    image.png
image.png image.png
8、练习一下

四、OpenGL中的向量

1、向量

在OpenGL中,GLTools 库中有⼀个组件叫Math3d,其中包含了⼤量好⽤的OpenGL ⼀致的3D数学
和数据类型。

math3d库,有2个数据类型,能够表示⼀个三维或者四维向量。
M3DVector3f 可以表示⼀个三维向量(x,y,z)
M3DVector4f 则可以表示⼀个四维向量(x,y,z,w)
在典型情况下,w坐标设为1.0。x,y,z值通过除以w,来进⾏缩放。

//三维向量/四维向量的声明
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
};
2、向量点乘
  • 点乘的目的,就是求两个向量之间的夹⻆;

在OpenGL中,其实不需要我们进行计算,只需要调用对应的API即可拿到结果:

//1.m3dDotProduct3 函数获得2个向量之间的点乘结果;
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);

//2.m3dGetAngleBetweenVector3 即可获取2个向量之间夹⻆的弧度值;
 float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
3、向量叉乘
  • 2个向量之间叉乘就可以得到⼀个与原来2个向量定义的平⾯相垂直
  • 叉乘不满足交换律。V1 * V2 和 V2 * V1结果可能会不一样

同样,我们只需要调用API即可:

//m3dCrossProduct3 函数获得2个向量之间的叉乘结果得到⼀个新的向量
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);

相关文章

  • OpenGL-16-向量

    一、认识向量 标量:例如1、2、3等一个具体的数值。 向量:在3D笛卡尔坐标中,一个顶点(x,y,z)代表了在空间...

  • 向量空间相关概念总结-向量空间

    什么是向量空间 特点:① 包含向量比如向量组,而且向量组内部的向量维数相同② 包含向量的运动向量的加法->生成新的...

  • OpenGL之3D数学

    向量 向量是既有大小又有方向的量。 零向量与单位向量 模等于0的向量为零向量,模等于1的向量叫做单位向量。注意零向...

  • 3D数学基础及图形开发(二)向量

    向量 向量的基本知识 行向量与列向量 向量分为1维,2维,3维,甚至多维向量,1维的向量是标量。 零向量是唯一一个...

  • OpenGL-向量 & 矩阵

    1.向量 1.1 向量的写法 向量又分为横向量与列向量,横向力与列向量的写法如下图: 1.2 负向量表达式: 如上...

  • Day5--学习笔记--smartyy

    1.向量 向量分为:字符型向量,逻辑型向量,数字型向量向量中所有的元素都必须是同一属性 向量的创建函数:c()是创...

  • R语言向量计算的数学函数汇总2021.1.21

    一、向量函数 1.数学函数 sum(向量名):求和 max(向量名):返回向量最大值 min(向量名):返回向量最...

  • OpenGL -- 向量与矩阵

    向量 单位向量 长度为1的向量,向量长度通过下列公式计算 向量 点乘 点乘只能在两个向量之间进行 两个单位向量进行...

  • OpenGL 向量 矩阵 变换

    向量 单位向量 标量:只有大小,例如:1,2,3...向量:既有大小又有方向。单位向量:向量长度(向量的模)为1的...

  • P20向量

    向量 行向量,列向量 ,可以通过转置获得 向量的线性关系 定义线性组合:是维向量如果 存在 使得注意,是维的向量 ...

网友评论

      本文标题:OpenGL-16-向量

      本文链接:https://www.haomeiwen.com/subject/jtdtrktx.html