2017-02-09 456 views
1

我有一个脚本,可以在按下按钮的同时旋转对象。旋转平面取决于在下拉菜单中选择哪个轴。该脚本对于Y轴和Z轴大多适用,但在X轴上有意想不到的行为。Unity 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"); 
      } 
     } 
    } 
} 

我已经阅读了其他类似的问题,但他们都似乎略有不同,所以任何帮助,将不胜感激。

+0

在我看来,这是一个万向节锁定效应 – Bijan

+0

是的,刚刚抬头的万向节锁定效应。这听起来完全像我的问题。你有什么想法来解决这个问题吗? – jarthur

回答

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

我看到你找到了解决方案,别忘了接受你的回答 – Bijan

+0

是的,只需再等9个小时.. – jarthur