当物体的 y 或 z 在 Unity 中发生变化时,Atan2 给出了假角

Posted

技术标签:

【中文标题】当物体的 y 或 z 在 Unity 中发生变化时,Atan2 给出了假角【英文标题】:Atan2 is giving the false angle when object's y or z change in Unity 【发布时间】:2021-07-21 23:42:02 【问题描述】:

我写了一个算法。它正常工作。 只是当 y 或 z 变化时,我无法得到 x 的直角

float x = Mathf.Atan2(transform.forward.y, transform.forward.z) * Mathf.Rad2Deg

当我的对象角度为 (x,0,0) 时,此代码给出了正确的角度。 但是当 y 或 z 改变(x,35,46)时,这段代码给出了错误的角度。 顺便说一句,我想获得 0-360 角度。 如果我得到这个角度,代码就可以工作(我测试过)。 所以我试图让x轴旋转0-360。 但是 atan2 没有给出正确的值。 也许我可以使用 Vector3.Angle 但它不起作用,我想要。 我在***中不会问太多问题,所以如果你不明白,请告诉我你没有明白哪一部分?

【问题讨论】:

请给出示例输入和预期输出 请使用正确的标签。请注意,unityscript 是或更好地曾经是一种 javascript 风格,例如使用早期 Unity 版本的自定义语言,并且现在很长已弃用!你的代码看起来像c# 【参考方案1】:

如果我理解您的正确,您希望对象围绕 X 轴(全局或局部)旋转。

您可以简单地使用 Transform.eulerAngles 之类的东西

var x = transform.eulerAngles.x;
if(x < 0) angle += 360;

或者如果你想要本地旋转(相对于父级)Transform.localEulerAngles

var x = transform.localEulerAngles.x;
if(x < 0) angle += 360;

【讨论】:

x小于270时不工作 为什么?在这种情况下会发生什么?你在哪里看到 270? 我需要 0-360 角度 eulerAngles 正在工作 270-90【参考方案2】:

不,我没想到

int sign = (transform.forward.y<0) ? 1 : -1;
float x = (Vector3.Angle(transform.position, transform.forward) - 38) * sign * 180 / 100;

此代码仅适用于 0,90,0 角度 旋转变化时我仍然无法达到正确的角度 我找到了一些结合 Cross,Dot,Angle 的代码:

float Angle360(Vector3 v1, Vector3 v2, Vector3 n)

   float angle = Vector3.Angle(v1,v2);
                        
   float sign = Mathf.Sign(Vector3.Dot(n, Vector3.Cross(v1, v2)));
   float signed_angle = angle * sign;
                    
   return (signed_angle + 180) % 360;

此代码也不起作用 它可能会使用 Vector3.Angle 或 Dot vs. 如何用 Vector3.Angle 找到直角, 值 38 正在变化

Vector3.Angle(transform.position, transform.forward)

此代码显示角度,但当旋转改变时,它会给出错误值。 当物体看起来改变时,我怎样才能得到 x 的角度。 因此,当值为 x,0,0 时,此代码是正确的。

Mathf.Atan2(transform.forward.y, transform.forward.z) * Mathf.Rad2Deg

我认为我没有正确使用 Vector3.Angle 当y和z值不同时,我需要得到x值

【讨论】:

以上是关于当物体的 y 或 z 在 Unity 中发生变化时,Atan2 给出了假角的主要内容,如果未能解决你的问题,请参考以下文章

Unity常用类—Transform类

Unity3D世界坐标系 ( 左手坐标系 | 游戏物体坐标 | 世界坐标系方向 )

Unity 父子物体关系

Unity基础(23)-UGUI

关于Unity中物体分别在本地和世界坐标系对应方向的移动

在unity3d里无法移动物体