Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 统一X轴旋转怪圈_Unity3d_Rotation_Game Physics_Quaternions - Fatal编程技术网

Unity3d 统一X轴旋转怪圈

Unity3d 统一X轴旋转怪圈,unity3d,rotation,game-physics,quaternions,Unity3d,Rotation,Game Physics,Quaternions,我有一个脚本,在按下按钮时旋转一个对象。旋转平面取决于在下拉菜单中选择的轴。该脚本在Y轴和Z轴上基本正常,但在X轴上有意外的行为 按住左旋转按钮时,音量将旋转至-90并“卡住”。然后我按住右旋转按钮,它不会超过90,然后再次卡住。更奇怪的是,通常情况下,在被卡在某个特定的方向并切换到另一个方向后,音量不是以另一种方式返回,而是以原本没有被卡的方向继续。这会导致左右旋转按钮互换 下面是所有主要操作的代码 public void Update() { axis = axisDropdown.

我有一个脚本,在按下按钮时旋转一个对象。旋转平面取决于在下拉菜单中选择的轴。该脚本在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");
            }
        }
    }
}

我曾读到过与我类似的其他问题,但它们似乎都略有不同,因此我们非常感谢您的帮助。

这确实是由于万向节锁效应造成的。这是因为我试图改变物体的欧拉角,而不是仅仅围绕四元数旋转

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

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");
            }
        }
    }
}

在我看来,这是一个万向节锁的效果是的,只是查了一下万向节锁的效果。这听起来和我的问题一模一样。你对如何解决这个问题有什么想法吗?我看到你找到了解决办法,别忘了接受你的答案