Oculus Integration で照準を定めた遠隔物体を引き寄せて掴む【Distance Grabbable / Distance Grabber】

Oculus Integration を用いて照準を定めた遠隔物体を引き寄せて掴む方法のまとめ.

上のツイートみたいな感じ.

前準備

Oculus Integration をインポート.動作確認時点では 15.0 でした.
Oculus Quest ビルドが出来るように設定を行い,適当に床と掴みたい物体を設置してください.
床にはColliderを,掴みたい物体にはRigidbodyとColliderをアタッチし,最後にOVRPlayerControllerを配置してください.
一応掴みたい物体に重力の影響を与えたい場合はUse Gravityにチェックを入れてください.
また掴みたい物体のCollision DetectionをContinuous Dynamicにすると,プレイヤーが動いていても判定が取りやすくなります.

Collision Detection の詳細

こちらの記事が詳しく書かれております.必見です.

virtualcast.jp

手順

  • DistanceGrabHandLeftをLeftHandAnchorの子に,DistanceGrabHandRightをRightHandAnchorの子に配置.

f:id:xrdnk:20200530231445p:plain

DistanceGrabHandにはDistance Grabberスクリプトがアタッチされてます.
このスクリプトは OVR Grabber を継承してます.

  • Distance Grab 用の Layer を追加します.

f:id:xrdnk:20200530232619p:plain

今回は User Layer 9 に DistanceGrabLayer を追加してます.

  • DistanceGrabHandLeft / DistanceGrabHandRight にアタッチされている Hand と Distance Grabber のパラメタを設定.

DistanceGrabHandLeft

f:id:xrdnk:20200530233741p:plain

DistanceGrabHandRight

f:id:xrdnk:20200530233750p:plain

Distance Grabber の他の各パラメタについては後程詳細を書きます.

  • 掴みたい物体(ここではBroomstick)にDistance Grabbable スクリプトをアタッチ.Layer を DistanceGrabLayer にする.

f:id:xrdnk:20200530234231p:plain

  • 空オブジェクトを掴みたい物体の子として作る.Crosshairと名付ける.これが照準になります.

f:id:xrdnk:20200530235244p:plain

  • Quad オブジェクトを Crosshair の子として2つ作る.Scaleを掴みたい物体に合わせて調節する.

階層構造はこんな感じ.

f:id:xrdnk:20200530234610p:plain

  • 一つ目のQuadオブジェクトを Targeted と名付け,Mesh RendererのMaterials Element 0 に TriangleCursorTargeted を入れる.

f:id:xrdnk:20200530234650p:plain

  • 残りのQuadオブジェクトを Untargeted と名付け,Mesh RendererのMaterials Element 0 に TriangleCursorUntargeted を入れる.

f:id:xrdnk:20200530234658p:plain

  • Crosshair オブジェクトに Grabbable Crosshair スクリプトをアタッチし,Targeted Crosshair に Targetedオブジェクトを,
    Enabled Crosshair に Untargeted オブジェクト を入れる.

f:id:xrdnk:20200530234853p:plain

少し見えづらくて申し訳ないですが,DistanceGrabHandLeft/Right > gripTrans > GrabVolumeCone の範囲内に照準があれば,
引き寄せて掴める判定になります.

f:id:xrdnk:20200531001446p:plain

f:id:xrdnk:20200530235426p:plain

  • 空オブジェクトを作り,TrackingSpaceまたはOVRPlayerControllerの子とします.DistanceGrabManagerと名付けます.
  • Grab Manager スクリプトSphere Collider をアタッチします.Is Trigger にチェックを入れるのを忘れずに!
    この Sphere Collider の Radius が 遠隔物体を引き寄せられる射程距離になります.

f:id:xrdnk:20200530235801p:plain

お疲れ様でした.ここまでできれば完成です.実際にビルドして試してみてください.
上手く行かない場合はコメントをお願いします.