MRが楽しい

MRやVRについて学習したことを書き残す

MRTKのObjectManipulatorの近距離(Near)操作を有効化したり遠距離(Far)操作を無効化する

本日は MRTK の小ネタ枠です。
MRTKのObjectManipulatorの近距離(Near)操作を有効化したり遠距離(Far)操作を無効化する方法を記事にします。
f:id:bluebirdofoz:20210301093551j:plain

ObjectManipulator

片手または両手を使ったオブジェクトの移動、スケール変更、回転を実現するコンポーネントです。
設定を変更することで様々な入力のカスタマイズが可能です。
microsoft.github.io

有志によって日本語訳されたページが以下にあります。
hololabinc.github.io

MRTKのインポート

MRTK のインポート手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

ObjectManipulatorのアタッチ

片手または両手を使って操作したいオブジェクト(Colliderあり)を選択します。
[Add Component]から[Object Manipulator]を追加します。
f:id:bluebirdofoz:20210301093827j:plain

オブジェクトに[Object Manipulator]が追加されました。
このとき、同じオブジェクトには自動的に制約事項を管理する[Constraint Manager]が追加されます。
f:id:bluebirdofoz:20210301093837j:plain

シーンを再生して確認すると、ハンドレイによるオブジェクトの操作が可能になっています。
f:id:bluebirdofoz:20210301093847j:plain

近距離のグラブ操作を有効化する

掴み操作でオブジェクトを移動できるようにしたい場合は、オブジェクトに[NearInteractionGrabbable]を追加します。
f:id:bluebirdofoz:20210301093857j:plain

これでオブジェクトに手を突っ込んで掴むという操作が可能になります。
f:id:bluebirdofoz:20210301093909j:plain

遠距離の操作を無効化する

更にオブジェクトの掴む操作のみを有効とするため、ハンドレイを無効化したい場合は[Allow Far Manipulation]のチェックを外します。
f:id:bluebirdofoz:20210301093921j:plain

これでハンドレイによる遠距離(Far)操作ではオブジェクトが動かなくなり、掴み操作などの近距離操作のみ可能となります。
f:id:bluebirdofoz:20210301093945j:plain

Rigidbody設定時の注意点

オブジェクトに Collider だけでなく Rigidbody を設定している場合は[Host Transform]の設定に注意が必要です。
f:id:bluebirdofoz:20210301094009j:plain

[Host Transform]は操作対象のオブジェクトを指定する設定項目で、デフォルトでは追加したオブジェクト自身を指しています。
f:id:bluebirdofoz:20210301094019j:plain

こちらは Rigidbody を設定したオブジェクト自体に[Object Manipulator]を追加し、[Host Transform]を自身のオブジェクトに指定した例です。
遠距離(Far)操作も、近距離のグラブ操作も正常に動作します。
f:id:bluebirdofoz:20210301094030j:plain

[Host Transform]が自身のオブジェクトではない、かつ、対象に Rigidbody が設定されていた場合

次に[Host Transform]を外部オブジェクトに指定した場合を試してみます。
先ほど設定したオブジェクトの[Object Manipulator]は解除しておきます。
f:id:bluebirdofoz:20210301094040j:plain

大きめのアタリ判定([IsTrigger]を有効化した[Collider])を設定した別のコントロール用オブジェクトを作成します。
f:id:bluebirdofoz:20210301094052j:plain

[Object Manipulator]を追加します。
[Host Transform]には、先ほど Rigidbody を設定したオブジェクトを指定します。
f:id:bluebirdofoz:20210301094102j:plain

掴み操作も試したいのでコントロール用オブジェクトに[NearInteractionGrabbable]も追加しておきます。
f:id:bluebirdofoz:20210301094111j:plain

この状態でシーンを再生して動作を確認します。
[Host Transform]が自身のオブジェクトではない、かつ、Rigidbody が設定されていた場合、ハンドレイによる遠距離(Far)操作を行うことはできません。
f:id:bluebirdofoz:20210301094120j:plain

ただしこの場合でも掴みによる操作は可能です。
操作対象のオブジェクトに Rigidbody を設定する場合には注意が必要です。
f:id:bluebirdofoz:20210301094130j:plain