而判断两个物体的位置 关系,是可以通过 这个 cos 来判断,知道了这个余玄值,就可以知道 这个角度了。
它在Unity中 调用是通过Vector3.Dot(),Unity中使用的也是代数公式
public static float Dot(Vector3 lhs, Vector3 rhs)
{
return (float) ((double) lhs.x * (double) rhs.x + (double) lhs.y * (double) rhs.y + (double) lhs.z * (double) rhs.z);
}
如何判断 a 与b 的方位呢
使用a物体的transform.forward向量与 a物体到b的方向做点击就可以得到这个余弦值了
a到b的方向: otherObj.transform.position – transform.position
transform.forward 是玩家正面朝向 方向
大于0则面对,否则则背对着。当然这个计算也会有一点误差,但大致够用。
这个角度值 还可以用来判断是否在视野内,一般情况下人的视野是在124度内,游戏里一般是限制在90度左右,视距就直接是两点之间的距离了。
a·b= |a| *|b| * cos => a·b= |1|
cos的 含义图:
叉积的定义: c =a x b 其中a,b,c均为向量。即两个向量的叉积得到的还是向量!
public static Vector3 Cross(Vector3 lhs, Vector3 rhs)
{
return new Vector3
(
(float) ((double) lhs.y * (double) rhs.z - (double) lhs.z * (double) rhs.y),
(float) ((double) lhs.z * (double) rhs.x - (double) lhs.x * (double) rhs.z),
(float) ((double) lhs.x * (double) rhs.y - (double) lhs.y * (double) rhs.x)
);
}
自己个人项目的用法,用来判断前后关系,大于0在前方,小于0在后方下面会解释
Vector3 dir = target.position - transform.position; //位置差,方向
Vector3.Dot(transform.forward, dir);
返回值为正时,目标在自己的前方,反之在自己的后方
Vector3.Cross(transform.forward, target.position).y
返回值为正时,目标在自己的右方,反之在自己的左方
为什么取y呢 ,因为 transform.forward实际上是 (0,0,1)*rotation, 也就是只有z有值,
cross出来,就只有 y是计算 x和z 的情况,x是计算 y的情况,z是0;因此 左右关系,是由x和z决定的。
static function Sign (f : float) : float
Description描述
Returns the sign of f.
返回 f 的符号。
Return value is 1 when f is positive or zero, -1 when f is negative.
当 f 为正或为0返回1,为负返回-1。
http://www.ceeger.com/Script/Mathf/Mathf.Sign.html