3

モバイル デバイスの向きを読み取り、PC 画面に対する携帯電話の角度に基づいてゲーム オブジェクトを回転させる PC 上のユニティ アプリを作成しています。

void Update () {
    // Set main screen orientation when left trigger is pressed
    if(leftPad.GetTrigger())
        mainScreenOrientation = InputState.orientation;

    Quaternion delta = InputState.orientation * Quaternion.Inverse(mainScreenOrientation);
    transform.localRotation = delta;
}

InputState.orientation は電話の向きで、フレームごとに更新されます。ユーザーが最初にアプリを起動するとき、スマートフォンを画面に向けて mainScreenOrientation を登録する必要があります。

現在の電話と PC の画面の向きの間の差分が計算され、ゲーム オブジェクトの transform.localRotation に設定されます。

すべての四元数は、y が磁北を指し、x が東を指し、z が上を指すように定義されます。 ここに画像の説明を入力

登録後、ゲーム オブジェクトの向きは ID に正しく設定されますが、電話を回転させると、オブジェクトが間違った軸で回転しているように見えます。これの何が問題なのですか?

編集:

コードにいくつかの問題があることがわかりました

  1. Jerome が述べたように、電話が横向きモードで使用されていたため、向きを再マッピングする必要がありました。

    Quaternion.Euler(0, 0, 90) * InputState.orientation

  2. Unity は左側の座標を使用しますが、センサーによって読み取られる入力は右側です。z を否定して変換します。

この実装で解決できなかった最後の問題は、回転が特定の角度を超えると突然ジャンプすることです。ランドスケープ モードで電話機の高さを地平線より上に上げると、オブジェクトが z 軸に沿って 90 度回転します。

私はクォータニオンのみを扱っており、不連続性があってはならないので、なぜこれが起こっているのかわかりません。

4

2 に答える 2

1

どのセンサーを使用していますか?加速度計またはジャイロ?

電話機で使用される軸は絶対的なものである可能性があるため、Unity3Dの3D軸に合わせるために、デバイスの向きによっては再マッピングが必要になる場合があります。

ポートレートまたはランドスケープの向きによっては、y軸とx軸を切り替える必要がある可能性があります。

于 2013-02-15T12:31:56.113 に答える
0

オイラーを使用しているので、ゼロラインを越えるように調整する必要があると思います。たとえば、回転している方向に応じて 360 を加算または減算します。これは角度が 360 を超える場合はそれほど重要ではありませんが、Unity では負の角度値が好まれないため、この問題が発生したことを覚えています。

于 2013-02-15T15:49:30.207 に答える