見出し画像

Nreal / エミュレータ

1. エミュレータ

「NRSDK」の「エミュレータ」(正確にはシミュレータ)を使用することで、「Unity Editor」上で「Nrealアプリ」を動作確認できます。キーボードとマウスを使用して、3D空間での頭の動き、コントローラの回転、追跡可能な平面または画像をシミュレートできます。

2. エミュレータのファイル構成

「エミュレータ」のスクリプトとリソースは、「Assets/NRSDK/Emulator」にあります。

Editor: Unity Editorの変更に使用されるスクリプト。
Image: コントローラの状態を示すUI画像リソース。
Material: エミュレータのTrackableImageおよびTrackablePlaneのマテリアル。
Model: サンプルで使用される部屋のモデル。
Prefabs:
 ・NRTrackableImageTarget: 画像の検出のシミュレート。
 ・NRTrackablePlaneTarget: 平面の検出のシミュレート。
Resources: 動的読み込みリソース。
Scene:
 ・TrackableImageEmulator: TrackableImageをテストするデモ。
 ・TrackablePlaneEmulator: TrackablePlaneをテストするデモ。
Script:
 ・NativeEmulator.cs: 低レベルAPIの呼び出し。
 ・NREmulatorManager.cs: エミュレータのライフサイクルの管理。
 ・NREmulatorController.cs: コントローラーの入力のシミュレート。
 ・NREmulatorHeadPose.cs: ヘッドポーズの動きのシミュレート。
 ・NRTrackableImageBehaviour.cs: 追跡可能な画像のシミュレート。
 ・NRTrackablePlaneBehaviour.cs: 追跡可能な平面のシミュレート。
 ・NRTrackableObserver.cs: 追跡可能なターゲットのオブザーバ。
 ・TrackableFoundTest.cs: テストスクリプト。

3. 頭の動きのシミュレート

頭の動きの「Unity Editor」上での操作方法は、次のとおりです。

頭の位置: WSADキー。
頭の回転: スペース+マウス。

void UpdateHeadPosByInput()
{
    float mouse_x = Input.GetAxis("Mouse X") * HeadRotateSpeed;
    float mouse_y = Input.GetAxis("Mouse Y") * HeadRotateSpeed;
    Vector3 mouseMove = new Vector3(
        m_CameraTarget.transform.eulerAngles.x - mouse_y,
        m_CameraTarget.transform.eulerAngles.y + mouse_x, 0);
    Quaternion q = Quaternion.Euler(mouseMove);
    m_CameraTarget.transform.rotation = q;

    Vector3 p = GetBaseInput();
    p = p * HeadMoveSpeed * Time.deltaTime;
    Vector3 pos = p + m_CameraTarget.transform.position;
    m_CameraTarget.transform.position = pos;

    // 頭の動きをシミュレート
    NREmulatorManager.Instance.NativeEmulatorApi.SetHeadTrackingPose(pos, q);
}

4. コントローラの回転のシミュレート

画面右下に、コントローラ状態を示すコントローラーUIも表示されます。

コントローラの回転: Shift+マウス
Trackpadのクリック: マウスの左クリック
Home Buttonのクリック: マウスの右クリック
App Buttonのクリック: マウスの中央クリック
Trackpadのスワイプ: 上下左右キー

void UpdateControllerRotateByInput()
{
    float mouse_x = Input.GetAxis("Mouse X") * HeadRotateSpeed;
    float mouse_y = Input.GetAxis("Mouse Y") * HeadRotateSpeed;

    Vector3 mouseMove = new Vector3(
        m_Target.transform.eulerAngles.x - mouse_y,
        m_Target.transform.eulerAngles.y + mouse_x, 0);
    Quaternion q = Quaternion.Euler(mouseMove);
    m_Target.transform.rotation = q;
    
    // コントローラの回転をシミュレート
    NREmulatorManager.Instance.NativeEmulatorApi.SetControllerRotation(new Quaternion(q.x, q.y, q.z, q.w));
}

5. チュートリアル

エミュレータを利用するサンプルを作成します。

(1) シーンに「NRCameraRig」と「NRInput」を配置。
「Unity Editor」での実行時に、「NRCameraRig」が「NREmulatorHeadPose」を自動的に読み込み、頭の位置をシミュレートします。
「Unity Editor」での実行時に、「NRInput」が「EmualatorController」を自動的に読み込み、コントローラの回転をシミュレートします。

(2)「NRTrackableImageTarget」または「NRTrackablePlaneTarget」を配置。
画像の検出または面の検出をシミュレートします。スクリプト「TrackableObserver」は「NRTrackableImageTarget」および「NRTrackablePlaneTarget」に追加されています。 

画像1

(3)「/Assets/NRSDK/Emulator/Scripts/TrackableFoundTest」に、登録イベントのサンプルがある。

public class TrackableFoundTest : MonoBehaviour {

    // 登録イベントのオブザーバー
    public TrackableObserver Observer;
 
    // 追跡可能オブジェクト検出時にゲームオブジェクト表示
    public GameObject Obj;

    // スタート時に呼ばれる
    void Start ()
    {
        Obj.SetActive(false);
        Observer.FoundEvent += Found;
        Observer.LostEent += Lost;
    }

    // 発見時に呼ばれる
    private void Found(Vector3 pos, Quaternion qua)
    {
        Obj.transform.position = pos;
        Obj.transform.rotation = qua;
        Obj.SetActive(true);
    }

    // ロスト時に呼ばれる
    private void Lost()
    {
        Obj.SetActive(false);
    }
}

(4) 画像を検出ターゲットとして使用する場合は、「NRTrackableImageTarget」で画像データベースを切り替えることができる。

画像2


いいなと思ったら応援しよう!