![](/img/trans.png)
[英]Unity2D | If click go up on y-axis, else pingpong movement on a x-axis?
[英]Unity messes up X-axis rotation
我有一个非常简单的脚本,我希望在 X 轴上旋转一些东西,并且我希望其他两个轴保持不变(它们在 0 到 180 之间翻转),并且只有 X 会改变。
您可以在下面看到旨在执行此操作的代码。
public class TestScript : MonoBehaviour
{
private void Start()
{
transform.eulerAngles = Vector3.zero;
Debug.Log($"start rotation: {transform.eulerAngles}");
}
private void Update()
{
float time = (Time.time - 1f) * 10f;
if (time < 0f || time > 1f)
{
return;
}
Vector3 rotation = transform.eulerAngles;
float x = Mathf.Lerp(170f, 0, time);
rotation.x = x;
transform.eulerAngles = rotation;
Debug.Log($"rotation: {transform.eulerAngles}, x: {x}");
}
}
来自控制台的 output。 可以清楚的看到旋转不是go从170到0,而是从0到90再回到0。
现在,我很确定这与四元数及其身份有关,但不确定如何避免这种情况
PS:同样的想法,但对于 Y 和 Z 工作得很好。
现在,我很确定这与四元数有关
那么真正的罪魁祸首是欧拉角。
如果我们看一下您的代码:
Vector3 rotation = transform.eulerAngles;
float x = Mathf.Lerp(170f, 0, time);
rotation.x = x;
transform.eulerAngles = rotation;
Debug.Log($"rotation: {transform.eulerAngles}, x: {x}");
...我们可以看到您正在通过transform.eulerAngles
执行旋转。 关于 3D 旋转的问题是,由于欧拉的局限性和问题(万向节锁定任何人),您应该避免使用欧拉,而是使用四元数。 后者是真理的来源。
团结(我的重点):
当您阅读 .eulerAngles 属性时,Unity 会将四元数的内部旋转表示转换为欧拉角。 因为,使用欧拉角表示任何给定旋转的方法不止一种,因此您读出的值可能与您分配的值完全不同。 如果您尝试逐渐增加值以生成 animation,这可能会导致混淆。
...这正是您的代码正在发生的事情。
考虑一下:
注意到有关23.5
和156.5
的任何信息吗?
23.5 + 156.5 = 180
换句话说,两者都将导致相同的旋转,因为“有不止一种方法可以表示任何给定的旋转” 。
一个有争议的更简单的方法是:
public class RotateWithTime : MonoBehaviour
{
[SerializeField,Tooltip("Rotation rate in degrees/second")]
private Vector3 rotationSpeed; // e.g. (30,0,0) for 30 rads/sec X-only
private void Reset()
{
rotationSpeed = Vector3.zero;
}
// Update is called once per frame
void Update()
{
var amount = rotationSpeed * Time.deltaTime;
transform.Rotate(amount);
}
}
为了避免这个问题由于最初的问题缺乏信息而变成一个变色龙问题,我已经问了一个新问题,并将关闭这个问题。 你可以在这里找到
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.