はじめに
Oculusのハンドトラッキングをいじるときにものを持つということを実装した際に苦戦したためここに記します。
初めて技術系の記事を書くのでご指摘等あればいただきたいです。
完成はこれ
OculusIntegrationを使うために
https://framesynthesis.jp/tech/unity/oculusquest/
この記事が一番まとまってて良いと思います。最初のほうにbuildの方法などあるので見てみるといいと思います。
https://vracademy.jp/blog/oculus-quest2-hand-tracking/
こちらの記事ではハンドトラッキングをする方法が書いてあります。
今回の私の記事から入るなら後者のほうが分かりやすいかも。
参考までに、私の使用機器はoculus Quest2でoculus Linkを使用してデバッグをしています。
ここから制作
今回は右手で剣をつかむことを想定して作ります。
まず適当なシーンを用意します。そのあとにAsste/Oculus/Interaction/Samples/Prefab/InteractionRig.prefab
をシーンにドラッグアンドドロップします。そしたらプレハブ化を解除してください。
次にAsste/Oculus/Interaction/Runtime/Prefabs/HandGrabInteractorを下の画像のように配置します。そしたらプレハブ化を解除してください。
そしたらHandInteractorsRightのInteractor GroupコンポーネントのInteractorにHandGrabInteractorをドラッグアンドドロップして、HandGrabInteractorのHandRefコンポーネントにはRightHandをドラッグアンドドロップしてください。また、HandGrabInteractorにGrabStrengthIndicatorコンポーネントをつけてください。GrabStrengthIndicatorにはこのように2つのスクリプトをアタッチしてください。
これで手側の設定は完了です。
剣の設定
今回は説明にこの剣のアセットを使用します。
https://assetstore.unity.com/packages/3d/props/weapons/long-sword-212082
これをインポートしたらまずSwordという空のオブジェクトを作ります。そしたらそこにRigidBody、Grabbable,PointableUnityEventWrapperを追加して画像のような設定にします。画像には剣のモデルが映っていますが、ないのが正解です。(今回はつかむときの音などをつけないのでPointableUnityEventWrapperはなくてもOK)
そしたら子要素にHandGrabInteractiveという空オブジェクトを追加し、HandGrabInteractable,CylinderSurface,HandGrabPoseのコンポーネントを追加してください。そしたら画像のように手が出ると思いますがパーだと思います。それをいい感じにつかんでそうな感じにします。
まずはtransformのpositionやrotationを用いてそれっぽい位置と回転にします。その次にHandGrabPoseのJointAnglesをいじることで関節を動かせます。が、えぐい量の数字。初めて見たときにこの量に絶望してoverwatch2に逃げました。が、ご安心を。基本zの値を動かせば人間の関節の動く向きに動きます。適当にいじってみてください。私の値はこんな感じになっています。ご参考までに。ちなみにちょっと上のHandednesss: Rightは右手というう意味で、その下のFingersFreedomはFree,Constrained,Lockedの3つがあります。多分後者になるにつれてつかんでいる間指が動きにくく描画されるという意味だと思います。
次にSwordの子要素に空のオブジェクトVisualsを追加します。その子オブジェクトに空のRootというオブジェクト、その子要素に先ほど追加したLongSwordのメッシュを追加します。プレハブのLongSwordの子要素にあるやつです。
これで完了です。OculusLinkなどを用いて確認してみてください!
最後に
まだまだ理解できていない機能がたくさんあるので時間と気分次第で投稿していこうと思います。最後まで見ていただきありがとうございました!