ARアプリ オブジェクトの進行方向をカメラ位置に合わせる方法

AR

アプリをAndroidでテストしている時に、操作性について重要な見落としがあることに気付いたので修正までの流れを記述します



考察

本アプリではオブジェクトを生成したあとタップすることで選択状態になり、操作することが可能になります

現実空間にオブジェクトを並べて家財の配置をシミュレーションすることを目的としており、プレイヤーの位置はアプリ開始位置から複数回移動や向きを変更することが予想されます

アプリを立ち上げた場所がオブジェクトの進行方向の基準となるため、プレイヤーの位置がアプリ開始位置から変動しなければ、図のようにプレイヤーの入力方向とオブジェクトの移動方向はリンクしているように見えます

しかし、プレイヤーの位置が変わると・・・

オブジェクトの進行方向はアプリ開始位置から変動することがないので、プレイヤーの入力方向とズレが生じてしまいます

これでは操作がしづらく、プレイヤーがストレスを感じてしまいます

そこで、今回は図のようにプレイヤーの位置が変わってもオブジェクトの移動方向をプレイヤーの入力方向とリンクするように修正を試みたいと思います

スクリプトの修正

こちらの記事を参考にして、以下のように修正を加えました

・ジョイスティックに関して

//変更前
 float x = joystick.Horizontal;
 float z = joystick.Vertical;
 selectedObj.transform.position += new Vector3(x * 1.2f, 0, z * 1.2f) * Time.deltaTime;
 //変更後
 //クラス名直下に追加
 Rigidbody rb;
 float moveSpeed = 1f;
 //アップデート内に追加
 rb = selectedObj.GetComponent<Rigidbody>();
 float x = joystick.Horizontal;
 float z = joystick.Vertical;
 
 // カメラの方向から、X-Z平面の単位ベクトルを取得
 Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;

 // 方向キーの入力値とカメラの向きから、移動方向を決定
 Vector3 moveForward = cameraForward * z + Camera.main.transform.right * x;
 
 // 移動方向にスピードを掛ける
 rb.velocity = moveForward * moveSpeed;
 selectedObj.transform.position += rb.velocity * Time.deltaTime;

変更前はただ動かすことを目標としていたのでシンプルにジョイスティックの入力値から位置の変更を行っていました

それを上記のように変更し、オブジェクトの移動方向を常にカメラ(プレイヤー)の視点が基準となるようにしました

本アプリでは十字キーも存在しており、現時点では任意で表示/非表示を選択出来るようにしています

最終的に実装するかはまだ不明ですが、こちらにも修正を加えようと思います

    ublic void Z1()
    {
        Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;
        movObj.transform.position += cameraForward * 1.2f * Time.deltaTime;
        //movObj.transform.position += new Vector3(0, 0, 1.2f * Time.deltaTime);
    }
    public void Z2()
    {
        Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;
        movObj.transform.position += cameraForward * -1.2f * Time.deltaTime;
        //movObj.transform.position += new Vector3(0, 0, -1.2f * Time.deltaTime);
    }
    public void X1()
    {
        movObj.transform.position += Camera.main.transform.right * -1.0f * Time.deltaTime;
        //movObj.transform.position += new Vector3(-0.005f, 0, 0 * Time.deltaTime);
    }
    public void X2()
    {
        movObj.transform.position += Camera.main.transform.right * 1.0f * Time.deltaTime;
        //movObj.transform.position += new Vector3(0.005f, 0, 0 * Time.deltaTime);
    }

//部が変更前のものとなります

x方向とz方向それぞれがカメラの方向を基準とするようにしました

実行

もふもふ
もふもふ

いっぱいもふもふ(;゚Д゚)

プレイヤーの位置が変わってもオブジェクトが入力した方向に動くようになりました!



まとめ

オブジェクトの移動方向を常にプレイヤー視点を基準にするには、メインカメラからX-Z平面の単位ベクトルを取得し、方向キーの入力値とカメラの向きから、移動方向を決定する

タイトルとURLをコピーしました