前言,本篇文章本意是为了科普知识点,但网上大佬们科普知识点的文章多的数不过来,很多书籍也有涉及,所以本篇文章主要叙述个人理解与思考过程。希望对路过的您有所帮助。
点和向量是3D数学的基础,直观上看,它们都是三个数字组成的有序列表,在unity中它们都可以用Vector3来表示,虽然它们都用相同的数据结构表示,含义却完全不同,它们之间的关系也是密不可分的。
在3D空间中,一个物体的位置可以用一个点表示,点的数值取决于这个位置在坐标轴上的投影,这就是坐标,它对应方向上点相对于原点的偏移量。向量更多的用来描述过程,可以看做是一种变化量,它是既有大小,又有方向的有向线段,因此可以表示位移,速度,方向等信息。思考位置时,想象一个点,思考位移时,想象一个向量和一个箭头。
了解了点和向量的基本描述,接下来就要了解它们之间的运算。
点与向量相加
点可以和向量相加,此时点可以看作起始位置,向量为点指示了运动的方向,并规定点运动的距离为向量的模长,所以得到的结果是这个点运动之后到达的位置,依然是一个点。当然,点与向量做差时,结果也一样,可以将其看作是与一个反向的向量做和。
向量运算
1.取反
在向量前加上负号,即乘以标量-1,意味着将向量箭头指向相反的方向。
2.求模
即为求向量的大小,几何意义为向量线段的长度。求法为根号下向量中每个数的平方之和,为什么这样求?其实是运用了勾股定理,将向量的顶点向x-z平面做垂直辅助线,相交点连接原点,会形成一个直角三角形,之后就可以运用勾股定理推出求模公式。
3.标量乘以向量
几何意义上相当于对向量的长度进行缩放,比较好理解,不再叙述。
4.标准化
向量标准化是将向量转变成和自己方向一致,长度为1的单位向量(向量的终点在以向量起点为球心的单位球的球面上),通常在只考虑变化方向,不考虑变化的大小时使用,求法也比较简单,即向量除以自身模长。因为向量确定了方向和长度,就是说向量等于与自身方向相同的单位向量通过缩放自身模长的长度得到的向量,所以标准化计算公式为向量除以自身模长。
5.向量的加减
向量的加减可以看作变化的叠加,网上的讲解非常详细,也容易理解,不再叙述。
它的几何意义有一个扩展应用:为了计算两点之间的向量,我们可以将两点做差,实际上时将点扩展为两个从原点出发的向量。为了求得它们连线的向量,我们将其中一个向量取反,然后做和。结果会得到一个从减数指向被减数的向量。此应用非常广泛,通常用来计算两个物体间的距离与方向。
6.点乘
点乘又叫内积,数量积。计算方式为:(x1,y1,z1)·(x2,y2,z2)=x1x2+y1y2+z1z2;
从几何角度上讲,点乘的结果描述了两个向量间的相似程度,两个向量越相似,点乘的结果越大。点乘的结果等于两向量模长乘以它们夹角的余弦值。也可以看作是一个向量与另一个向量在自己投影上的向量之间的乘积。
由cos函数曲线可以知道,两向量之间夹角在0-90度()之间,cos值为0-1,在90-180度之间,cos值为0到-1之间,cos函数在0-180度区间单调递减,cos0度为1,表示方向相同,cos90度为0,表示两向量垂直,cos180度为-1,表示两向量方向相反。
所以,点乘通常用来计算两向量之间的夹角。在游戏中通常用于人物视野检测。
7.叉乘
叉乘又叫外积,它的计算方式比较有意思,(x1,y1,z1)×(x2,y2,z2)=(y1z2-z1y2,z1x2-x1z2,x1y2-y1x2)
从几何角度看,叉乘得到的是垂直与两个向量的向量,若是两平行向量进行叉乘结果为零向量,所以一般不会对两平行向量进行叉乘,只会对互不平行的两个向量进行叉乘。如果将这两个向量构成一个平面,叉乘的结果就是这个平面的垂向量。垂向量的方向有两个,这取决于我们的坐标系。
坐标系解释
在数学中,一般采用的均是笛卡尔坐标系,也称作右手坐标系,为什么?请伸出右手,将手指方向与x轴对齐,四指卷向y轴,则拇指方向为z轴,所以笛卡尔坐标系判断垂线的方法遵循右手定则。unity中世界坐标系是左手坐标系(大家可以按照上述方法试试是否是左手),也就是说,unity中向量叉乘得到的向量方向遵循左手定则,即手指方向与第一个向量对齐,四指卷向第二个向量方向,则拇指方向为外积方向。
叉乘通常用于判断人物转向。
关于点和向量的运用还有很多,如投影,反射向量等,但都是由基本运算推导出来的,灵活运用是重点。
结语
以上就是作者参考一些书籍,资料,叙述一下个人理解,由于作者表达能力有限,有一些可能会说的比较抽象,表达不清楚,不完全,请见谅。本篇文章一些数学公式没有介绍,主要考虑到公式总是死的,百度上都可以轻松搜到,但是自己理解了,就能在游戏开发中灵活运用。不是有一句话叫做面向百度编程吗?(哈哈)所以一些百度上轻松搜到的作者就没有叙述,只是提供了思路。有与作者不一样的理解欢迎在下方评论,共同进步。
最后给大家留一道思考题:
为什么平行四边形邻边叉乘的模 是它的面积?