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

unity判断一个物体是否在正前方或者左右1 点积 对于 n 维度代数定义 几何的定义 a b a b cos a b 1 1 关于它的公式 而判断两个物体的位置 关系 是可以通过 这个 cos a b 来判断 知道了这个余玄值 就可以知道 这个角度了 它在 Unity 中 a b a b

大家好,我是讯享网,很高兴认识大家。

 

 

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

小讯
上一篇 2025-01-29 13:28
下一篇 2025-03-24 19:56

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/16646.html