174.1K Views
December 16, 22
スライド概要
Oculus IntegrationのInteraction SDKを利用する方法です。
ものを掴むなどのグラブ回りの使い方を解説しています。
対応バージョンは下記のとおり
・Unity2020/2021/2022対応
・Integration 46/55対応
OCULUS INTEGRATION INTERACTION SDKで物をつかむ編 (V46/V55-56対応)
大久保 聡 Mail [email protected] Twitter @followapp
環境構築 環境設定については、PluginとProject Settingsの一部を入れていますが、細かな部分は解説されて いるHomeページがたくさんありますので省略します。 プロジェクトはURPで作成しています。 検証済みのバージョンの組み合わせは下記の通りです。 Unity2020-21 Oculus Inetgration 46.0 Oculus XR Plugin 3.2.1(or 1.11.2) Unity 2021.3.12f1 (or 2020.3.29f1) Unity2022 Oculus Inetgration 55.0 Oculus XR Plugin 4.0 Unity 2022.3.5f1
PLUGINのインポート Oculus IntegrationをImport Oculus Inetgration 46.0 Oculus Inetgration 55.0
OCULUS INTEGRATION56 ターゲットデバイスに、Quest3が選択可能になります。また、VulcanでもDynamic Resolution (負荷に応じて解像度を動的に変える機能)も使えるようになりました。
PLUGINのインポート Oculus XR Pluginを利用。 Oculus XR Plugin 3.2.1(or 1.11.2) Oculus XR Plugin 4.0
PROJECT設定 XR Plug-in Managementの設定もいい感じに終わらせる。
PROJECT設定 Oculusの設定
PROJECT設定 Oculusの設定
OCULUS INTEGRATION
新規シーン OVRCameraRigを検索し、シーンに追加する。
OVRMANAGERの設定 OVRCameraRigをHierarchyから選択し、OVRManagerコンポーネントの設定で用途に応じ、手を 使うかコントローラーを使うか設定を行う。
ハンドトラッキング用のOVRHANDPREFABを追加 OVRHandPrefabを検索し、左右の手のアンカーの下に配置する。
OVRHANDPREFABの設定 プレハブが左手設定になって いるので、右手を設定する。
コントローラ用のOVRCONTROLLERPREFABを追加 OVRControllerPrefabを検索し、左右のコントローラーアンカーの下に配置する。
OVRCONTROLLERPREFABの設定 左右のコントローラーにTouchコントローラー を割り当てる。 両手に 実施
URP用マテリアルに変換(UNITY2020-21) メニューのEditから、マテリアルを UpgradeしてURP対応にする。
URP用マテリアルに変換(UNITY2022) WindowからRender Pipeline Convertを開き Material Upgradeをチェックし、Initialize And Convertを押下する。 Convert Assetsを押下する。
Oculus Integration v46とv55で設定内容が異なるため 内容を分けて記載しているのでご注意ください。
INTERACTION SDKを使う INTEGRATION V46
OVRINTERACTIONを追加 OVRInteractionを検索して追加。
OVRINTERACTIONの設定 OVRInteractionに、CameraRigの参照とCameraRigRefを設定する。
INTERACTION SDK側に手の表示をゆだねる Interaction側で手の表示は行うため、両方の手のOVRHnadPrefabの手の表示部分を削除する。 両手に 実施
HANDSとCONTROLLERSの追加 OVRInteractionの下に、OVRControllers、OVRHandsを追加。
OVRCONTROLLERSの設定① OVRControllerDataSourceに参照を設定 両手に 実施
OVRCONTROLLERSの設定② DebugVisualsを非Activeに設定 両手に 実施
OVRHANDSの設定① 両方の手のHandFeeaturesに、World Transformの参照をセット 両手に 実施
OVRHANDSの設定② 両方の手ののOVRHandDataSourceに 両手に 実施
つかむ設定を入れる INTEGRATION V46
コントローラでつかむ① ControllerGrabInteractorを検索し、ControllerInteractorsの配下に追加する。
コントローラでつかむ② 両方の手のControllerGrabInteractorに、Controllerの参照を設定する。 両手に 実施
コントローラでつかむ③ 両方の手のCotrollerInteractorsに、追加したInteractorの参照を設定する。 両手に 実施
ハンドでつかむ① HandGrabInteractorを検索し、HandInteractorsの配下に追加する。
ハンドでつかむ② 両方の手のHandGrabInteractorに、Handの参照を設定する。 両手に 実施
ハンドでつかむ③ 両方の手のHandInteractorsLeft(Right)に、追加したInteractorの参照を設定する。 両手に 実施
INTERACTION SDKを使う INTEGRATION V55
OVRINTERACTIONを追加 OVRInteractionを検索して追加。
OVRINTERACTIONの設定 OVRInteractionに、CameraRigの参照とCameraRigRefを設定する。
INTERACTION SDK側に手の表示をゆだねる Interaction側で手の表示は行うため、両方の手のOVRHnadPrefabの手の表示部分を削除する。 両手に 実施
HANDSとCONTROLLERSの追加 OVRInteractionの下に、OVRControllers、OVRHandsを追加。
つかむ設定を入れる INTEGRATION V55
コントローラでつかむ① ControllerGrabInteractorを検索し、ControllerInteractorsの配下に追加する。
コントローラでつかむ② 両方の手のCotrollerInteractorsに、追加したInteractorの参照を設定する。 両手に 実施
ハンドでつかむ① HandGrabInteractorを検索し、HandInteractorsの配下に追加する。
ハンドでつかむ② 両方の手のHandInteractorsLeft(Right)に、追加したInteractorの参照を設定する。 両手に 実施
つかまれる側
CUBEをつかめるように① Cubeを作成し、RigidBodyを追加。 落ちないようにUse Gravity=True、Is Kinematic=Trueに設定します。
CUBEをつかめるように② Cubeに、One Grab Free TransfomerとGrabbableコンポーネントを追加。 GrabbableコンポーネントにTransfomerを設定。
CUBEを手でつかめるようにする Cubeに、Hand Grab Interactableコンポーネ ントを追加。 Hand Grab Interactableコンポーネントに掴み 位置とRigidbodyを設定。
CUBEをコントローラーでつかめるようにする Cubeに、Grab Interactableコンポーネントを 追加。 Grab Interactableコンポーネントに掴み位置と Rigidbodyを設定。
手でもコントローラでも、Touch手でもつかめるようにするならば、Interactableを複数つければ良 いです。
その他のコンポーネント Grabbable 挙動 Grabbable Transformerと組み合わせてものをつかめるようになります。 Physics Grabbable Grabbableコンポーネントと併用し、物理挙動をもつものをつかめるようになり ます。Rigid Bodyは、Use Gravity=True Is Kinematic=Falseで使います。 Transformaer 挙動 One Hand Free Transformer 片手持ち One Hand Translate Transformer XYZの相対移動範囲を限定できる。 平面上を動かしたりする場合に利用。 One Hand Rotate Transformer 回転軸を固定、回転のPivotと回転範囲を指定でき る。 Two Hand Free Transformer 両手持ち
PHYSICS GRABBABLEの例 右手から左手に渡せるようになっ たり、落下物を空中でつかむこと ができます。キャッチボールでき るということです。
ONE HAND TRANSLATE TRANSFORMERの例 移動可能範囲を設定する場合は、 Constrainにチェックをいれる。 XとZを-30cm~30cmしか移動 できないようにし、Yの移動制限 はなしの場合。
TWO HAND FREE TRANSFORMERの例 両手で握って回転や拡大縮 小させる場合。 拡大縮小に制限を設ける場 合は、 Constrainに値を設 定。
HAND POSEの作り方
握った際に事前にきめたポーズで握る 何かの取っ手の形状に即した形でにぎらせたいなど、にぎり状態での手の形をポーズとして設定するこ とが可能です。OVRHands(手のトラッキング)を使う場合にポーズが有効となります。
POSE RECORDER Hand Grub Pose Recorderか、Hand Grab Pose Live Recorderを使う2通りの方法があります。
ポーズを作成する前準備 mugMeshを検索し、シーン上に配置します。握れるようにGrabbableの設定を追加。
左手のポーズ作成 Hand Grub Pose Recorderをメニューから開きます。 Handと握られる側のRigidBodyを設定します。
ポーズをとって記録します UnityをPlayし、 手で作りたいポーズを演じます。 狙いのポーズがとれたら、Hand Grub Pose RecorderのRecordボタンを押下します。 全部のポーズが記録できたら、Save to Collectionボタンを押下します。
コレクションを読み込む UnityのPlayを停止。 Hand Grub Pose RecorderのLoad From Collectionボタンを押下します。
手のポーズ設定 コップの取っ手の場合だと、親指と人差し指だけでつかめるように、親指と人差し指を固定し他の指は 自由に設定する。
反対の手のポーズの作り方
左右の手の握りポーズを変える① HandGrabInteractableを新規につくりながら、反対の手の作り方を説明します。 Hand Grub Pose Recorderで記録したものがあれば、それをもとに反対の手を作ることも可能です。 空のGameObjectを作成し、HandGrabInteractableを追加。
左右の手の握りポーズを変える② HandGrabInteractableのAdd HandGrabPoseボタンを押下。
左右の手の握りポーズを変える③ Create Mirrored HangGrabInteractableボタンを押下。 ミラーされた右手用のGameObjectの名前を変更する。
左右の手の握りポーズを変える④ 手のポーズとにぎり位置を調整する。ゴーストを操作して手のポーズも手動で変更できる。
左右の手の握りポーズを変える⑤ 親側のコンポーネントは、4つだけで良い。
遠くの物(GAMEOBJECT)を選択する
コントローラーのRAYを使う① ControllerRayInteractorを検索し、ControllerInteractorsの配下に追加する。
コントローラーのRAYを使う② 両方の手のControllerRayInteractorに、Controllerの参照を設定する。 両手に 実施
コントローラーのRAYを使う③ 両方の手のCotrollerInteractorsに、追加したInteractorの参照を設定する。 両手に 実施
コントローラーのRAYを使う④ ControlerRayInteractor配下のTriggerSelectorで、どのボタンとRayを関連づけるかの設定が可能。
コントローラーのRAYを使う⑤ ControlerRayInteractor配下のVisualsでRayの見た目や長さの変更ができる。
ハンドのRAYを使う① HandRayInteractorを検索し、HandInteractorsの配下に追加する。
ハンドのRAYを使う② 両方の手のHandRayInteractorに、Handの参照を設定する。 両手に 実施
ハンドのRAYを使う③ 両方の手のHandInteractorsLeft(Right)に、追加したInteractorの参照を設定する。 両手に 実施
ハンドのRAYを使う④ HandRayInteractor配下のVisualsでRayの見た目の変更ができる。
選択対象のオブジェクトの準備① Cubeを新たに作成し赤色に変更。 RayInteractableとInteractableUnityEventWrapper、ColliderSurfaceコンポーネントを追加しま す。
選択対象のオブジェクトの準備② InteractableUnityEventWrapperに、追加したCubeの参照を設定する。 Collider Surfaceに、追加したCubeの参照を設定する。
選択対象のオブジェクトの準備③ RayInteractableに、追加したSurfaceの参照を設定する。
選択対象のオブジェクトの準備④ InteractableUnityEventWrapperに、 ホバー、アンホバー、セレクトイベント 発生時の処理を追加する。 Objectの参照にCubeを入れて、メッ シュレンダラーのマテリアルで、それぞ れ青、赤(もとの色)、緑をセットする。
POKEでボタン操作
コントローラーのPOKEを使う① ControllerPokeInteractorを検索し、ControllerInteractorsの配下に追加する。
コントローラーのPOKEを使う② 両方の手のControllerPokeInteractorに、Controllerの参照を設定する。 両手に 実施
コントローラーのPOKEを使う③ 両方の手のCotrollerInteractorsに、追加したInteractorの参照を設定する。 両手に 実施
ハンドのPOKEを使う① HandPokeInteractorを検索し、HandInteractorsの配下に追加する。
ハンドのPOKEを使う② 両方の手のHandPokeInteractorに、Handの参照を設定する。 両手に 実施
ハンドのPOKEを使う③ 両方の手のHandInteractorsLeft(Right)に、追加したInteractorの参照を設定する。 両手に 実施
選択対象のオブジェクトの準備① 空のGameObjectを作成しButtonという名前に変更。 Poke InteractableとInteractableDebugVisualコンポーネントを追加します。
選択対象のオブジェクトの準備② 空のGameObjectをButtonの下に作成し名前をProximity Fieldに変更します。 BoxProximityFieldコンポーネントを追加し、Box Transformに自信のTransformをセットします。
選択対象のオブジェクトの準備③ 空のGameObjectをButtonの下に作成し名前をSurfaceに変更します。 PlaneSurfaceコンポーネントを追加し、向きを下向きに変更します。
選択対象のオブジェクトの準備④ 空のGameObjectをButtonの下に作成し名前をVisualに変更します。 Visualの配下にCubeオブジェクトを追加します。Cubeの色を赤に変更します。 VisualにPokeInteractableVisualコンポーネントを追加し、InteractableとSurfaceの参照を設定。
選択対象のオブジェクトの準備⑤ VisualとCubeオブジェクトの高さを変更します。
選択対象のオブジェクトの準備⑥ ButtonオブジェクトのPokeInteractableコンポーネントのProximity FieldとSurafaceに参照を設定 する。
選択対象のオブジェクトの準備⑦ ButtonオブジェクトのInteractableDebugVisualコンポーネントInteractableViewとRendererに参 照を設定する。
選択対象のオブジェクトの準備⑧ 上から押すと、触れると色が青に変わり。押し込むと緑に変わる。 さらに押し込むと、指がボタンにめり込む。
ボタンに指がめり込まないようにする① LeftHandSyntheticとRightHandSyntheticを検索し、それぞれの手の下に追加する。
ボタンに指がめり込まないようにする② LeftHandSyntheticのI Modify Data From Source MonoにLeftHandの参照を設定。 両手に 実施
ボタンに指がめり込まないようにする③ もとからあったVisualを非アクティブに変更する。
ボタンに指がめり込まないようにする④ PokeInteracterのHandPokeLimiterをアク ティブに変更する。
ボタンに指がめり込まないようにする⑤ HandPokeLimiterに、LeftHandSyntheticの参照を設定する。 両手に 実施
CURVED UI作成
CURVED UIの作成① 以下のHierarchyのようにGameObjectを生成 U I /Event System Emp ty GameObject Emp ty GameObject U I /Canvas Emp ty GameObject
CURVED UIの作成② EventSystemのInspector
CURVED UIの作成③ UI CylinderのInspector (Cylinder: Curved UIが表示される物) Cyli nderの位置 Cyli nderのRadius Curved U Iの表示場所:内側、外側 Cyli nderの高さ:0 = 無制限
CURVED UIの作成④ Curved PanelのInspector
CURVED UIの作成⑤ CanvasのInspector U I 選択 ( Childも全部UIで設定) Comp onent追加時、Alertが出たらAuto-Fixを押す W orld Sp ace選択 U I 選択
CURVED UIの作成⑥ MeshのInspector
CURVED UIの作成⑦ Culling Mask設定:UnityのUIは見えないように、全てのCameraのMaskからUIは選択解除
CURVED UIにRAY機能追加
CURVED UIのRAY機能追加① Curved PanelのInspector 追加 追加 追加
DIRECT TOUCH UI作成
DIRECT TOUCH UIの作成① 以下のHierarchyのようにGameObjectを生成 U I /Event System ( 既に存在している場合は、それを使う) Emp ty GameObject Emp ty GameObject U I /Canvas
DIRECT TOUCH UIの作成② EventSystemのInspector
DIRECT TOUCH UIの作成③ Pokeable CanvasのInspector 位置調整
DIRECT TOUCH UIの作成④ Proximity FieldのInspector CA N VASをOverlapするように
DIRECT TOUCH UIの作成⑤ CanvasのInspector De fault選択 ( Childも全部Defaultで設定) W orld Sp ace選択
POSE DETECTION
SHAPE(手の模様) DETECTIONの作成① 指の模様 Curl (参考: Pose Detection | Oculus Developers) Flexion Abduction Opposition
SHAPE(手の模様) DETECTIONの作成② Shapeファイルを作成
SHAPE(手のポーズ) DETECTIONの作成③ Shapeファイルを作成: Bunny模様に合わせて、Shapeを設定する
SHAPE(手の模様) DETECTIONの作成④ 以下のHierarchyのようにGameObjectを生成 Emp ty GameObject Emp ty GameObject 3 D Ob ject/Cube
SHAPE(手の模様) DETECTIONの作成⑤ PosesのInspector
SHAPE(手の模様) DETECTIONの作成⑥ BunnyのInspector 右手 先作成したBunny shape
SHAPE(手の模様) DETECTIONの作成⑦ Debug CubeのInspector (Bunny模様をすると -> Cubeが緑色になるように)
TRANSFORM DETECTIONの作成① Bunnyに、Transform detectionを追加 (Bunny模様 + 手のひらを前にする -> Cubeが緑色になる) 追加 手のひらを前にする時 追加 De fault設定ファイル De tectionが2つ(Shape, Transform)になったため、And条件を設定
PREFAB POSEの利用① RockPose prefabを追加 R oc kPose p refab 右手
PREFAB POSEの利用② Debug CubeのInspector (Rock模様をすると -> Cubeが緑色になるように)
CONTROLLERHANDSの設定
HANDS / CONTROLLER / CONTROLLER HANDS 入力方法と見え方の組み合わせ Prefab名 つかむ/つかまれる OVRHands HandGrabInteractor HandGrabInteractable OVRControllers ControlleGrabInteractor GrabInteractable OVRControllerHands HandGrabInteractor HandGrabInteractable 入力 見え方
CONTROLLERHANDSの設定① 以下のようにHierarchyを変更 (左ControllerHandは右ControllerHandと同様に設定) Pre fab Pre fab A c tive Pre fab A c tive Pre fab
CONTROLLERHANDSの設定② ControllerHandInteractorsのInspector
CONTROLLERHANDSの設定③ HandPokeInteractorのInspector
CONTROLLERHANDSの設定④ HandPokeLimiterのInspector
CONTROLLERHANDSの設定⑤ HandGrabInteractorのInspector
CONTROLLERHANDSの設定⑥ HandGrabAPIのInspector 追加
CONTROLLERHANDSの設定⑦ HandGrabVisualのInspector
CONTROLLERHANDSの設定⑧ HandRayInteractorのInspector
CONTROLLERHANDSの設定⑨ OVRControllerHandDataSourceのInspector
その他
握られているかどうかを判断 自分が握られているかどうか、GrabInteractableのStateを参照できる。
手のコライダー 手の指1本1本にコライダーを自動で付ける。Is Triggerがfalseのコライダーとなるので注意。