项目案例:判断一个目标点是否在角色的视野范围。
思路分析
- 视野的大小我们是用角度来确定,假如视野的大小是90度,即角色看向正前方,从角色位置出发,任意一个向量和正前方的向量的夹角 <= 45 度,那么该向量上的点都在视野内。
- 这里我我们得到一个角色的视野方向,也就是forward方向,记为向量 a
- 从角色位置到目标点,我们得到一个向量 b
- 求这两个向量的夹角 θ 只要判断 θ <=45度
- 求夹角使用三角函数的反函数,即已知三角函数的函数值,求角度,这里我们使用反余弦函数(acos)
- 首先,求两个向量的点积,得到一个标量
- 其次,反余弦函数得到两个向量之间的弧度
- 将弧度转换为度,进行判断
代码
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中的角度计算都是以弧度为单位,在使用时,都需要进行一个转换