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」に追加されています。
(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」で画像データベースを切り替えることができる。