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|cos 结果是一个标量。

  • 弧度/度的比例: 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中的角度计算都是以弧度为单位,在使用时,都需要进行一个转换

你可能感兴趣的:(Unity,unity,三角函数)