WebGL 前端高级数学(II)--向量
前言
本文将讲解网页3D开发中,大量使用的向量方面的知识内容,比如点乘叉乘的意义和作用。 将主要会围绕着什么是向量,作用,运算规则,几何意义和数学推导等几个方面展开。
什么是向量
向量
是既有大小,又有方向的量,在物理和工程学中又称为矢量
。
与之对应的是标量
,标量只有大小,没有方向。如身高
、体重
、距离
等。
日常生活中常见的向量有位移
,速度
,加速度
、光线方向
等等。
向量在坐标系中通常用一根带箭头的线段来表示。
向量表示
向量一般用一个上方带一个箭头符号的字母表示, 如 代表一个名称为 a
的向量。在 2D 笛卡尔坐标系中,假设某向量起点为 O(0, 0),终点为 P(X, Y),那么通常使用 来表示这个 2 维向量,并且这个向量也可以用坐标的形式来表示: OP=(x−0,y−0)=(x,y)。
那么如果一个(x,y,z),它既可以表示向量,又可以表示一个坐标,那么我们该如何区分它呢?
这是一个非常重要的问题,通常使用齐次坐标系
来解决这种混乱。齐次坐标系使用 N + 1
维向量来表示 N 维点坐标
和 N 维向量
。假设在 3 维坐标系中,有一个点(X, Y, Z),那么在齐次坐标系中会使用 4 维向量来表示它 (X, Y, Z, W)。注意: W > 0
。如果是向量的话,齐次坐标将向量表示为(X, Y, Z, 0)
。
请谨记:W 为 0 时代表向量。W 不为 0 代表点。
- 齐次坐标系的引入除了解决这种概念混乱,还有一个重要的作用,透视除法
比较两个标量是否相等,只要比较他们大小是否相同即可。但是两个向量相等需要要满足以下两个条件:
- 大小相等
- 方向相同
向量的运算
假设有如下两个向量:
向量加减
- 维度相同的两个向量才可以相加或者相减,得到的新向量维度和原向量相同,新向量各个分量等于原向量各个分量之和或之差。
- 向量不能和标量相加。
- 向量减法不满足交换律。
- 向量加法满足交换律。
向量相加在坐标系中表示如下:
向量相减在坐标系中表示如下:
可见向量a-b和b-a的结果大小相同,方向相反,所以不满足交换律。
零向量
零向量是唯一一个大小为 0 的向量,对于其他任意大小不为 0 的向量,它们都存在无数个方向不同的向量,这些向量构成一个圆,零向量我们用的比较少。
负向量
负向量其实是原向量的反方向向量,大小不变,方向相反。求一个向量的负向量,只需将原向量的各个分量变成它们的相反数即可,并且负向量和原向量维度相同。
负向量可以理解为原向量与 -1 的乘法运算。
向量大小
向量的大小,也就是向量的长度(也叫向量的模),通常用 来表示,向量的大小等于向量各个分量平方之和的平方根。
向量与标量乘除
向量不能和标量相加减,但是向量可以和标量相乘除,向量和标量相乘或者相除返回一个新向量,新向量的各个分量等于原向量的各个分量和标量的乘积或者商。
向量与标量相乘的几何解释是:向量乘以标量 n 的意义是以因子|n|缩放向量的长度,例如:为了使向量的长度加倍,应使向量乘以 n 。如果 n < 0,则向量的方向与原向量相反。
单位向量
单位向量是长度为 1 的向量,对于大部分向量,我们只关心向量的方向,而不在意向量的长度,这种情况下就适合用单位向量来表示。比如光线入射方向、反射方向等向量,单位向量通常也被称为标准向量。
对于任意一个不为 0 的向量,我们都能将它转变成同方向的单位向量,这个转变过程我们称之为归一化向量
或者标准化向量
。
归一化向量只需要将原向量除以原向量的长度(模)即可,一定要注意,原向量不能是零向量。
归一化向量的过程:
点乘
标量和向量可以相乘,向量和向量也可以相乘,向量之间乘法包含两种点乘和叉乘。
向量点乘就是将两个向量的各个分量的乘积相加,返回一个标量
。
点乘的计算方式如下:
几何意义
点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影
我们经常会用点乘来计算两个向量之间的夹角大小,比如在光照模型中,我们在计算漫反射分量时,就使用了点乘公式,求出入射光和法向量之间夹角的大小,通常只求夹角的话,一般先将两个向量归一化,这样就不用再去计算向量模了,直接取点乘结果即可。
或者判断物体表面是否被光源照射,就是通过法向量和光源入射光线的点积来判断,为正表示光源在表面正面,能被照射到,为负表示光源在表面背面,不能被照到。
又比如在游戏中判断怪物在自己前面还是后面,也会用点积来判断,点积结果为正,表示怪物在自己前面。点积结果为负,表示怪物在自己后面。
推导过程
- 首先定义向量c = a -b
- 根据根据三角形余弦定理有:
3. 根据关系c=a-b(a、b、c均为向量)有:
- 然后等式进行化简得到:
推荐阅读