详解向量与Unity中向量类Vcetor3的使用(一)

1、前言

在使用Unity过程中,经常使用到向量类Vector3及Vector2,由于对向量的概念已经忘得差不多了,编程过程中不时弄错坐标的求解,对于一些几何问题也无从下手。故查阅了相关资料及书籍,主要查阅书籍为《3D数学基础:图形与游戏开发》,也借鉴了书中的案例,并且阅读了Unity中的Vector3的源代码,对向量的理解更进了一步,也不会混淆了点与向量的关系,特此记录下学习过程!

2、向量

2.1向量-数学定义

对于数学家而言,向量就是一组数字列表,对程序员而言,向量就是另外一种相似的概念-数组,数学上,一个向量就是一个数组。

2.1.1向量与标量

数学上区分向量和标量。标量是对我们平时所用数字的技术称谓。使用该术语时,是想强调数量值,"速度"和"位移"是向量,而"速率"和"长度"是标量。

2.1.2向量的维度

向量的维度就是向重包含的"数"的数目。向量可以有任意正数维,当然也包括一维。事实上,标量可以被认为是一维向量。在Unity中主要讨论2维、3 维向量。

2.1.3记法

书写向量时,用方括号将一列数括起来,如[1,2,3]。在书写向量时,每个数字中间都有逗号,在等式中书写时,则通常省略逗号。不管是哪种情况,水平书写的向量叫行向量 ,人们也经常垂直地列出各分量,叫做列向量。如下:

我们通常使用下标记法来引用向量的某个分量。在数学中,整数下标表示引用该元素。如,v1表示引用向量V的第一个元素。我们只讨论2D、3D向量,不涉及n维向量,下标记法不太适用,取而代之的是,用x,y代表2D向量分别在x、y轴上的分量;x,y,z代表3D 的分量分别在x、y、z轴上的分量:x,y,z,w代表4D向量的分量。下面展示了所有记法:

2.2向量-几何定义

上面说了向量的数学定义,接下来让我们看看它的几何定义。从几何意义上说,向量是有大小方向有向线段

  1. 向量的大小就是向量的长度(模),向量有非负的长度。
  2. 向量的方向描述了空间中向量的指向,注意,方向并不完全和方位等同。
2.2.1向量的形式

向量看起来就像一支箭,这是用图形描述向量的标准形式,因为向量定义的两个要素:大小和方向都被包含在其中。有时候需要引用向量的头和尾,头是的向量的末端(向量"结束"于此),箭尾是向量的"开始"。

2.2.2位置与位移

向量在哪儿?实际上,这不是一个恰当的问题。因为向量没有位置,只有大小和方向。这听起来不可思议,但其实日常生活中很多量有大小和方向,却没有位置。例如:

  1. 位移:"向前走三步",这句话好像是关于位置的,但其实句子中使用的量表示的是相对位移:位移,而不是绝对位置。这个相对位移由大小(三步)和方向(向前)构成,所以它能用向量表示。
  2. 速度:"我们以 50 英里每小时的速度向北行驶"。这句话描述了一个量,它有大小(50 英里每小时)和方向(北),但没有具体位置。"50 英每小时的度向"能用向量表示。

注意,位移、速度与距离、速率是完全不同的两种定义。位移和速度是向量 ,包含方向,而距离和速率是标量,不指明任何方向。 因为向量能描述事物间的位移和相对差异,所以它能用来描述相对位置:"我的房子位于从这儿向东的第四个街区"。不能认为向量有绝对位置。为了强调这一点,当你想像一个向量,一个箭头时,记住:有箭头的长度和方向是有意义的,不包括位置。

因为向量是没有位置的,所以能在图的任何地方表示,只要方向和长度的表示正确即可。我们经常会利用向量的这个优点,将向量平移到图中更有用的点。

2.2.3向量的表达

向量中的数表达了向量在每个维度上的有向位移。例如,下图中的2D向量列出的是x坐标方向和y坐标方向的位移。

3D向量是2D向量的简单扩展,3D向量包含了3个数,分别度量向量在x,y,z轴方向上的位移。

2.2.4将向量表示为位移序列

思考向量做代表的位移的一个好办法就是将向量分解成与轴平行的分量,把这些分量的位移组合起来就得到了向量作为整体所代表的位移。 例如,3D 向量[1,-3,6]表示单一位移,但可以将此位移想象为向右(x轴正方向)1个单位,向下(y轴负方向)3个单位,向前(z轴正方向)6个单位。(假设+x,+y,+z 轴分别向右,向上,向前。注意,每步之间没有转向,所以"向前"时应和+z 轴平行。)如下图所示。

这些步骤的执行顺序无关紧要。比如,可以先向前移动6个单位,再向下3 个单位,向右1个单位。仍然得到同样的位移量。不同的顺序对应着向量轴对齐包围盒上的不同路径。

2.3向量与点

"点"有位置,但没有实际的大小或厚度。上面讲到了向量有大小和方向,但没有位置。所以使用"点"和"向量"的目的完全不同。"点"描述位置,而"向量"描述位移。

下面第一幅展示点的位置,第二幅展示向量,它看上去显示出点和向量间有某种很强的联系,这是容易将"点"与"向量"混淆的地方,需加强理解。

2.3.1相对位置

上面讨论了向量能描述相对位置的事实,因为它能描述位移,相对位置的想法是很直接的:某个物体的位置,能通过描述它与已知点之间的相对关系来指明。

由此引出一个问题,这些"已知"点在哪儿? 什么是"绝对"位置?令人吃惊的是并不存在这样的东西。在描述一个点的位置时,总是要描述它和其他一些点的关系,任何对于位置的描述只有在一定参考系内才有意义。

2.3.2点和向量的关系

向量能够用来描述位移,当然也包括相对位置,点用来描述位置。它们都与其所在的坐标系的原点相关,下面的图表示了点与向量的关系。

正如你所见,从原点开始 ,按向量[x,y]所代表的位移移动,总是会到达点(x,y)所代表的位置。也可以说,向量[x,y]描述了原点到点(x,y)的位移量

这看起来很明显,重要的是要理解点和向量在概念上完全不同而在数学上却是等价的。点和向量的这种令人迷惑的关系对初学者来说可能是个障碍,思考位置时,想像一个点,思考位移时,想像一个向量和一个箭头。

许多情况下,位移是从原点开始的,点和向量间的区别很清楚,但我们还要经常对付一些和原点不相关的量,这种情况下,认识到这是一些箭头而不是点很重要。

3、向量运算

数学中专门研究向量的分支叫做线性代数 ,前面已经提到,向量在线性代数中只是一个数组,这个抽象的概念使我们能解决很多数学问题,在线性代数中,可以用n维向量和矩阵解有n个未知数的线性方程组。线性代数是一个非常有趣并且应用广泛的学科,但它与3D数学关注的领域并不相同,3D数学主要关心向量和向量运算的几何意义。

3.1符号约定

我们都知道,变量是代表未知量的占位符。我们需要用具体的变量来标识3D数学中大量使用的标量、向量和矩阵。为了区分,我们用不同的字体来区分不同的变量。

  1. 标量,用斜体的小写罗马或希腊字母表示,如a ,b ,x ,y ,z ,0 。
  2. 向量,用小写黑粗体字母表示,如a,b,u,v,q,r
  3. 矩阵,用大写黑粗体字母表示,如A,B,M,R。

注意,不同书籍有不同的符号约定。一种常用的手写约定是,用下面符号来表示向量(字母上方带有一个方向箭头)。

3.2零向量

说到向量,就必须认识一个特殊的向量,那就是零向量 ,例如,3D的零向量表示为[0,0,0]。零向量非常特殊,因为它是唯一一个大小为零的向量,同时它也是唯一一个没有方向的向量

3.3负向量

3.3.1运算法则

要得到任意维向量的负向量,只需要简单的将向量的每个分量都变成负的即可。数学表达式为:


该法则运用到2D、3D、4D中就有: -[x,y]=[-x.-y] -[x,y,z]=[-x,-y,-z] -[x,y,z,w]=[-x,-y,-z,-w]

3.3.2几何解释

向量变负,将得到一个和原向量大小相等,方向相反的向量。

3.4向量的大小(长度或模)

我们已经知道向量具有方向和大小,但是通过向量的表达式[3,4]我们无法确切的通过这个表达式来获取向量的长度,长度既不是3也不是4,而是5。向量的模长需要计算。

3.4.1运算法则

在线性代数中,向量的大小用向量两边加双竖线表示,这个和标量的"绝对值"在标量两边加单竖线表示类似。这种记法和n维向量大小的计算公式如下:

可知,向量的大小就是向量在各分量平方和的平方根,上述线性代数公式看上去比较复杂,但我们所在unity中运用的2D、3D向量的计算公式就比较简单,如下:

向量的大小是一个非负标量,举个计算的例子:

3.4.2几何解释

我们现在对向量的模长计算公式做几何上的探讨,对任意2D向量v ,能构造一个以v 为斜边的直角三角形,如下图所示。直角三角形直角边的分量分别为vx、vy的绝对值。向量的分量可以为负,因为这里的负号代表的是向量的方向,并不是大小意义上的负号,长度总是为正的。

由勾股定理知,对于任意直角三角形,斜边的长度等于两个直角边的长度的平方和。

3.5标量与向量的乘法

虽然标量与向量不能相加,但是标量与向量可以相乘,结果得到一个向量,与原向量平行,长度不同或方向相反。

3.5.1运算法则

标量与向量的乘法非常直接,将向量的每个分量都与标量相乘即可。标量与向量乘的顺序并不重要但经常把标量写在左边,数学表述为:


该法则运用到3D向量中就有: k[x,y,z]=[kx,ky,kz]

很容易理解,如果k为正,得到的向量与原向量平行,方向相同,若k为负,得到的向量与原向量平行,方向相反。若0<k<=1,则对原来的向量进行了缩小,若k>1,则对原来的向量进行了放大。

向量也能除以一个非零标量 ,效果等同于乘以标量的倒数。

[x,y,z]/k=[x/k,ky/k,kz/k]

应注意以下几点:

  1. 标量与向量相乘时,不需要写乘号。将两个量挨着写即表示相乘(常将标最写在左边)。
  2. 标量与向量的乘法和除法优先级高于加法和减法。例如,3a+b 是(3a )+b ,而不是 3(a+b)。
  3. 标量不能除以向量,并且向量不能除以另一个向量。负向量能被认为是乘法的特殊情况,乘以标量-1。
3.5.2几何解释

几何意义上,向量乘以标量k的效果是以因子k缩放向量的长度。例如,为了使向量的长度加倍,应使向量乘以2。如果 k<0,则向量的方向被倒转。下图展示了向被多个不同因子乘的效果。

3.6标准化向量

对于许多向量,我们只关心它的方向不关心它的大小,在这样的情况下,使用单位向量 将非常方便。单位向量就是大小为1的向量,单位向量经常也被称作为标准化向量或更简单的称为"法线"。

3.6.1运算法则

对于任意向量v ,都能计算出一个和v 方向相同的单位向量Vnorm ,这个过程被称为向量的"标准化",要标准化向量,将向量除以它的模长即可。

例如,计算2D向量[12,5]的标准化向量:

零向量不能被标准化,数学上是不允许的,因为这将导致除以零,几何上也没有意义,因为零向量没有方向。

3.6.2几何解释

2D环境中,如果以原点为尾画一个单位向量,那么向量的头将接触到圆心在原点的单位圆(单位圆的半径为1),3D 环境中,单位量将触到单球。下图,蓝色头表示这些向量的标准化向量。

3.7向量的加法与减法

如果两个向量的维数相同,那么他们能相加或相减,得到的向量的维数与原向量相同。

3.7.1运算法则

向量加法的运算法则很简单:两个向量相加,将对应的分量相加即可。

减法解释为加上一个负向量,a-b=a+(-b)

例如向量a =[1,2,3],向量b =[4,5,6],则a+b=[1,2,3]+[4,5,6]=[1+4,2+5,3+6]=[5,7,9]。

应注意以下几点:

  1. 向量不能与标量或维数不同的向量相加减。
  2. 和标量加法一样,向量加法满足交换律,但向量减法不满足交换律。永远有 a+b=b+a ,但a-b=-(b-a) ,仅当a=b 时,a-b-b-a
3.7.2几何解释

向量ab 相加的几何解释为:平移向量,使量a的头连接向量b的尾,接着从a的尾向b的头画一个向量 。这就是向量加法的"三角形法则"。向量的减法与之类似,如下图所示。

下图证明了向量加法满足交换律,也证明减法不满足交换律。注意,向量a+b 和向量b+a 相等,但向量d-cc-d 的方相反,因为 d-c=-(c-d)

有了三角形法则,就能解释 1.2.4 中所提出的几何意义:向量能被解释为与平行的位序列,它解释了向量[1,-3,6]为什么能解释为位序列:向右1个单位,下3个单位向前6个单位。 用向量加法对作数学解释,即为:

3.7.3一个点到另一个点的向量

计算一个点到另一个点的位移是一种非常普遍的需求,可以使用三角形法则和向量减法来解决这个问题。下图展示了怎样用b-a 计算ab的位移向量。

如上图所示,为了计算a到b的向量,将点a和点b解释为从原点开始的向量 ,接着使用三角形法则。注意,减法b-a 代表了从ab的向量。简单的求"两点之间"的向量是没有意义的,因为没有指明方向。求一个点到另一个点的向量才有实际意义。

3.8距离公式

经过前面对向量的学习,我们现在来介绍几何中最重要的公式之一:距离公式,该公式用来计算两点之间的距离。

首先,定义距离为两点之间线段的长度。因为向量是有向线段,从几何意义上说,两点之间的距离等于从一个点到另外一个点的向量的长度 。我们推导一下3D中的距离计算公,计算从ab 的向量dd=b-a= [bx-ax,by-ay,bz-az]。 ab 的距离等于向量d的长度,上面我们已经学了向量的模长计算公式。

需要注意的是,如果只是计算记录,哪个是a点哪个是b点并不重要,a-bb-a得到的是一个相反的向量,但是模长(距离)是相等的。

3.9向量点乘

在上面我们已经知道一个标量和一个向量是可以相乘的,得到的是一个与原向量平行的向量,两个向量也可以相乘,向量两两相乘有两种乘法,我们先看向量点乘(也经常被称作内积)。

3.9.1运算法则

术语"点乘"来自记法a·b 中的点号。与标量与向量的乘法一样,向量点乘的优先级高于加法和减法。标量乘法和标量与向量的乘法经常可以省略乘号,但在向量点乘中不能省略点乘号。 向量点乘就是对应分量乘积的和,其结果是一个标量:

用连加符号简写为:

应用到2D、3D中,如下:

很显然,从公式中可以看出点乘满足交换律:a·b=b·a

3.9.2几何解释

一般来说,点乘结果描述了两个向量的"相似"程度,点乘结果越大,两个向量越相近,下图为几何解释:

点乘等于向量大小与向量夹角的cos值的积:

在3D中,两向量的夹角是包含在两向量的平面中定义的,利用向量的点乘公式我们可以求两向量之间的夹角 。如果ab 向量都是单位向量,那么上述式子中两向量的积为1,可以省略分母。

如果不需要求角度的确切值,只是判断两个向量的夹角类型,可以只取点积的结果的符号,如下表:

a·b 角度 a和b
>0 0°<=x<90° 方向基本相同
=0 x=90° 正交
<0 90°<x<=180° 方向基本相反

可以根据点乘结果的符号大致确定角度的类型

向量大小并不影响点乘结果的符号,所以上表是和 ab 大小无关的。注意,如果ab 中任意一个为零,那么a.b 的结果也等于零。因此,点乘对零向量的解释是,零向量和任意其他向量都垂直。

3.9.3向量投影

给定两个向量vn ,能将v 分解成两个分量:v1v2 。它分别平行于和垂直于n ,并满足v=v1+v2 。一般称平行分量v1vn上的投影。

由上图,我们要求v1 ,观察到v1n 平行,它可以表示为:v1 =n ||v1 ||/||n ||,向量n 是已知,因此求的v1 的模长||v1 ||即可求的向量v1,根据直角三角形关系可知:

如果向量n为单位向量,则分母可以省略,表示为:

由向量的加减法,v=v1+v2 ,知道了v1 可求v2,如下:

3.10向量的叉乘

另一种向量乘法称作叉乘或叉积,仅可应用于3D向量。与点乘不一样,点乘得到一个标量并满足交换律,向量叉乘得到一个向量并不满足交换律

3.10.1运算法则

和点乘一样,术语"叉乘"来自记法 axb 中的叉号。这里要把义乘号写出来,不能像标量乘法那样省略它。叉乘公式为:

叉乘的运算优先级和点乘一样,乘法在加减法之前计算。当点乘和叉乘在一起时,叉乘优先计算:a·bxc=a·(bxc) 。因为点乘返回一个标量,同时标量和向量间不能又来,所以(a·b )xc 没有定义。运算a ·(bxc)称作三重积。

3.10.2几何解释

叉乘得到的向量垂直于原来的两个向量,也就是说得到的向量垂直原来两个向量所在的平面。

图中,向量ab 在一个平面中。向量aXb 指向该平面的正上方,垂直于abaxb 得到的向量的长度等于向量的大小与向量夹角 sin 值的积,如下:

由上式可知,两个向量的叉乘的向量的长度与原两个向量的夹角sin值有关。同时,||axb ||的值也等于以a和b为两边的平行四边形的面积。平行四边形的面积为底x高,这里的底为||b ||,高由直角三角形关系得||a ||sin(x),故面积表示为:||a || ||b|| sin(x)。

如果 ab 平行或任意一个为0,则axb=0。叉乘对零向量的解释为:它平行于任意其他向量。注意这和点乘的解释不同,点乘的解释是和任意其他向量垂直。(当然,定义零向量平行或垂真于任意向量都是不对的,因为零向量没有方向。)

已经证明了axb 垂直于ab 。但是垂直于ab 有两个方向。axb 指向哪个方向呢? 通过将a 的头与b 的尾相接,并检查从ab 是顺时针还是逆时针,能够确定axb 的方向。

在左手标系中(Unity使用的正是左手坐标系),如果ab 是顺时针,那么axb 指向你。如果。ab 是逆时针,axb 远离你。在右于坐标系中,恰好相反。如果ab 呈顺时针,axb 远离你,如果ab 逆时针,axb指向你。

4、结语

通过上述的学习,我们已经知道了向量的数学意义及几何意义,也知道了向量与标量的乘法、向量的加减法,什么是单位向量,什么是负向量,更重要的是知道了距离公式,这经常会用到。

同时我们也知道了向量与向量相乘有两种形式:点积与叉积,每一种对应的几何意义也不一致,对于我们在二维坐标系及三维坐标系中求解一些数学关系是非常重要的。

由于篇幅较长,下一篇我们来聊聊Unity中Vector3向量类的数学原理及代码实现及使用。

相关推荐
IT古董1 天前
【机器学习】数学知识:标准差,方差,协方差,平均数,中位数,众数
人工智能·数学·机器学习
lin zaixi()5 天前
手把手教你写Unity3D飞机大战(2)天空盒布置
unity3d
亦枫Leonlew7 天前
微积分复习笔记 Calculus Volume 1 - 4.7 Applied Optimization Problems
笔记·数学·微积分·1024程序员节
飞滕人生TYF8 天前
3^100的位数判断
数学
XuYueming8 天前
[NOIP2022] 比赛 随机排列 部分分
数学·线段树·题解·单调栈·洛谷·扫描线·二维数点·部分分·概率 & 期望
Thomas_YXQ10 天前
Unity3D中管理Shader效果详解
开发语言·游戏·unity·unity3d·游戏开发
闻缺陷则喜何志丹10 天前
【C++ 曼哈顿距离 数学】1131. 绝对值表达式的最大值|2059
c++·数学·算法·力扣·最大值·哈曼顿距离·绝对值
羊羊203511 天前
线性代数:Matrix2x2和Matrix3x3
线性代数·数学建模·unity3d
kuailedetongnian11 天前
组合数学
c++·数学·oi
莫石12 天前
搓绳子(直)
前端·数学·three.js