MRが楽しい

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

MRTKの物を掴むオブジェクトマニピュレータに移動や回転の制限を設定する

本日は Blender のアドオン枠です。
MRTK の物を掴むオブジェクトマニピュレータ(ObjectManipulator)に移動や回転の制限を設定する手順を記事にします。
f:id:bluebirdofoz:20201027231721j:plain

MRTKのObjectManipulator

MRTK の ObjectManipulator は、片手か両手を使ってオブジェクトの移動、回転、拡大縮小を行うコンポーネントです。
ObjectManipulator は様々な入力に対応しているため、HoloLens2 の多関節ハンドや HoloLens1 の視線レイとタップ、没入型ヘッドセットのモーションコントローラなどでも機能します。
microsoft.github.io

本記事ではここに Constraint manager を使って移動軸や回転軸の制限を設定してみます。
microsoft.github.io

MRTKのインポート

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

ObjectManipulatorの設定

初めに ObjectManipulator でオブジェクトを操作する場合、対象のオブジェクトにアタリ判定として Collider が設定されている必要があります。
対象のオブジェクトに Collider が設定されていない場合は事前にオブジェクトの形状に合わせて設定しておきます。
f:id:bluebirdofoz:20201027231756j:plain

ObjectManipulator で操作したいオブジェクトに ObjectManipulator コンポーネントを追加します。
f:id:bluebirdofoz:20201027231808j:plain

これで ObjectManipulator コンポーネントの設定は完了です。
f:id:bluebirdofoz:20201027231819j:plain

シーンを再生すると、オブジェクトを手で掴んで操作できます。
f:id:bluebirdofoz:20201027231832j:plain

ただしデフォルト設定では何の制限も設定されていないため、手を捻る操作を行うと、そのままキャラクターが傾くように回転されてしまいます。
f:id:bluebirdofoz:20201027231843j:plain

MRTK のシミュレーション利用方法については以下の記事を参考にしてみてください。
bluebirdofoz.hatenablog.com

ConstraintManagerの設定

今回は、これに ConstraintManager を設定して、キャラクターが常に直立するようにY軸方向にのみ回転する制限を追加します。

例えば ConstraintManager には以下の種類の制限コンポーネントがあります。

MoveAxisConstraint

移動軸に制限を設定します。
例えば、X軸方向、Y軸方向、Z軸方向、それらを組み合わせた方向にのみオブジェクトを移動できるよう制限を設定します。

RotationAxisConstraint

回転軸に制限を設定します。
例えば、X軸方向、Y軸方向、Z軸方向、それらを組み合わせた方向にのみオブジェクトを回転できるよう制限を設定します。

MinMaxScaleConstraint

拡大縮小のサイズに制限を設定します。
拡大縮小サイズの上限、下限を設定します。トランスフォームに関わらず、初期状態のサイズを基準に設定することもできます。

制限に関する詳細は以下のページを参照ください。
microsoft.github.io

回転軸の制限を設定するため、オブジェクトに RotationAxisConstraint コンポーネントを追加します。
f:id:bluebirdofoz:20201027231914j:plain

RotationAxisConstraint では以下の設定が行えます。

Hand Type:利用可能な手の制限(右手、左手)
Proximity Type:利用可能な距離の制限(近距離、遠距離)
Constraint On Rotation:制限する回転軸(X軸、Y軸、Z軸)
Use Local Space For Constraint:オブジェクトローカル軸を利用する

今回はワールド軸のY軸方向のみ回転させるため、X軸とZ軸の回転を制限します。
[Constraint On Rotation]で[X Axis]と[Z Axis]にチェックを入れます。
f:id:bluebirdofoz:20201027231924j:plain

シーンを再生して動作を確認します。
オブジェクトを掴んで手を捻ったとき、オブジェクトがY軸方向にのみ回転すれば成功です。
f:id:bluebirdofoz:20201027231934j:plain