2016-08-19 3 views
0

現実世界に対して正確な回転をするには、オブジェクトを回転させる必要があります。したがって、Input.gyro.attitudeを呼び出すと、デバイスの位置を表すクォータニオンが返されます。一方、これは私に、この四元数に基づいたすべての回転をデフォルトの回転として計算させるように強制します。 上向きいくつかのオブジェクトを設定する簡単な方法は、以下のようになります。Unity c#クォータニオン:z軸を使用してyをスワップ

Vector3 up = Input.gyro.attitude.eulerAngles; 
... 
transform.rotation = Quaternion.Euler(up.x, up.y, up.z); 

これは、xの周りup.x次いで、Z周りup.zを回転させ、そしてY周りup.y

私の問題は、私のアプリでは、y軸とz軸がスワップされていることです(私はVuforiaを使用していますので、常にマーカーに相対的です)。 yの回りの回転、そしてその逆の回り。ここでは、物事は難しい取得:これはまだup.yと今のzの周りに最初の回転が、以来、明らかに

transform.rotation = Quaternion.Euler(up.x, up.z, up.y); 

は、失敗します。正しい順序は、最初にy、x、そしてzの順に回転する回転を作成することです。

オイラー角はクォータニオンから取得されているので、

transform.rotation = Quaternion.identity; 
    transform.Rotate(0, up.eulerAngles.z, 0); 
    transform.Rotate(up.eulerAngles.x, 0, 0); 
    transform.Rotate(0, 0, up.eulerAngles.y); 

はもちろん、どちらか動作しません。

しかし、私はこれを行う方法を見つけることができません。私は何か見落としていますか?

答えて

0

Quaternion.AngleAxisへの一連の呼び出しを、あなたが望む順序で掛けることができるはずです。このような何かを試してみませんか?

transform.rotation = Quaternion.identity * 
    Quaternion.AngleAxis(up.eulerAngles.y, Vector3.up) * 
    Quaternion.AngleAxis(up.eulerAngles.x, Vector3.forward) * 
    Quaternion.AngleAxis(up.euelerAngles.z, Vector3.right); 
+0

ありがとうございました。クォータニオンは対処する痛みです... –

関連する問題