2017-02-09 7 views
1

ボタンを押しながらオブジェクトを回転させるスクリプトがあります。回転平面は、ドロップダウンメニューでどの軸が選択されているかによって異なります。このスクリプトは主にY軸とZ軸で正常に機能しますが、X軸では予期しない動作をします。ユニティ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

関連する問題