Unity游戏开发中的向量运算-点乘和叉乘
1.点乘:
定义:
又称点积、数量积、标量积。既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解。
公式一:
公式二:
点积满足交换律,即 a•b = b•a
通过点积公式可以看出,a,b都是标量,都是正数,余弦值结果只受角度变化的影响。所以,游戏开发中经常对向量a、b进行归一化,即当两个单位向量的长度都是1时,点乘的结果就是他们夹角的余弦值,最后可以反余弦求得向量的夹角 θ = arccos(a•b),注意这里得到的是弧度值,需要再乘以Mathf.Rad2Deg才能得到最终的角度。这个结果也可以通过Vector3.Angle(a,b)直接得出。
由余弦函数曲线可以看出:当夹角小于90,余弦值大于0;当夹角大于90,余弦值小于0。
游戏中的应用:
1.判断敌人在我们前方或者后方?
我们以自己为原点,问题就可以转化为,计算我们的正前方(Vector3.forward)和原点指向敌人位置的向量的点积。当结果大于0时,说明敌人与我们正前方夹角小于90度,敌人在我们前面,当结果小于0时,说明敌人与我们正前方夹角大于90度,敌人在我们后面。
2.已知敌我位置,自己的视角θ范围,判断敌人是否在视角内?
同样以自己为原点,首先可以求得正前方向量和指向敌人位置的向量之间的夹角α,因为左右视角是平分的,我们只需要比较α和θ/2的大小就可以判断出结果了。由根据余弦值在(0,π)是单调递减的,所以可以通过直接比较cos值的大小来比较θ值的大小,不需要通过反余弦来计算真实角度值。即当cos(α) > cos(θ/2)时,敌人在我们视角内;当cos(α) < cos(θ/2)时,敌人在我们视角外。
2.叉乘:
定义:
向量积,数学中又称外积、叉积,物理中称矢积、叉乘,是一种在向量空间中向量的二元运算。与点积不同,它的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量和垂直。同样既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解。
公式一:
公式二:
该结果为向量积的模长,其中0° < θ < 180°,方向在unity中由左手法则得出。
叉乘不满足交换律,满足反交换律,即 axb = -(bxa)
根据左手定则可以看出,叉乘结果大于0时,第二个向量在第一个向量右边,叉乘结果小于0时,第二个向量在第一个向量左边。
根据叉乘的定义,这两个只在XY平面的向量的叉乘,必然为一个只在Z轴(垂直于XY平面)上有值的向量,所以可以把2D向量的叉乘简化为一个只表示Z值的标量。
所以2D向量的叉乘可以定义为:
这个公式的几何意义就是如果以向量a和b为边构成一个平行四边形,那么a和b的叉乘的结果就是这个平行四边形的面积。
游戏中的应用:
判断最优转向敌人问题
以自己为原点,计算自己正前方和指向敌人的向量的叉乘,如果结果大于0,说明敌人在我们右手边,小于0则在我们左手边。
3.总结:
简单来说,在两个物体的位置关系判断中。
点乘可以判断出目标物体在我的前方还是后方。大于零在前方,小于零在后方。
叉乘可以判断出目标物体在我的左边还是右边。大于零在右方,小于零在左方。
参考文章: