RGBCamera-Capture を読み解いてみる

概要

RGBCamera を読み解いてみる - NOSIX に引き続き、 RGB Camera の使い方を理解するために、 サンプルとして提供されている RGBCamera-Capture (Scene) のソースコードを解読してみます。 個人的な読解結果であるため誤りが含まれている可能性があることをご了承ください。

目次

確認環境

  • NRSDK 1.2.1

解説

RGBCamera を読み解いてみる - NOSIX と重複している内容は省略しています。

このサンプルは以下の 2 つの機能のサンプルになっています。これらは同時に使わずに別々に使うことができます。

  • PhotoCapture
  • Previewer

PhotoCapture は静止画の Texture2D を取得する機能です。 このサンプルでは、Trigger ボタン (マウスの左ボタンクリックで Emulate される) で静止画が撮影され、目の前に静止画が表示されます。 また、目の前に表示するだけではなく Previewer にも表示します。 PhotoCaptureExample (Script) で処理方法は確認できます。 NRPhotoCapture クラスを使うことで実現しています。

Previewer は撮影した画像 (Texture2D) をプレビューする機能です。 このサンプルでは、App ボタン (Emulator では Space キーでも可) でプレビューの On/Off を切り替えます。 Previewer を On にすると右手コントローラーの付近にプレビューが表示されます。 Previewer を Off にすると Raycast の Laser と Reticle が表示されます。 Previewer (Prefab) を追加して、Previewer.SetData をいずれかの Script から呼び出して使用します。 このサンプルでは、PhotoCaptureExample (Script) で静止画を撮影した際に Previewer.SetData を呼び出してプレビューを更新しています。 Previewer には State Icon があり、再生中は緑、停止中は赤になります。 この再生中の状態も Previewer.SetData で設定します。 このサンプルでは、停止中に設定されることがないため赤に変わりません。

Hierarchy

  • RGBCamera-Capture (Scene)

  • Previewer (Prefab)

    • [C] Canvas
    • [C] NRPreviewer
    • Root : Rotation X で 90 度回転している (Laser と水平)
      • PreviewScreen
        • [C] RawImage
      • StateIcon
        • [C] Image

Scripts

PhotoCaptureExample の Scripts

  • PhotoCaptureExample (in Demos/Record/Scripts/PhotoCaptureExample)
    • Inspector での設定項目
      • Previewer
    • 起動時に RGB Camera を Activate する
    • Trigger ボタン、もしくは、T キーで、写真を撮影する
    • Home ボタン、もしくは、Q キーで、RGB Camera を Deactivate する
    • App ボタン、もしくは、O キーで、RGB Camera を Activate する
    • NRPhotoCapture が生成されているならば、Previewer.SetData を呼び出し、Previerwer に Texture2D と状態を設定する
      • Deactivate しても Previewer の状態は変更されない
        • Deactivate すると NRPhotoCapture が破棄されて Previewer.SetData が呼び出されなくなるため
    • Activate の手順は
      • NRPhotoCapture.CreateAsync で NRPhotoCapture インスタンスを生成する
      • 生成した NRPhotoCapture インスタンスに対して StartPhotoModeAsync で Activate する
        • CameraParameters で RGB Camera の設定を行う
    • Deactivate の手順は
      • NRPhotoCapture.StopPhotoModeAsync を呼び出す
      • 完了通知コールバックで、NRPhotoCapture.Dispose()
    • 写真を撮影する手順は
      • NRPhotoCapture.TakePhotoAsync を呼び出す
      • 撮影成功すると PhotoCaptureFrame インスタンスが得られる
        • PhotoCaptureFrame.UploadImageDataToTexture で Texture2D を更新する
        • 撮影した画像の Quad を生成して、目の前に表示する
          • NRSessionManager から NRHMDPoseTracker を取得し、Center Camera の位置を取得する
          • Center Camera の前方に Quad の位置を設定する
          • Quad の Material に Texture2D を設定する

Previewer の Scripts

  • NRPreviewer (in Scripts/Capture)
    • Inspector での設定項目
      • Root
      • Preview Screen : PreviewScreen (RawImage)
      • State Icon : StateIcon (Image)
      • Is Bind To Controller : true
    • App ボタン、もしくは、Space キーで以下を切り替える
      • Controller の Laser, Reticle 表示
      • Root (GameObject) の表示
    • Is Bind To Controller が true ならば、Controller (Right) の ModelAnchor から forward 方向に 0.3 の位置に Previewer (GameObject) を表示する
      • false ならば、Unity Editor で設定した位置になる