本日は MRTK の小ネタ枠です。
MRTKのObjectManipulatorの近距離(Near)操作を有効化したり遠距離(Far)操作を無効化する方法を記事にします。
ObjectManipulator
片手または両手を使ったオブジェクトの移動、スケール変更、回転を実現するコンポーネントです。
設定を変更することで様々な入力のカスタマイズが可能です。
microsoft.github.io
有志によって日本語訳されたページが以下にあります。
hololabinc.github.io
MRTKのインポート
MRTK のインポート手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com
ObjectManipulatorのアタッチ
片手または両手を使って操作したいオブジェクト(Colliderあり)を選択します。
[Add Component]から[Object Manipulator]を追加します。
オブジェクトに[Object Manipulator]が追加されました。
このとき、同じオブジェクトには自動的に制約事項を管理する[Constraint Manager]が追加されます。
シーンを再生して確認すると、ハンドレイによるオブジェクトの操作が可能になっています。
近距離のグラブ操作を有効化する
掴み操作でオブジェクトを移動できるようにしたい場合は、オブジェクトに[NearInteractionGrabbable]を追加します。
これでオブジェクトに手を突っ込んで掴むという操作が可能になります。
遠距離の操作を無効化する
更にオブジェクトの掴む操作のみを有効とするため、ハンドレイを無効化したい場合は[Allow Far Manipulation]のチェックを外します。
これでハンドレイによる遠距離(Far)操作ではオブジェクトが動かなくなり、掴み操作などの近距離操作のみ可能となります。
Rigidbody設定時の注意点
オブジェクトに Collider だけでなく Rigidbody を設定している場合は[Host Transform]の設定に注意が必要です。
[Host Transform]は操作対象のオブジェクトを指定する設定項目で、デフォルトでは追加したオブジェクト自身を指しています。
こちらは Rigidbody を設定したオブジェクト自体に[Object Manipulator]を追加し、[Host Transform]を自身のオブジェクトに指定した例です。
遠距離(Far)操作も、近距離のグラブ操作も正常に動作します。
[Host Transform]が自身のオブジェクトではない、かつ、対象に Rigidbody が設定されていた場合
次に[Host Transform]を外部オブジェクトに指定した場合を試してみます。
先ほど設定したオブジェクトの[Object Manipulator]は解除しておきます。
大きめのアタリ判定([IsTrigger]を有効化した[Collider])を設定した別のコントロール用オブジェクトを作成します。
[Object Manipulator]を追加します。
[Host Transform]には、先ほど Rigidbody を設定したオブジェクトを指定します。
掴み操作も試したいのでコントロール用オブジェクトに[NearInteractionGrabbable]も追加しておきます。
この状態でシーンを再生して動作を確認します。
[Host Transform]が自身のオブジェクトではない、かつ、Rigidbody が設定されていた場合、ハンドレイによる遠距離(Far)操作を行うことはできません。
ただしこの場合でも掴みによる操作は可能です。
操作対象のオブジェクトに Rigidbody を設定する場合には注意が必要です。