写在前面
前面几节内容环境搭建,绘制三角形,以及使用索引绘制,让我们对现代OpenGL中绘图做了简单了解。要继续后面的部分,需要熟悉OpenGL中涉及的数学知识。因此本节开始介绍OpenGL中的基本数学。
介绍这部分内容的主旨在于对OpenGL涉及的数学有个整体把握,重点把握一些概念在OpenGL中的应用。内容尽量以例子形式说明,仅在必要时会给出数学证明。一个主题往往涉及过多内容,对于文中省略的部分,请参考相应的教材。
通过本节可以了解到
- 向量基本概念和操作
- 矩阵的基本概念和操作
- GLM数学库
向量的概念
向量是研究2D、3D数学的标准工具。向量V是一个既有大小又有方向的量(联系位移和速度的概念)。在数学上,常用一条有方向的线段来表示向量。例如下图n维空间的向量 v=AB→=(v1,v2,...,vn) 如下图所示,向量起点为A,终点为B:
理解向量把握:
1.向量的大小就是向量的长度(模)。向量的长度非负。
2.向量的方向描述了向量的指向。
3.向量是没有位置的,与点是不同的。
4.向量与标量不同,变量是只有大小而没有方向的量,例如位移是向量,而距离是标量。
零向量与单位向量
向量的长度即模,定义为:
|v|=v21+v22+⋯+v2n−−−−−−−−−−−−−−√
即 |v|=∑ni=1v2i−−−−−−−√
模等于0的向量成为0向量,模等于1的向量叫做单位向量。注意零向量的方向是任意的。
由一个向量v求与它同方向的单位向量过程称为标准化(normalization),这个单位向量成为标准化向量(normalized vector)。计算过程为:
vnorm=v|v|,v≠0
三角形法则和平行四边形法则
两个向量 a 和
物理上力学求和经常使用平行四边形法则,表达的是向量加法运算的结合律,即: a+b=b+a ,如下图所示(图片来自:mathinsight):
与一个向量 a 大小相同,方向相反的向量,称为向量
a+(−a)=0
向量夹角
两个非零向量的夹角规定为不超过 π 的角度 θ ,即
0≤θ≤π
如下图所示:
注意这个夹角的范围。当 θ=π2 称两个向量a与b垂直,当 θ=0或者π 时,称向量a与b平行。
向量点积(dot product)
向量点积,也称为向量的数量积,点积的结果是一个标量,其定义为:
A.B=|A||B|cosθ(1)
其中 θ 表示向量A和B之间的夹角。
向量点积的几何意义
要理解点积的几何意义,首先了解概念向量在轴上的投影(scalar projection ),这个投影计算得到一个标量。向量A在B上的投影定义为:
AB=|A|cosθ(2)
如下图所示(来自wiki dot product):
则1式可以写为:
A.B=|A|BA=|B|AB(3)
在空间几何中,例如n空间中,向量的坐标表示为:
A=(a1,b2,⋯,cn) , B=(b1,b2,⋯,bn) ,
则两个向量的点积可以表示为:
向量点积的应用
向量点积的一个重要应用在于,可以快速求出两个向量的夹角余弦。
由公式1可知,两个向量的夹角余弦计算公式为:
cosθ=a.b|a||b|(5)
当a和b都是单位向量时,两单位向量的夹角余弦值为:
cosθ=a.b(6)
公式6能快速计算出两个单位向量的夹角余弦,在计算光照时经常使用。
另外当一个向量为单位向量时:
|a|2=a⋅a(7)
这个公式也是经常使用的。
向量的叉积(cross product)
两个向量a和b的叉积,结果是一个向量 c=a×b ,c的方向垂直于a和b,它需要根据右手规则来确定(下文讲解);c的大小等于
|c|=|a||b|sinθ