プログマのプログラマ日記

技術メモや自社サービスに関する記事を書いていく予定です。

Unity + Oculus Integrationで物をつかむ(その2:コントローラを表示)

Unity + Oculus Integrationを使ってコントローラやハンドトラッキングでオブジェクトをつかむまでの手順をStep by stepで説明します。
やっていることはOculus Integrationのサンプルシーン「HandGrabExamples」と同様ですが、これを0から組み立ててみてSceneを構成するコンポーネントの役割への理解を深めようという趣旨の記事です。

以下のステップで実装を進めていきます。

  • ルームスケールで動き回れるSceneを作成する手順
  • コントローラを表示できるようにする手順(本記事)
  • 手を表示できるようにする手順
  • オブジェクトをつかめるようにする手順
  • オブジェクトをつかむときのポーズ(つかむ場所・手の形)を設定する手順

2022/11/7: githubにプロジェクトを共有しました。
github.com

環境構築・プロジェクト作成

環境構築とプロジェクト作成の手順については、こちらの記事を参照してください。

rhikos-prgm.hatenablog.com

利用するコンポーネント

今回の記事で新たに使用するコンポーネントは以下の通りです。

InteractionRigOVR

以下のような階層をもったprefab(カッコ内はアタッチされているScript)

InteractionRigOVR
 +- OVRCameraRig
 +- InputOVR(OVRCameraRigRef, TrackingToWorldTransformerOVR)
       +- Hmd(Hmd)

OVRCameraRigは前回も使用しました。
InputOVRはHand(今回未使用。ハンドトラッキングを扱うためのprefab)やController(後述)、Hmdなどのprefabをアタッチするためのベースとなるprefabです。

詳細は下記の「InputOVR」を参照。
Inputs | Oculus Developers

それぞれのprefabにアタッチされているScriptの詳細についてはAPIリファレンスを参照...と、言いたいところですが、載ってません。
クラス名から役割を推測したり実際にソースを読んでみるしかなさそうです。

Controllers

コントローラの位置にコントローラを表示するためのprefabです。
階層は以下の通り。

Controllers
 +- LeftController(Controller, ControllerActiveState)
 |     +- ControllerDataSource(FromOVRControllerDataSource)
 |     +- ControllerInteractors(InteractorGroup)
 +- RightController
       +- ControllerDataSource(FromOVRControllerDataSource)
       +- ControllerInteractors(InteractorGroup)

ちなみに、 * コントローラの位置に手を表示する場合 ... ControllerHandsを追加 * ハンドトラッキングした位置に手を表示する場合 ... Handsを追加 のように、用途によって使い分けます。

Sceneの実装手順

Sceneの作成

空のシーンを作成します。(Assets/Sandbox/HandGrab/Scenes/Scene1)
MainCameraを削除します。
Scene配下に「Oculus/Interaction/Runtime/Prefab/InteractionRigOVR」のprefabを配置します。

Controllersの配置

InteractionRigOVR/InputOVR配下に「Oculus/Interaction/Runtime/Prefab/Controllers」のprefabを配置します。
Controllers/LeftController/ControllerDataSourceのコンポーネント「From OVR Controller Hand Data Source」の属性を以下のように設定します。

  • Camera Rig Ref ... InteractionRigOVR/InputOVR
  • Tracking To World Transformer ... InteractionRigOVR/InputOVR
  • HmdData ... InteractionRigOVR/InputOVR/Hmd

※Right側も同様の手順で設定します。

動作確認

実行すると手の位置にコントローラが表示されるようになります。
ボタンやレバー操作とVR内のコントローラのボタン・レバーの動きも同期していることを確認してみてください。

参考サイト

公式:Oculusスタートガイド(Unity)
Get Started with Oculus in Unity | Oculus Developers

公式:入力データの概要
※サンプルシーンのInteractionRigOVR~prefab配下のコンポーネント群が何をやっているのか、ざっくり理解するための最適なドキュメントだと思います。
Inputs | Oculus Developers

公式:APIリファレンス
Reference