MRが楽しい

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

MRTKのSurfaceMagnetismを使って視線やハンドレイの衝突位置にオブジェクトを表示する

本日は MRTK の小ネタ枠です。
MRTKのSurfaceMagnetismを使って視線やハンドレイの衝突位置にオブジェクトを表示する手順を記事にします。
f:id:bluebirdofoz:20210129225150j:plain

SurfaceMagnetism

SurfaceMagnetism は MRTK の Solver 機能に含まれるコンポーネントです。
レイキャストとレイヤーマスクの表面が接触したポイントに基づきオブジェクトが追従します。
microsoft.github.io
microsoft.github.io

MRTKのインポート

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

設定手順

サンプルシーンとして衝突用の壁と床オブジェクトを配置したシーンを用意しました。
f:id:bluebirdofoz:20210129225224j:plain

衝突位置が分かりやすいようポインタとして Cube オブジェクトを追加します。
f:id:bluebirdofoz:20210129225237j:plain

この Cube オブジェクトに SurfaceMagnetism コンポーネントを追加します。
オブジェクトの Inspector ビューを開き、[Add Component]で[SurfaceMagnetism]を検索すると、検索結果に表示されます。
f:id:bluebirdofoz:20210129225247j:plain

これで SurfaceMagnetism コンポーネントを設定できました。
Solver の共通コンポーネントである[SolverHandler]と[SurfaceMagnetism]が追加されます。
f:id:bluebirdofoz:20210129225301j:plain

Tips

SurfaceMagnetism を追加したオブジェクトまたは子オブジェクトに Collider が設定されていると、以下の警告文が表示されます。
f:id:bluebirdofoz:20210129225312j:plain

これはポインタとなっているオブジェクト自体の表面にレイキャストが当たってしまい、意図しない動作となるためです。
Collider を全て削除すると、警告文は表示されなくなります。
f:id:bluebirdofoz:20210129225322j:plain

設定項目

コンポーネントはそれぞれ以下の設定項目を持ちます。
・SolverHandler

Tracked Target Type:頭や手などトラッキングする対象を設定します。
Additional Offset:トラッキング対象からのオフセット座標を設定します。
Additional Rotation:トラッキング対象からのオフセット回転を設定します。
Update Solvers:有効な場合、フレームごとにSolverUpdate()を呼び出します。

・SurfaceMagnetism

Update Linked Transform:有効な場合、位置と方向は計算されますが適用されません。
Move Lerp Time:移動に対する遅延時間を設定します。
Rotate Lerp Time:回転に対する遅延時間を設定します。
Scale Lerp Time:拡縮に対する遅延時間を設定します。
MaintainScale:有効な場合、ローカルスケールを使用します。
Smoothing:有効な場合、遅延時間に応じてトランスフォームがスムーズに変化します。
LifeTime:有効期限を設定します。0で無制限に動作します。
Surface Normal Offset:表面から法線方向に指定した距離分だけ浮かせます。
Surface Ray Offset:表面からレイキャストの原点方向に指定した距離分だけ浮かせます。
Orientation Mode:回転のタイプを指定します。
(None:回転は変更されません。TrackedTarget:追跡対象のトランスフォームに基づいて回転します。SurfaceNormal:追跡表面の法線に基づいて回転します。Blended:追跡対象のトランスフォームと表面の法線に基づいて回転します)
Keep Orientation Vertical:有効な場合、Orientation Modeに関わらず、オブジェクトを垂直に保ちます。
Magnetic Suface:接触判定を行うレイヤーマスクの指定と優先度を設定します。
Closest Distance:オブジェクトとの最短距離を指定します。
Max Raycast Distance:レイキャストと表面の接触をチェックする最大距離を指定します。
Current Raycast Direction Mode:レイキャストの方向タイプを設定します。
Raycast Mode:レイキャストの形状を設定します。

microsoft.github.io
microsoft.github.io

今回は頭部目線の方向に、接触位置ピッタリの位置にポインタを表示します。
[Tracked Target Type]を[Head]に、[Surface Normal Offset]の値を[0]に変更しました。
f:id:bluebirdofoz:20210129225333j:plain

動作確認

シーンを再生して動作を確認します。
f:id:bluebirdofoz:20210129225342j:plain

Cube オブジェクトが頭部方向の先の壁や床の接触面に追従すれば成功です。
f:id:bluebirdofoz:20210129225352j:plain