Nreal Light

[Nreal Light] Emulator: Testing your app

2020年6月13日

目次Category


(2020.06.13時点)NrealLightサンプルデモを動かすために、公式サイトを読んだので、備忘録として残します。
原文は、以下のリンクにあります。
https://developer.nreal.ai/develop/unity/emulator

Emulator: Testing your app


エミュレーターを使用すると、実際のNreal Lightグラスや、Nrealコンピューティングユニットなしで、PC上の複合現実アプリケーションをテストできます。
エミュレーターを使用すると、アプリをビルドして、Nrealデバイスにデプロイしなくても、テスト、反復、デバッグを行うことで、アプリ開発のスピードアップができます。
Unityを使用して、エミュレータプレハブをインポートするだけで、アプリをテストするこができます。

エミュレータの制御は、一般的な3Dビデオゲームと非常によく似ています。
キーボードとマウスを使用して、3D空間での頭の動き、コントローラの回転、追跡可能な平面または画像を制御することができます。

このセクションでは、次のことを学びます。

  1. Unityをエミュレーターとして利用して、MRアプリをデバッグする方法
  2. Nreal Lightグラスと、コントローラーセンサーからの入力情報を、キーボードとマウスを使用して、デバッグ時にシミュレートする方法

Prerequisites(前提条件)


・ NRSDKの概念と作業の流れを理解する

・ Unity(2018.x.x)に、NRSDKをインポートする
  ※Unity最新版(2019.x.x)で実行するとエラーが表示されて、エミュレーターが動作しないため注意

・ アプリのコードとリソースを準備する

Find Emulator in NRSDK package


Unityの「プロジェクトビュー」を開くと、「Assets > NRSDK > Emulator」というフォルダが見つかります。

スクリーンショット 2020-06-13 11.22.52

Emulator Structure


エミュレーターフォルダーには、エミュレーターのすべてのコードとリソースが含まれています。

・ Editor
 Unityエディターの変更に使用するスクリプトが含まれています。
 ※NRSDK1.3.0には、このフォルダは見つかりません

・ Image
 コントローラの状態を表示するためのUI画像リソースが含まれています

・ Materials
 エミュレーターのTrackableImageおよびTrackablePlaneのマテリアルが含まれています

・ Models
 サンプルシーンで使用されている部屋モデルが含まれています

・ Prefabs
 NRTrackableImageTarget.prefab: 画像の検出をシミュレートするために使用されます
 NRTrackablePlaneTarget.prefab: 平面の検出をシミュレートするために使用されます

・ Resources
 動的にリソースを読み込むのに使用します

・ Scene
 TrackableImageと、TrackablePlaneをテストするための2つのデモが含まれています

・ Script
 NativeEmulator.cs: 低レベルAPIの呼び出しに使用します
 NREmulatorManager.cs: エミュレータのライフサイクルを管理するためのスクリプトです
 NREmulatorController.cs: コントローラの入力をシミュレートします
 NREmulatorHeadPose.cs: 頭の動きをシミュレートします
 NRTrackableImageBehaviour.cs: 追跡可能な画像をシミュレートするスクリプトです
 NRTrackablePlaneBehaviour.cs: 追跡可能な平面をシミュレートするスクリプトです
 NRTrackableObserver.cs: 追跡可能なターゲットのオブザーバーです
 TrackableFoundTest.cs: テストスクリプトです

Simulating the 6DoF Head Pose


・ キーボードの「W」「S」「A」「D」を使用して頭の位置の動きをシミュレートします

キー値説明
W前へ移動する
S後ろへ移動する
A左へ移動する
D右へ移動する

・ スペースキーを押し、マウスを使用して頭の回転をシミュレートします

・ サンプルコード

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;

 // Call api to simulate the headpose movement
 NREmulatorManager.Instance.NativeEmulatorApi.SetHeadTrackingPose(pos, q);
}

Simulating Controller Input


ゲームウィンドウの右下隅に、タッチの動きやボタンイベントなど、エミュレーターコントローラーの状態を示すコントローラーUIもあります。

スクリーンショット 2020-06-28 10.30.47


コントローラーを利用して様々なアクションを入力できます。

スクリーンショット 2020-06-28 9.57.50
スクリーンショット 2020-06-28 9.58.17
スクリーンショット 2020-06-28 9.59.05
スクリーンショット 2020-06-28 9.59.30
スクリーンショット 2020-06-28 9.58.37

 


Tutorial: Simulating Headpose, Controller & Trackable Object



Run the Sample

はじめに、「Assets/NRSDk/Emulator/Scenes/TrackableImageEmulator.unity」と
「Assets/NRSDk/Emulator/Scenes/TrackablePlaneEmulator.unity」の2つは、
エミュレーターのサンプルです。
開発者は、Unity Editorで直接シーンを再生したり、apkに組み込んでNreal Deviceで実行したりできます。

Create your own

  1. シーンにAssets / NRSDK / Prefabs / NRCamreaRig.prefabとNRSDK / Prefabs / NRInput.prefabがあることを確認してください。
    • Unity Editorが実行時に、NREmulatorHeadPose.prefabがNRCameraRig.prefabによってシーンに自動的にロードされ、頭のポーズデータをシミュレートします。
    • Unity Editorが実行時に、EmualatorController.PrefabがNRInput.prefabによってシーンに自動的に読み込まれ、コントローラーの入力データをシミュレートします。
  2. 「Assets / NRSDK / Emulator / Prefabs / NRTrackableImageTarget.prefab」または「Assets / NRSDK / Emulator / Prefabs / NRTrackablePlaneTarget.prefab」を配置して、trackalbe イメージと平面をシミュレーションします。
    • TrackableObserver.csは、everyNRTrackableImageTarget.prefabおよびNRTrackablePlaneTarget.prefabに添付されています。TrackableObserverの中に、Trackableを見つけた時、見失った時の独自ロジックを登録する必要があります。
      スクリーンショット 2020-06-28 11.12.11
  3. 「/Assets/NRSDK/Emulator/Scripts/TrackableFoundTest.cs」に、registerイベントのサンプルがあります。

    ・ Sample Code: TrackableFoundTest.cs

    public class TrackableFoundTest : MonoBehaviour {

     // Observer of the registed event
     public TrackableObserver Observer;
     // Showing GameObject on the detected Trackable object
     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.prefabで画像データベースを切り替えることができます
    スクリーンショット 2020-06-28 11.12.11

    ・NRSDKでは、画像検出用に3つのデフォルト画像が提供されています。独自のものを追加したい場合は、NRCameraRig.prefabを見つけてください。
     ・NRSessionBehaviour.csの下のFindNRKernalSessionConfig.asset
    スクリーンショット 2020-06-28 11.25.55

    ・プロジェクトビューで、Assets>NRSDK>NRKernalSessionConfigを選択し、インスペクターで「TrackingImageDatabase」を見つけて、独自のdatabase.assetをドラッグします。
    スクリーンショット 2020-06-28 11.29.13
    スクリーンショット 2020-06-28 11.29.28

    ・画像追跡データベースに画像を追加する方法について読む
    スクリーンショット 2020-06-28 11.35.28

この記事を書いた人

佐々木 努

執行役員CTO
人材開発室 室長
一般社団法人 iCD協会 活用支援委員会メンバー