目次Category
(2020.06.13時点)NrealLightサンプルデモを動かすために、公式サイトを読んだので、備忘録として残します。
原文は、以下のリンクにあります。
https://developer.nreal.ai/develop/unity/emulator
Emulator: Testing your app
エミュレーターを使用すると、実際のNreal Lightグラスや、Nrealコンピューティングユニットなしで、PC上の複合現実アプリケーションをテストできます。
エミュレーターを使用すると、アプリをビルドして、Nrealデバイスにデプロイしなくても、テスト、反復、デバッグを行うことで、アプリ開発のスピードアップができます。
Unityを使用して、エミュレータプレハブをインポートするだけで、アプリをテストするこができます。
エミュレータの制御は、一般的な3Dビデオゲームと非常によく似ています。
キーボードとマウスを使用して、3D空間での頭の動き、コントローラの回転、追跡可能な平面または画像を制御することができます。
このセクションでは、次のことを学びます。
- Unityをエミュレーターとして利用して、MRアプリをデバッグする方法
- Nreal Lightグラスと、コントローラーセンサーからの入力情報を、キーボードとマウスを使用して、デバッグ時にシミュレートする方法
Prerequisites(前提条件)
・ NRSDKの概念と作業の流れを理解する
・ Unity(2018.x.x)に、NRSDKをインポートする
※Unity最新版(2019.x.x)で実行するとエラーが表示されて、エミュレーターが動作しないため注意
・ アプリのコードとリソースを準備する
Find Emulator in NRSDK package
Unityの「プロジェクトビュー」を開くと、「Assets > NRSDK > Emulator」というフォルダが見つかります。
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もあります。
コントローラーを利用して様々なアクションを入力できます。
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
- シーンにAssets / NRSDK / Prefabs / NRCamreaRig.prefabとNRSDK / Prefabs / NRInput.prefabがあることを確認してください。
- Unity Editorが実行時に、NREmulatorHeadPose.prefabがNRCameraRig.prefabによってシーンに自動的にロードされ、頭のポーズデータをシミュレートします。
- Unity Editorが実行時に、EmualatorController.PrefabがNRInput.prefabによってシーンに自動的に読み込まれ、コントローラーの入力データをシミュレートします。
- 「Assets / NRSDK / Emulator / Prefabs / NRTrackableImageTarget.prefab」または「Assets / NRSDK / Emulator / Prefabs / NRTrackablePlaneTarget.prefab」を配置して、trackalbe イメージと平面をシミュレーションします。
- TrackableObserver.csは、everyNRTrackableImageTarget.prefabおよびNRTrackablePlaneTarget.prefabに添付されています。TrackableObserverの中に、Trackableを見つけた時、見失った時の独自ロジックを登録する必要があります。
- TrackableObserver.csは、everyNRTrackableImageTarget.prefabおよびNRTrackablePlaneTarget.prefabに添付されています。TrackableObserverの中に、Trackableを見つけた時、見失った時の独自ロジックを登録する必要があります。
- 「/Assets/NRSDK/Emulator/Scripts/TrackableFoundTest.cs」に、registerイベントのサンプルがあります。
・ Sample Code: TrackableFoundTest.cspublic 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);
}
} - 画像を検出ターゲットとして使用する場合は、NRTrackableImageTarget.prefabで画像データベースを切り替えることができます
・NRSDKでは、画像検出用に3つのデフォルト画像が提供されています。独自のものを追加したい場合は、NRCameraRig.prefabを見つけてください。
・NRSessionBehaviour.csの下のFindNRKernalSessionConfig.asset
・プロジェクトビューで、Assets>NRSDK>NRKernalSessionConfigを選択し、インスペクターで「TrackingImageDatabase」を見つけて、独自のdatabase.assetをドラッグします。
・画像追跡データベースに画像を追加する方法について読む