モバイル デバイスの向きを読み取り、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 に正しく設定されますが、電話を回転させると、オブジェクトが間違った軸で回転しているように見えます。これの何が問題なのですか?
編集:
コードにいくつかの問題があることがわかりました
Jerome が述べたように、電話が横向きモードで使用されていたため、向きを再マッピングする必要がありました。
Quaternion.Euler(0, 0, 90) * InputState.orientation
Unity は左側の座標を使用しますが、センサーによって読み取られる入力は右側です。z を否定して変換します。
この実装で解決できなかった最後の問題は、回転が特定の角度を超えると突然ジャンプすることです。ランドスケープ モードで電話機の高さを地平線より上に上げると、オブジェクトが z 軸に沿って 90 度回転します。
私はクォータニオンのみを扱っており、不連続性があってはならないので、なぜこれが起こっているのかわかりません。