欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

WebGL 前端高级数学(II)--向量

最编程 2024-04-29 21:07:19
...

前言

本文将讲解网页3D开发中,大量使用的向量方面的知识内容,比如点乘叉乘的意义和作用。 将主要会围绕着什么是向量,作用,运算规则,几何意义和数学推导等几个方面展开。

什么是向量

向量是既有大小,又有方向的量,在物理和工程学中又称为矢量

与之对应的是标量,标量只有大小,没有方向。如身高体重距离等。

日常生活中常见的向量有位移速度加速度光线方向等等。

向量在坐标系中通常用一根带箭头的线段来表示。

向量表示

向量一般用一个上方带一个箭头符号的字母表示, 如 a\vec {a}代表一个名称为 a 的向量。在 2D 笛卡尔坐标系中,假设某向量起点为 O(0, 0),终点为 P(X, Y),那么通常使用 op\overrightarrow {op}来表示这个 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=(x1,y1),b=(x2,y2)\vec{a} = (x1,y1) , \vec{b} = (x2,y2)

向量加减

  • 维度相同的两个向量才可以相加或者相减,得到的新向量维度和原向量相同,新向量各个分量等于原向量各个分量之和或之差。
  • 向量不能和标量相加。
  • 向量减法不满足交换律。
  • 向量加法满足交换律。

a+b=(x1+x2,y1+y2)\vec{a}+\vec{b} = (x1+x2,y1+y2)

ab=(x1x2,y1y2)\vec{a}-\vec{b} = (x1-x2,y1-y2)

向量相加在坐标系中表示如下:

image.png 向量相减在坐标系中表示如下:

image.png

可见向量a-b和b-a的结果大小相同,方向相反,所以不满足交换律。

零向量

零向量是唯一一个大小为 0 的向量,对于其他任意大小不为 0 的向量,它们都存在无数个方向不同的向量,这些向量构成一个圆,零向量我们用的比较少。

负向量

负向量其实是原向量的反方向向量,大小不变,方向相反。求一个向量的负向量,只需将原向量的各个分量变成它们的相反数即可,并且负向量和原向量维度相同。

b=(x,y,z)-\vec{b} = (-x,-y,-z)

负向量可以理解为原向量与 -1 的乘法运算。

向量大小

向量的大小,也就是向量的长度(也叫向量的模),通常用  a|\vec{a}| 来表示,向量的大小等于向量各个分量平方之和的平方根。

a=x2+y22|\vec a| =\sqrt[2]{x^2+y^2}

向量与标量乘除

向量不能和标量相加减,但是向量可以和标量相乘除,向量和标量相乘或者相除返回一个新向量,新向量的各个分量等于原向量的各个分量和标量的乘积或者商。

a2=(x2,y2)\vec a *2 =(x*2,y*2)

a÷2=(x÷2,y÷2)\vec a ÷ 2 =(x÷2,y÷2)

向量与标量相乘的几何解释是:向量乘以标量 n 的意义是以因子|n|缩放向量的长度,例如:为了使向量的长度加倍,应使向量乘以 n 。如果 n < 0,则向量的方向与原向量相反。

单位向量

单位向量是长度为 1 的向量,对于大部分向量,我们只关心向量的方向,而不在意向量的长度,这种情况下就适合用单位向量来表示。比如光线入射方向、反射方向等向量,单位向量通常也被称为标准向量。

对于任意一个不为 0 的向量,我们都能将它转变成同方向的单位向量,这个转变过程我们称之为归一化向量或者标准化向量

归一化向量只需要将原向量除以原向量的长度(模)即可,一定要注意,原向量不能是零向量。

归一化向量的过程:

(x÷a,y÷a)(x ÷|\vec a|,y ÷ |\vec a|)

点乘

标量和向量可以相乘,向量和向量也可以相乘,向量之间乘法包含两种点乘和叉乘。

向量点乘就是将两个向量的各个分量的乘积相加,返回一个标量

点乘的计算方式如下:

ab=x0x1+y0y1\vec a ⋅ \vec b = x0 * x1+y0 *y1

几何意义

点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影

ab=abcos(θ)\vec a ⋅ \vec b = |\vec a| * |\vec b| *cos(θ)

我们经常会用点乘来计算两个向量之间的夹角大小,比如在光照模型中,我们在计算漫反射分量时,就使用了点乘公式,求出入射光和法向量之间夹角的大小,通常只求夹角的话,一般先将两个向量归一化,这样就不用再去计算向量模了,直接取点乘结果即可。

或者判断物体表面是否被光源照射,就是通过法向量和光源入射光线的点积来判断,为正表示光源在表面正面,能被照射到,为负表示光源在表面背面,不能被照到。

又比如在游戏中判断怪物在自己前面还是后面,也会用点积来判断,点积结果为正,表示怪物在自己前面。点积结果为负,表示怪物在自己后面。

推导过程

image.png

  1. 首先定义向量c = a -b
  2. 根据根据三角形余弦定理有:

c2=a2+b22ab cos(θ)c^2 = a^2+b^2-2|a| |b|\ cos(θ)

image.png 3. 根据关系c=a-b(a、b、c均为向量)有:

(ab)(ab)=a22ab+b2=a2+b22ab cos(θ)(a-b)⋅(a-b) = a^2-2a⋅b+b^2 =a^2+b^2-2|a||b|\ cos(θ)

  1. 然后等式进行化简得到:

ab=abcos(θ)\vec a ⋅ \vec b = |\vec a| * |\vec b| *cos(θ)

上一篇: 矢量交叉积(Cross product)的几何意义和应用

下一篇: 点乘与叉乘