Unity游戏开发中的向量运算-点乘和叉乘

Unity游戏开发中的向量运算-点乘和叉乘

1.点乘:

定义:

又称点积、数量积、标量积。既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解。

公式一:

 公式二:

点积满足交换律,即 ab = ba

通过点积公式可以看出,a,b都是标量,都是正数,余弦值结果只受角度变化的影响。所以,游戏开发中经常对向量a、b进行归一化,即当两个单位向量的长度都是1时,点乘的结果就是他们夹角的余弦值,最后可以反余弦求得向量的夹角 θ = arccos(ab),注意这里得到的是弧度值,需要再乘以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.总结:

简单来说,在两个物体的位置关系判断中。

点乘可以判断出目标物体在我的前方还是后方。大于零在前方,小于零在后方。

叉乘可以判断出目标物体在我的左边还是右边。大于零在右方,小于零在左方。

 参考文章:

向量运算在游戏开发中的应用和思考

Unity游戏开发——向量运算(点乘和叉乘)

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值