見出し画像

XR Interaction Toolkitで物を直接掴む

仮想空間上の物体にコントローラーを近づけて、直接掴めるようにします。前回と同様に掴まれる物体には、XR Grab Interacableコンポーネントを設定し、コントローラーには直接掴めるようにする為のXR Direct Interactorコンポーネントを設定します。
さらに、コントローラーに対して物体に接触している事を判定する為にコライダーを設定し、物体と接触している事が見た目で分かるようにモデルを設定します。

環境

Unityバージョン:2020.3.12f1
XR Interaction Toolkit:1.0.0-pre.4
Oculus Quest2: v29 ソフトウェア (※)

※Oculus Quest2のテスト機能である「VRにデスクを持ち込もう」を有効にしていると自作プログラムが動作しませんでした。
回避方法はあると思いますが、確認できていません。

プロジェクトの作成及び設定

以前の記事「XR Interaction Toolkitで移動する - プロジェクトの作成及び設定」を参考にしてください。

画像1

プログラムの作成

■VR用カメラと床の作成
前回の記事「XR Interaction Toolkitで指定した物を掴む - プログラムの作成」の「VR用カメラの作成」、「床の作成」を参考にしてください。

画像2

■掴む物体の作成
コントローラーに接触させる必要があるので、掴みやすいように掴む物体をテーブルに並べます。
[テーブルの作成]
Hierarchyビューを右クリックして表示されるコンテキストメニューから3D Object > Cubeを選択します。作成されたCubeの名称を「Table」に変更し、InspectorビューのTransformコンポーネントのPositionのYを「0.5」、Zを「0.7」に設定、ScaleのXを「2」に設定します。

画像3

[掴む物体の作成及び設定]
前回の記事「XR Interaction Toolkitで指定した物を掴む - プログラムの作成」の「掴む物体を作成」、「掴む物体へXR Grab Interacableコンポーネントの設定」を参考にしてください。
但し、作成する正六面体と球と円柱のTransformコンポーネントのPositionは、テーブルの上に並べるために以下の値を設定します。
・正六面体:Xを「0」、Yを「1.2」、Zを「0.4」
・球:Xを「0.4」、Yを「1.2」、Zを「0.4」
・円柱:Xを「-0.4」、Yを「1.4」、Zを「0.4」

画像4

■Input Action Managerの作成とコントローラーの設定
Input Action Managerの作成とコントローラーへのアクションのマッピング情報の設定は、以前の記事「XR Interaction Toolkitで移動する - プログラムの作成」の「Input Action Managerの作成」「コントローラーの設定」を参考にしてください。

画像5

■コントローラーモデルの表示
以前の記事「XR Interaction Toolkitでコントローラーを表示する」を参考にして、コントローラーにモデルを設定します。
プレハブ内のHandControllerとSphereのTransformコンポーネントのPositionは、X、Y、Zが全て「0」になっている事を確認してください。「0」でない場合は、コントローラーの位置とモデルの表示位置に差が発生する事になります。

画像10

画像11

画像6

■コントローラーへXR Direct Interactorの設定
XR Rigのコントローラーには、デフォルトでXR Ray Interactorコンポーネントが設定されています。これが設定されていると、XR Direct Interactorコンポーネントと競合する為、XR Ray Interactorコンポーネントを削除します。また、赤い線(Ray Line)に関するコンポーネントも不要なので、削除します。ここでは、XR Ray Interactorコンポーネントとの動きの差を見る為、右のコントローラーだけXR Direct Interactorコンポーネントを設定します。
[不要なコンポーネントの削除]
HierarchyビューのXR Rig > Camera Offset > RightHand Controllerを選択し、Inspectorビューにある以下のコンポーネントを外します。
・XR Ray Interactor
・XR Interactor Line Visual
・Line Renderer (※)
コンポーネントを外すには、コンポーネントのタイトルの一番右にあるメニューボタンよりRemove Componentを選択します。
※XR Interactor Line Visualコンポーネントが残っていると削除する時にエラーダイアログが表示されます。XR Interactor Line Visualコンポーネントから削除してください。

画像7

[XR Direct Interactorコンポーネントの追加]
Inspectorビューの「Add Component」ボタンからXR Direct Interactorコンポーネントを追加します。

画像8

■コントローラーへコライダーの設定
コントローラーとの接触判定を行う必要があるので、コライダーコンポーネントを設定します。コントローラーのモデルが、球(Sphere)なので同じ形のSphere Colliderを設定します。コライダーの範囲は、設定されているオブジェクトのTransformコンポーネントに依存する為、コントローラーの大きさもモデルと同じ大きさに設定します。
HierarchyビューのXR Rig > Camera Offset > RightHand Controllerを選択し、Inspectorビューの「Add Component」ボタンからSphere Colliderコンポーネントを追加します。
追加したSphere ColliderコンポーネントのIs Triggerにチェックを入れます。Is Triggerにチェックを入れる事で、接触判定のイベントを処理することができるようになります。
InspectorビューのTransformコンポーネントのScaleのX、Y、Zを0.1にします。

画像9

実行

保存(File > Save)してから、Oculus Quest2が接続されている事を確認し、Build And Run(File > Build And Run)を実行します。
コンパイルが開始され、コンパイル終了後に接続されているOculus Quest2にプログラムが自動転送され実行されます。
目の前にテーブルがあり、その上に左から円柱、正六面体、球が並んでいます。
右のコントローラーをどれかに接触させて、グリップを押下すると掴む事ができます。グリップの押下を止めると放します。
左のコントローラーは、前回と同様にコントローラーの先から伸びている赤い線を物体に当て選択した物をグリップで掴む事ができます。

終わりに

前回のような遠方にある物体を操作するのではなく、今回のようにコントローラーに接触した物体を操作すると、より現実に近い感覚を得られます。しかし、仮想空間上の近くの物体しか操作できません。コックピットのような閉鎖空間で周りの機器を操作するといったシチュエーションや、移動と合わせて地面やテーブルなどの上にある物を取り上げるようなシチュエーションで使用するのが適切なように思われます。

将来の自分への備忘録、ついでに誰かの何かのきっかけになれば幸いです。



いいなと思ったら応援しよう!