MRが楽しい

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

MRTK v2.4.0を使ってHoloLens2で手乗りキャラクターアプリを作成する その2

本日は HoloLens2 のアプリ開発枠です。
本記事では MRTK の機能を使って HoloLens2 で手乗りキャラクターアプリを作成する手順を記事にします。
f:id:bluebirdofoz:20200722001849j:plain

その2は MRTK の機能を使って現実空間の机や床にキャラクターを置けるようにしてみます。

前提条件

前回記事の続きになります。
bluebirdofoz.hatenablog.com

アプリシーンの作成

重力の設定を行う

現実空間の机にキャラクターを置けるようにするため、キャラクターに重力を設定します。
[GameObject]を選択して [Inspector]ビューから[Add Component]をクリックします。
f:id:bluebirdofoz:20200722001908j:plain

[Rigidbody]コンポーネントを設定することで重力の設定が行えます。
[Rigidbody]で検索してコンポーネントを選択して追加します。
f:id:bluebirdofoz:20200722001922j:plain

次に床に着地するための、キャラクターのアタリ判定を設定します。
再び[Inspector]ビューから[Add Component]をクリックします。
f:id:bluebirdofoz:20200722001933j:plain

[Box Collider]コンポーネントを設定することでアタリ判定の設定が行えます。
[Box Collider]で検索してコンポーネントを選択して追加します。
f:id:bluebirdofoz:20200722001945j:plain

キャラクターの形に合わせて[Box Collider]の大きさを調整します。
以下の通り、シーンで大きさを確認しつつ、キャラクターの形状や中心位置に合わせて位置とサイズを調整しました。

Center X:0, Y:0.05, Z:0.025
Size   X:0.1, Y:0.1, Z:0.15

f:id:bluebirdofoz:20200722001957j:plain

これで重力とアタリ判定の設定が行えました。
[再生]ボタンでシーンを再生すると、キャラクターが地面に向かって落ちていくようになります。
f:id:bluebirdofoz:20200722002009j:plain

初期床を作成する

今のままではキャラクターが延々と落ちてしまうので、開始位置に小さな床を配置します。
HoloLens2 は現実空間の机や床を認識することが可能ですが、認識までにタイムラグがあります。
今回はこの床に配置することで認識までの時間を稼ぎ、延々と落下してしまう自体を防ぎます。

Hierarchy から右クリックで [3D Object] -> [Plane]で床オブジェクトを作成します。
f:id:bluebirdofoz:20200722002021j:plain

[Plane]オブジェクトが配置されます。
初期サイズでは大きすぎるので、[Inspector]ビューから Transform を以下の通り変更し、キャラクターの足元に配置しました。

Position X:0.0, Y:-0.1, Z:1.0
Rotation X:0, Y:0, Z:0
Scale X:0.025, Y:0.025, Z:0.025

f:id:bluebirdofoz:20200722002033j:plain

見た目も MRTK が提供するマテリアルを利用してそれらしくしてみます。
Assets フォルダの以下のディレクトリを開き、HolographicBackPlate.mat のマテリアルを探します。
・Assets/MRTK/SDK/Features/UX/Interactable/Materials
f:id:bluebirdofoz:20200722002047j:plain

マテリアルを画面上の Plane オブジェクトにドラッグすると、マテリアルを設定することができます。
以下の通り、見た目が変わりました。
f:id:bluebirdofoz:20200722002100j:plain

この状態で[再生]ボタンをクリックしてシーンを再生してみます。
キャラクターの落下を床で止めることができました。
f:id:bluebirdofoz:20200722002113j:plain

手の検出イベントに合わせて重力の設定を切り替える

キャラクターを安定して手乗りさせるため、手乗りさせているときは重力の設定を切っておく必要があります。
手の検出イベントを利用して、手を検出したら重力の設定を無効化し、手をロストしたら重力の設定を再度有効化してみます。

[GameObject]の[Inspector]ビューを開き、[Hand Constraint Palm Up]コンポーネントを開きます。
f:id:bluebirdofoz:20200722002124j:plain

最初に手を検出した時の重力の無効化イベントを設定します。
[On First hand Detected()]の[+]ボタンをクリックしてイベントを追加します。
f:id:bluebirdofoz:20200722002133j:plain

イベント欄が追加されたら[None(Object)]の項目にイベントを発生させるオブジェクトを指定します。
今回は[GameObject]の[Rigidbody]の変更イベントを起こしたいので、[GameObject]をドラッグします。
f:id:bluebirdofoz:20200722002146j:plain

[GameObject]が設定されたら、プルダウンから[GameObject]の重力の有効無効を切り替えるイベントを指定します。
[Rigidbody] -> [useGravity]を選択します。
f:id:bluebirdofoz:20200722002156j:plain

[Rigidbody.useGravity]のイベントが設定されたら、チェックボックスのチェックを外します。
これで手の検出時に[Rigidbody]の[useGravity]の設定が False になるイベントが設定され、重力が無効化されるようになりました。
f:id:bluebirdofoz:20200722002206j:plain

次に手をロストした時の重力の有効化イベントを設定します。
[On Last Hand Lost()]に同じ手順でイベントを設定し、こちらはチェックボックスのチェックを入れます。
これで手のロスト時に[Rigidbody]の[useGravity]の設定が True になるイベントが設定され、重力が有効化されるようになりました。
f:id:bluebirdofoz:20200722002215j:plain

最後に手乗り時の動きを安定させるため、手を検出中は常に[Rigidbody]を静止状態にしておきます。
[On Hand Active()]に同じ手順で、プルダウンから[Rigidbody.Sleep]のイベントを設定します。
f:id:bluebirdofoz:20200722002225j:plain

これで手の検出中は Sleep が常に呼び出され、Rigidbody が静止状態で居続けます。
f:id:bluebirdofoz:20200722002235j:plain

空間認識の機能を有効化する

次に HoloLens2 で現実空間の机や床を検出するための設定を行います。
Hierarchy から[MixedRealityToolkit]をクリックして[Inspector]ビューを開きます。

[DefaultHoloLens2ConfigureProfile]を利用している場合、デフォルトだと空間認識の機能は無効化されています。
設定を変更するため、[Copy & Customize]をクリックして、新しいカスタムプロファイルを作成します。
f:id:bluebirdofoz:20200722002244j:plain

[Clone Profile]ダイアログが開きます。
作成するコンフィグレーションの名前を[Profile Name]に入力して[Clone]をクリックします。
f:id:bluebirdofoz:20200722002253j:plain

コンフィグレーションの[Spatial Awareness]タブを開き、[Enable Spatial Awareness System]のチェックを入れます。
f:id:bluebirdofoz:20200722002305j:plain

空間認識が有効化され、[DefaultMixedRealitySpatialAwarenessSystemProfile]が設定されます。
本プロファイルは空間認識するとともに、現実空間のメッシュを表示ししてしまうので、今回は見た目の表示だけ無効化します。
プロファイルを変更するため、[Clone]ボタンをクリックして新しいカスタムプロファイルを作成します。
f:id:bluebirdofoz:20200722002315j:plain

[Clone Profile]ダイアログが開きます。
作成するコンフィグレーションの名前を[Profile Name]に入力して[Clone]をクリックします。
f:id:bluebirdofoz:20200722002326j:plain

詳細設定の[Windows Mixed Reality Spatial Mesh Observer]を開きます。
更に[DefaultMixedRealitySpatialAwarenessMeshObserverProfile]を変更するため、[Clone]ボタンをクリックします。
f:id:bluebirdofoz:20200722002339j:plain

[Clone Profile]ダイアログが開きます。
作成するコンフィグレーションの名前を[Profile Name]に入力して[Clone]をクリックします。
f:id:bluebirdofoz:20200722002349j:plain

これで見た目の設定を変更できます。
[Display Option]の項目を[Occlusion]に変更します。
f:id:bluebirdofoz:20200722002402j:plain

これで現実空間のアタリ判定を設定しつつ、見た目のメッシュ表示を無効化できました。
空間認識の機能の設定は完了です。
f:id:bluebirdofoz:20200722002413j:plain

診断ツールを無効化する(オプション)

デフォルトのコンフィグレーション設定を利用していると、アプリの動作時に負荷を計測する診断ツールが常に表示されます。
これを非表示にしたい場合は本項目の手順を行ってみてください。
f:id:bluebirdofoz:20200722002425j:plain

コンフィグレーションの[Diagnostics]タブを開き、[Enable Diagnostics System]のチェックを外します。
これで診断ツールが無効化されます。
f:id:bluebirdofoz:20200722002436j:plain

更にプロファイルを変更することで、他にもハンドメッシュの表示なども切り替えることができます。
以下の記事でこれらを簡単に切り替えるためのパネル操作を説明しています。詳細を知りたい場合は参照してください。
bluebirdofoz.hatenablog.com

アプリケーションのビルドとインストール

これでアプリシーンの全ての実装が完了しました。
後は Unity プロジェクトをビルドして、アプリケーションを HoloLens2 にインストールします。
f:id:bluebirdofoz:20200722002453j:plain

こちらの手順は以下の「その3」記事と同様です。
「Unityでのビルド」と「HoloLens2へのインストール」の項目の手順を実施してください。
bluebirdofoz.hatenablog.com

HoloLens2での動作確認

インストールが完了すると、アプリケーションがデバイス上で起動します。
アプリが起動すると、目の前にキャラクターが現れます。
f:id:bluebirdofoz:20200722002511j:plain

手の平を差し出すと、キャラクターが手の平に乗ります。
手を隠したり、手の平を逆に返したりすると、キャラクターは落下します。
f:id:bluebirdofoz:20200722002521j:plain

空間認識が完了していると、キャラクターをそのまま現実空間の机や床に置くことができます。
f:id:bluebirdofoz:20200722002530j:plain