当物体的 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 给出了假角的主要内容,如果未能解决你的问题,请参考以下文章