unity判断一个物体是否在正前方或者左右

 

 

1.点积  

对于n维度代数定义:  

几何的定义: a·b=|a|*|b|*cos<a,b> 

1.1   关于它的公式

       而判断两个物体的位置 关系,是可以通过 这个 cos<a,b> 来判断,知道了这个余玄值,就可以知道 这个角度了。

它在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);
    }

1.2  关于它的作用

  • 一是光照模型的应用,漫反射,高光的计算,diffuse=0.5+0.5*dot(n,l) ,n是法线方向,l是光照方向, 高光saturate(pow(dot(n,h),_Gloss))其中,h是 (viewDir+worldLightDir)/2
  • 二是判断方位,角度,视野
  • 三是 几何意义可以是求b在 a的投影
  • ....还有很多

1.3  如何求方位

如何判断 a 与b 的方位呢

使用a物体的transform.forward向量与 a物体到b的方向做点击就可以得到这个余弦值了

a到b的方向: otherObj.transform.position – transform.position

transform.forward 是玩家正面朝向 方向

大于0则面对,否则则背对着。当然这个计算也会有一点误差,但大致够用。

 因为求的角度用的是 单位向量,所以可以直接求得cos<a,b>

这个角度值 还可以用来判断是否在视野内,一般情况下人的视野是在124度内,游戏里一般是限制在90度左右,视距就直接是两点之间的距离了。

a·b= |a| *|b| * cos<a,b>   =>    a·b= |1|

cos<a,b>的 含义图:

 

2.叉积

叉积的定义: c =a x b  其中a,b,c均为向量。即两个向量的叉积得到的还是向量! 

  • 性质1: c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面 。 
  • 性质2: 模长|c|=|a||b|sin<a,b> 
  •         性质3: 满足右手法则 。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。 
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)
    );
    }

 

3.关于使用:

自己个人项目的用法,用来判断前后关系,大于0在前方,小于0在后方下面会解释

1.判断目标在自己的前后方位可以使用下面的方法:

  Vector3 dir = target.position - transform.position; //位置差,方向     

   Vector3.Dot(transform.forward, dir);

返回值为正时,目标在自己的前方,反之在自己的后方

 

2.判断目标在自己的左右方位可以使用下面的方法:

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决定的。 

 

Mathf.Sign 符号

 

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

  • 11
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值