MRが楽しい

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

MRTK 2.5を使ってHoloLens2上でObject3Dフォルダのglbファイルを動的に読み込む その2(アタリ判定と掴み操作の動的追加)

本日は MRTK の調査枠です。
MRTK 2.5を使ってHoloLens2上でObject3Dフォルダのglbファイルを読み込む手順を記事にします。
f:id:bluebirdofoz:20201211220616j:plain

今回は読み込んだ3Dモデルにアタリ判定と掴み操作の機能を追加します。

前提条件

前回記事の続きです。glbファイルの動的読み込みについては以下の記事を参照ください。
bluebirdofoz.hatenablog.com

想定する動作

読み込まれた3Dモデルにコライダーと、MRTKのオブジェクトマニピュレータを追加して、掴んで移動できるようにします。
f:id:bluebirdofoz:20201211220636j:plain

今回、追加するコライダーには Mesh Collider ではなく Box Collider を利用します。
docs.unity3d.com
docs.unity3d.com

Mesh Collider は物体の形状に忠実なアタリ判定を設定しますが、ポリゴン数の多いモデルでは負荷が高くなるためです。
形状のバウンドボックスを取得し、バウンドボックスと同じ大きさの Box Collider を割り当てます。

実装例

前回作成したサンプルシーンをそのまま利用します。
f:id:bluebirdofoz:20201211220704j:plain

GLBLoadTest.cs のスクリプトを以下の通り、修正しました。
階層構造の3Dモデルが読み込まれた場合に対処するため、再帰的に処理を行う関数を追加しています。
・GLBLoadTest.cs

f:id:bluebirdofoz:20201211220718j:plain

以下の部分がアタリ判定とマニピュレータ操作の追加と処理になります。

// メッシュフィルターの存在確認
MeshFilter filter = child.gameObject.GetComponent<MeshFilter>();

if (filter != null)
{
    // メッシュフィルターが存在していた場合はコライダーを追加する
    BoxCollider collider = child.gameObject.AddComponent<BoxCollider>();

    // フィルターのメッシュ情報からバウンドボックスを取得する
    Bounds meshBounds = filter.mesh.bounds;

    // メッシュのバンドボックスに合わせてコライダーの大きさと位置を変更する
    collider.center = meshBounds.center;
    collider.size = meshBounds.size;

    // マニュピレータ操作スクリプトを追加する
    child.gameObject.AddComponent<ObjectManipulator>();

    // 掴み可能スクリプトを追加する
    child.gameObject.AddComponent<NearInteractionGrabbable>();
}

シーンを再生して動作を確認します。
読み込まれた3Dモデルを掴んで操作することができれば成功です。
f:id:bluebirdofoz:20201211220730j:plain