繁体   English   中英

Unity 搞乱了 X 轴旋转

[英]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.5156.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM