Unity - 计算两个向量之间的夹角

项目案例:判断一个目标点是否在角色的视野范围。

思路分析

  1. 视野的大小我们是用角度来确定,假如视野的大小是90度,即角色看向正前方,从角色位置出发,任意一个向量和正前方的向量的夹角 <= 45 度,那么该向量上的点都在视野内。
  2. 这里我我们得到一个角色的视野方向,也就是forward方向,记为向量 a
  3. 从角色位置到目标点,我们得到一个向量 b
  4. 求这两个向量的夹角 θ 只要判断 θ <=45度
  5. 求夹角使用三角函数的反函数,即已知三角函数的函数值,求角度,这里我们使用反余弦函数(acos)
  6. 首先,求两个向量的点积,得到一个标量
  7. 其次,反余弦函数得到两个向量之间的弧度
  8. 将弧度转换为度,进行判断

代码

Vector3 norVec = Global.Player.transform.forward;// 角色正前方的向量
Vector3 temVec = transform.position - Global.Player.transform.position;//目标点向角色到向量
//向量归一化后求两个向量的点积(标量)
var v = Vector3.Dot(norVec.normalized, temVec.normalized);
//然后反余玄求到夹角的弧度,这里的结果是要给-1 到 1 的弧度。
float angle = Mathf.Acos(v);
angle *= Mathf.Rad2Deg;//弧度转度
return angle <= filedView * 0.5f;//filedView  是视角,已知的常数

扩展


  • 向量叉积:a×b=|a||b|sin<a,b> 结果是一个向量。根据右手定则,四指从a的方向向b旋转,大拇指的方向就是结果方向。

  • 向量点积:a·b=|a||b|cos<a,b> 结果是一个标量。

  • 弧度/度的比例: Mathf.Deg2Rad=(PI*2)/360,Unity中的一个常数

  • 度/弧度的比例: Mathf.Rad2Deg=360/(PI*2) ,Unity中的一个常数

  • Unity中如果想要计算 Sin30°的值,得先将角度转为弧度

  • Sin30°就得写成 Mathf.Sin(30*(Math.PI2/360))或 Math.Sin(30Mathf.Deg2Rad)。

  • Unity中的角度计算都是以弧度为单位,在使用时,都需要进行一个转换

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端上的蚂蚁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值