随笔 - 121  文章 - 0  评论 - 55  阅读 - 13万

Vector2.Angle 的 bug

获取角度 ,官方提供了 Vector2.Angle 来得值,他的值是在 0  ,180之间

原始代码是

1
2
3
4
public static float Angle(Vector3 from, Vector3 to)
{
    return Mathf.Acos(Mathf.Clamp(Vector3.Dot(from.normalized, to.normalized), -1f, 1f)) * 57.29578f;
}

 

注意最后一个是 180/ 3.1415926...  =  57.29578f;正常角度是 360,所以我们可以先 做出 -180,180之间

你可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float angle_180(Vector2 from, Vector2 to)
  {
      Vector3 v3;
      Vector3 v3_from = new Vector3(from.x, from.y, 1);
      Vector3 v3_to = new Vector3(to.x , to.y  , 1);
      v3 = Vector3.Cross(v3_from, v3_to);
      if (v3.z > 0)
      {
          return Vector2.Angle(from, to);
      }
      else
      {
          return -Vector2.Angle(from, to);
      }
  }

 也可以这样写

1
2
3
4
5
6
7
8
float VectorAngle(Vector2 from, Vector2 to)
 {
     float angle;
 
     Vector3 cross = Vector3.Cross(from, to);
     angle = Vector2.Angle(from, to);
     return cross.z > 0 ? -angle : angle;
 }

 0,360之间可以这样写

1
2
3
4
if (angle < 0)
               {
                   angle = 360 + angle;
               }

 

但是,我今天要说的不是这些,这些百度都可以知道。

我说的是 Vector2.Angle  的 bug以上的操作,仅仅对于 起始点0,0  有效,如果起始点 其他坐标,那么 他将会有误差

那么我们改怎么做呢?

这样写,可以没有误差,注意 initPosition是目标坐标

1
2
3
4
Vector2 v2 = (mousePosition - initPosition).normalized;
float angle = Mathf.Atan2(v2.y, v2.x)*Mathf.Rad2Deg;
if(angle < 0)
    angle = 360 + angle;

 参考老外聊天,这个问题也是我 发现后 google 找的。

http://answers.unity3d.com/questions/444414/get-angle-between-2-vector2s.html

posted on   太粗难进  阅读(4510)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示