前端进阶WebGL中数学知识(二)——向量

前言

本文将讲解网页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(θ)

  1. 向量a,b的长度都是可以计算的已知量,则知道余弦值,在根据反余弦arccos,可以得到a和b间的夹角θ:

cos(θ)=(abab)cos(θ) = \left(\frac{a⋅b}{|a||b|}\right)

  1. 根据这个公式就可以计算向量a和向量b之间的夹角。从而就可以进一步判断这两个向量是否是同一方向,是否正交(也就是垂直)等方向关系,具体对应关系为:
a·b>0 方向基本相同,夹角在0°到90°之间
a·b=0 正交,相互垂直
a·b<0 方向基本相反,夹角在90°到180°之间
 a·b>0    方向基本相同,夹角在0°到90°之间

 a·b=0    正交,相互垂直

 a·b<0    方向基本相反,夹角在90°到180°之间
a·b>0 方向基本相同,夹角在0°到90°之间 a·b=0 正交,相互垂直 a·b<0 方向基本相反,夹角在90°到180°之间

叉乘

向量叉乘是另一个重要的运算,两个向量叉乘结果是一个新向量,新向量的方向垂直于原来两个向量所在的平面,方向可以通过右手定则来判定。

假设有向量a,向量b

a=(x0,y0,z0)\vec a =(x0,y0,z0)

b=(x1,y1,z1)\vec b =(x1,y1,z1)

a×b=(y1z2y2z1,x1z2x2z1,x1y2x2y1)\vec a× \vec b =(y1z2−y2z1,x1z2−x2z1,x1y2−x2y1)

而这个叉乘结果的新向量的大小等于两个向量模的乘积再乘以向量夹角的正弦值,即向量组成的平行四边形的面积。

(a)  ×  (b)=absin(θ)(\vec a) \; × \; (\vec b) = |\vec a| * |\vec b| *sin(θ)

image.png
如上图,利用右手定则,当右手的四指从向量 a 以不超过 180 度的转角转向 b 时,竖起的大拇指指向是叉乘结果向量的方向。

叉乘一般用于3D坐标系中。

几何意义

在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。在3D图像学中,可以通过两个向量的叉乘,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。

在二维空间中,叉乘还有另外一个几何意义就是:aXb等于由向量a和向量b构成的平行四边形的面积。

image.png

推导过程

首先,得知道几个前置的数学规则或者定义:

  • 给定直角坐标系的单位向量 i,j,k满足下列等式:

    i×j=k;j×k=i;k×i=j;\vec i × \vec j =\vec k ;\\ \vec j × \vec k =\vec i ;\\ \vec k × \vec i =\vec j ;

  • 三阶行列式的计算方法如下,“对角线法则”,不过是复杂版的:主对角线乘完以后元素位置要平移一下继续相乘,直到x、y、z分别开过头以后,再分别减去x、y、z开头的副对角线乘积。

    [xyzrstabc]=xsc+yta+zrbzsayrcxtb\begin{bmatrix}x & y &z \\ r & s &t\\a & b &c\end{bmatrix} =xsc+yta+zrb-zsa-yrc-xtb

通过这些规则,两个向量的外积的坐标可以方便地计算出来,不需要考虑任何角度:设向量a,向量b:

a=(x1,y1,z1)\vec a =(x1,y1,z1)

b=(x2,y2,z2)\vec b =(x2,y2,z2)

a和b两个向量的叉乘,可以表示成一下行列式:

给定直角坐标系的单位向量,i,j,k,满足下列等式:

i=(1,0,0);j=(0,1,0);k=(0,0,1)i=(1,0,0);j=(0,1,0);k=(0,0,1)

根据以上关系,代入公式得到:

a×b=(y1z2z1y2,z1x2x1z2,x1y2y1x2)\vec a× \vec b =(y1z2−z1y2,z1x2-x1z2,x1y2−y1x2)

结尾

以上就是本次向量相关基础内容的介绍,若有不准确之处还望指正。

对于点乘和叉乘更深入的数学概念没有讲到,如果有兴趣的伙伴可以自己找另外的资料来了解。

下次更新

  • FPVM,坐标系变换理论的相关知识

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYMEJdMB' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片