首页 文章

Unity X轴旋转怪癖

提问于
浏览
1

我有一个脚本,按下按钮时旋转对象 . 旋转平面取决于在“下拉”菜单中选择的轴 . 该脚本对于Y轴和Z轴大多适用,但在X轴上具有意外行为 .

按住左旋转按钮时,音量将旋转至-90并“卡住” . 然后我按住右旋转按钮,再次卡住之前不会超过90 . 甚至更奇怪的是,经常在卡在特定方向并切换到另一个方向后,而不是从另一个方向返回的音量,它继续沿着它前进的方向,如果它没有被卡在第一位 . 这会导致左右旋转按钮被交换 .

这是包含所有主要操作的代码 .

public void Update()
{
    axis = axisDropdown.value;
    Vector3 originalRot = transform.eulerAngles;

    if (buttonHeld)
    {
        if (rotateRight)
        {
            if (axis == 0)
            {
                originalRot.x += 1;
                transform.rotation = Quaternion.Euler(originalRot);
            }
            else if (axis == 1)
            {
                originalRot.y += 1;
                transform.rotation = Quaternion.Euler(originalRot);
            }
            else if (axis == 2)
            {
                originalRot.z += 1;
                transform.rotation = Quaternion.Euler(originalRot);
            }
            else
            {
                print("Error: Selected axis option is invalid");
            }
        }
        else
        {
            if (axis == 0)
            {
                originalRot.x -= 1;
                transform.rotation = Quaternion.Euler(originalRot);
            }
            else if (axis == 1)
            {
                originalRot.y -= 1;
                transform.rotation = Quaternion.Euler(originalRot);
            }
            else if (axis == 2)
            {
                originalRot.z -= 1;
                transform.rotation = Quaternion.Euler(originalRot);
            }
            else
            {
                print("Error: Selected axis option is invalid");
            }
        }
    }
}

我已经阅读了其他类似的问题,但它们似乎都略有不同,所以任何帮助都会受到赞赏 .

1 回答

  • 2

    这确实是由万向节锁定效应引起的 . 之所以发生这种情况,是因为我试图改变物体的欧拉角而不是仅仅围绕四元数旋转 .

    以下是避免此问题的工作代码:

    public void Update()
    {
        axis = axisDropdown.value;
        Vector3 originalRot = transform.eulerAngles;
    
        if (buttonHeld)
        {
            if (rotateRight)
            {
                if (axis == 0)
                {
                    transform.RotateAround(volume.transform.position, Vector3.right, 50 * Time.deltaTime);
                }
                else if (axis == 1)
                {
                    transform.RotateAround(volume.transform.position, Vector3.up, 50 * Time.deltaTime);
                }
                else if (axis == 2)
                {
                    transform.RotateAround(volume.transform.position, Vector3.forward, 50 * Time.deltaTime);
                }
                else
                {
                    print("Error: Selected axis option is invalid");
                }
            }
            else
            {
                if (axis == 0)
                {
                    transform.RotateAround(volume.transform.position, Vector3.left, 50 * Time.deltaTime);
                }
                else if (axis == 1)
                {
                    transform.RotateAround(volume.transform.position, Vector3.down, 50 * Time.deltaTime);
                }
                else if (axis == 2)
                {
                    transform.RotateAround(volume.transform.position, Vector3.back, 50 * Time.deltaTime);
                }
                else
                {
                    print("Error: Selected axis option is invalid");
                }
            }
        }
    }
    

相关问题