向量

定义

  • 向量在Unity中用于表示方向和位移。一个向量由三个部分组成,即x、y和z轴的分量。
  • 向量的大小(长度)是其在各个维度上的绝对值的总和,表示向量的长度或幅度。
  • 向量的方向由其相对原点的角度和旋转角决定。
  • 向量的几何意义是表示一个有向线段,其中箭头表示方向和长度。
  • 在unity中用Vector3 代替
名称 概念 公式 unity实例
零向量 没有方向 (0,0,0) Vector3.zero
负向量 让原向量乘以-1得到了相当于原向量来说的负向量
单位向量 长度为1的向量叫单位向量(1,1,1) 各个分量分别除以magnitude模长就等于单位向量
向量的模 向量的长度 向量的长度=sqr(x^2+y^2+z^2) //各向量的平方相加,再开方 Vector.magnitude
向量相加 各分量分别相加 a向量+b向量=c向量 a(x,y,z)+b(x,y,z)=c(ax+bx,ay+by,az+bz)

向量计算

点乘

概念

点乘,也叫向量的内积、数量积。

描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影。

向量a·向量b=|a||b|cos<a,b>

几何意义:是一条边向另一条边的投影乘以另一条边的长度

Unity项目应用:

1.根据点乘计算两个向量的夹角。<a,b>= arccos(a·b / (|a|·|b|))

2.根据点乘的正负值,得到夹角大小范围,>0,则夹角(0,90)<0,则夹角(90,180),可以利用这点判断一个多边形是面向摄像机还是背向摄像机。

3.根据点乘的大小,得到向量的投影长度,反应了向量的长度关系。

4.在生产生活中,点积同样应用广泛。利用点积可判断一个多边形是否面向摄像机还是背向摄像机。向量的点积与它们夹角的余弦成正比,因此在聚光灯的效果计算中,可以根据点积来得到光照效果,如果点积越大,说明夹角越小,则物理离光照的轴线越近,光照越强。物理中,点积可以用来计算合力和功。若b为单位矢量,则点积即为a在方向b的投影,即给出了力在这个方向上的分解。功即是力和位移的点积。计算机图形学常用来进行方向性判断,如两矢量点积大于0,则它们的方向朝向相近;如果小于0,则方向相反。矢量内积是人工智能领域中的神经网络技术的数学基础之一,此方法还被用于动画渲染(Animation-Rendering)。
https://blog.csdn.net/yupu56/article/details/53609028

叉乘

概念

叉乘,也叫向量的外积向量积,得到的向量垂直于原来的两个向量。

|向量c|=|向量a×向量b|=|a||b|sin<a,b>

​ A×B = -B×A

几何意义是:得到一个与这两个向量都垂直的向量,这个向量的模是以两个向量为边的平行四边形的面积

右手法则

右手法则:右手的四指方向指向第一个矢量,屈向叉乘矢量的夹角方向(两个矢量夹角方向取小于180°的方向),那么此时大拇指方向就是叉乘所得的叉乘矢量的方向.(大拇指应与食指成九十度)(注意:Unity当中使用左手,因为Unity使用的是左手坐标系)

img

img

Unity项目应用:

1.根据叉乘得到a,b向量的相对位置,和顺时针或逆时针方位。

简单的说: 点乘判断角度,叉乘判断方向。

形象的说: 当一个敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所成的角度大小。

2.得到a,b夹角的正弦值,计算向量的夹角(0,90),可以配合点乘和Angle方法计算出含正负的方向。

3.根据叉乘大小,得到a,b向量所形成的平行四边形的面积大小,根据面积大小得到向量的相对大小。

判断一个点在矩形内外

img

判断点是否在一个矩形内_matlab如何判断一个点是否在矩形里-CSDN博客

判断一个点在三角形内外

1.面积法

img

求三角形面积的方法就可以用上面提到的利用叉积就行了,注意记得加 上绝对值,因为叉积可能为负。还有种简单的方法是利用内角和为 180 °

2.同侧法

若点P在点A、B、C内,则ABXAP,BCxBP,CAxCP结果都为正(负),则可以认为P在A、B、C内,若任意一个结果不同则P在ABC外。(因为正负看的sin夹角的大小,在两个夹角小于90°的情况下,“右手定则”来判定,即右手向第二个因数弯曲,看大拇指是否改变,同向为正,异向为负。)

7. 判断一个对象B在对象A的前后左右(点乘叉乘应用)

​ 点乘前后,叉乘左右。

生成两个向量:

  1. 对象A自身为原点,指向面向前方的方向C。 AC
  2. 对象A自身为原点,指向对象B的方向。 AB

  • 两个向量点乘,正为B在A的前方,负为B在A的后方,0为左右两侧。

(点乘正负看向量夹角,小于90°为正,大于90°则为负,等于90°正为水平两侧)


  • 向量A 叉乘 向量B,结果为正,B在A的左侧,结果为负,B在A的右侧。

(注意:Unity当中使用左手,因为Unity使用的是左手坐标系,叉乘方向相反)

1
2
3
4
5
6
7
假设向量A和B 都在xz平面上

向量A叉乘向量B

y大于0 证明B在A右侧

y小于0 证明B在A左侧

坐标系转换

  • Unity中存在多种坐标系,包括世界坐标系、局部坐标系和屏幕坐标系等。
  • 世界坐标系是固定的,用于描述物体在场景中的绝对位置。
  • 局部坐标系是与物体自身固连的坐标系,用于描述物体内部的相对位置。
  • 屏幕坐标系是以像素为单位,用于将3D空间中的点映射到2D屏幕上。
  • 在不同的坐标系之间进行转换时,需要进行适当的变换矩阵运算。

欧拉角

概念

  • 欧拉角是由三个角组成,这三个角分别是Yaw,Pitch,Roll。

  • 很难翻译这三个单词,Yaw 表示绕y轴旋转的角度,Pitch表示绕x轴旋转的角度,Roll表示绕z轴旋转的角度。

  • 也就是说,任意的旋转角度都可以通过这三次按照先后顺序旋转得到。

  • 矩阵很难让人具体形象表示,欧拉角就容易多了。注意可能很多地方三个角的先后次序不一样。

使用

  • 欧拉角是一种描述旋转的方法,通过三个角度值来表示物体绕三个轴的旋转角度。
  • 欧拉角的顺序很重要,因为不同的顺序会导致不同的旋转结果。常见的顺序有XYZ、YZX、ZXY等。
  • 欧拉角在Unity中常用于表示物体的旋转状态,但在某些情况下可能会导致万向锁问题。

欧拉角的万向节死锁

​ 我们依次绕物体坐标系的X轴、Y轴、Z轴旋转,当Y轴旋转了90度之后,Z就会指向原来的X轴。这样一来,我们事实上只绕了X轴和Y轴两个轴旋转,第三根轴的自由度就丢失了。

欧拉角万向节死锁 - 知乎 (zhihu.com)

四元数

概念

四元数(以后不特指四元数=单位四元数)是四维空间中一个超球上面的点,满足w²+x²+y²+z²=1;而纯四元数是四维空间在w=0时的一个子空间的点,形式为{0, q},特别注意的是纯四元数与四元数是不同的概念。

四元数是复数虚部扩展的结果,复数的虚部为1个,而四元数虚部有3个,且两两互相正交,其中实部是cosθ/2,而虚部为一个単位轴乘以sinθ/2。

四元数自由度并没有四个维度,由于存在w²+x²+y²+z²=1这个约束,它的自由度其实只有3,且每个四元数可以对应一个特征向量,即n。

使用

  • 四元数是Unity中用于表示旋转的另一种方法,它比欧拉角更加稳定和准确。
  • 四元数由一个实部和三个虚部组成,通过四个值来表示旋转角度和旋转轴的方向。
  • 四元数在计算旋转时不会遇到万向锁问题,且能避免一些由于数值不稳定性导致的问题。
  • 四元数在Unity中通过Quaternion类型来表示,可以通过多种函数和方法进行运算和转换。

四元数对于欧拉角的优点

  1. 避免万向节死锁
  2. 两个四元数之间更容易插值
  3. 能进行增量旋转
  4. 给定方位的表达式有两种,互为负。

【Unity步步升】各类旋转逻辑的区别,如欧拉旋转、插值旋转、矢量朝向等…及游戏视角案例_unity 旋转插值-CSDN博客

Unity3D 数学知识 (向量,坐标系转换,欧拉角,四元数)_unity有极点、四元数算出直角坐标系-CSDN博客

Unity开发入门指南(9):3D数学基础 - 知乎 (zhihu.com)