本日は HoloLens2 のアプリ開発枠です。
本記事では MRTK の機能を使って HoloLens2 で手乗りキャラクターアプリを作成する手順を記事にします。
その2は MRTK の機能を使って現実空間の机や床にキャラクターを置けるようにしてみます。
前提条件
前回記事の続きになります。
bluebirdofoz.hatenablog.com
アプリシーンの作成
重力の設定を行う
現実空間の机にキャラクターを置けるようにするため、キャラクターに重力を設定します。
[GameObject]を選択して [Inspector]ビューから[Add Component]をクリックします。
[Rigidbody]コンポーネントを設定することで重力の設定が行えます。
[Rigidbody]で検索してコンポーネントを選択して追加します。
次に床に着地するための、キャラクターのアタリ判定を設定します。
再び[Inspector]ビューから[Add Component]をクリックします。
[Box Collider]コンポーネントを設定することでアタリ判定の設定が行えます。
[Box Collider]で検索してコンポーネントを選択して追加します。
キャラクターの形に合わせて[Box Collider]の大きさを調整します。
以下の通り、シーンで大きさを確認しつつ、キャラクターの形状や中心位置に合わせて位置とサイズを調整しました。
Center X:0, Y:0.05, Z:0.025 Size X:0.1, Y:0.1, Z:0.15
これで重力とアタリ判定の設定が行えました。
[再生]ボタンでシーンを再生すると、キャラクターが地面に向かって落ちていくようになります。
初期床を作成する
今のままではキャラクターが延々と落ちてしまうので、開始位置に小さな床を配置します。
HoloLens2 は現実空間の机や床を認識することが可能ですが、認識までにタイムラグがあります。
今回はこの床に配置することで認識までの時間を稼ぎ、延々と落下してしまう自体を防ぎます。
Hierarchy から右クリックで [3D Object] -> [Plane]で床オブジェクトを作成します。
[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
見た目も MRTK が提供するマテリアルを利用してそれらしくしてみます。
Assets フォルダの以下のディレクトリを開き、HolographicBackPlate.mat のマテリアルを探します。
・Assets/MRTK/SDK/Features/UX/Interactable/Materials
マテリアルを画面上の Plane オブジェクトにドラッグすると、マテリアルを設定することができます。
以下の通り、見た目が変わりました。
この状態で[再生]ボタンをクリックしてシーンを再生してみます。
キャラクターの落下を床で止めることができました。
手の検出イベントに合わせて重力の設定を切り替える
キャラクターを安定して手乗りさせるため、手乗りさせているときは重力の設定を切っておく必要があります。
手の検出イベントを利用して、手を検出したら重力の設定を無効化し、手をロストしたら重力の設定を再度有効化してみます。
[GameObject]の[Inspector]ビューを開き、[Hand Constraint Palm Up]コンポーネントを開きます。
最初に手を検出した時の重力の無効化イベントを設定します。
[On First hand Detected()]の[+]ボタンをクリックしてイベントを追加します。
イベント欄が追加されたら[None(Object)]の項目にイベントを発生させるオブジェクトを指定します。
今回は[GameObject]の[Rigidbody]の変更イベントを起こしたいので、[GameObject]をドラッグします。
[GameObject]が設定されたら、プルダウンから[GameObject]の重力の有効無効を切り替えるイベントを指定します。
[Rigidbody] -> [useGravity]を選択します。
[Rigidbody.useGravity]のイベントが設定されたら、チェックボックスのチェックを外します。
これで手の検出時に[Rigidbody]の[useGravity]の設定が False になるイベントが設定され、重力が無効化されるようになりました。
次に手をロストした時の重力の有効化イベントを設定します。
[On Last Hand Lost()]に同じ手順でイベントを設定し、こちらはチェックボックスのチェックを入れます。
これで手のロスト時に[Rigidbody]の[useGravity]の設定が True になるイベントが設定され、重力が有効化されるようになりました。
最後に手乗り時の動きを安定させるため、手を検出中は常に[Rigidbody]を静止状態にしておきます。
[On Hand Active()]に同じ手順で、プルダウンから[Rigidbody.Sleep]のイベントを設定します。
これで手の検出中は Sleep が常に呼び出され、Rigidbody が静止状態で居続けます。
空間認識の機能を有効化する
次に HoloLens2 で現実空間の机や床を検出するための設定を行います。
Hierarchy から[MixedRealityToolkit]をクリックして[Inspector]ビューを開きます。
[DefaultHoloLens2ConfigureProfile]を利用している場合、デフォルトだと空間認識の機能は無効化されています。
設定を変更するため、[Copy & Customize]をクリックして、新しいカスタムプロファイルを作成します。
[Clone Profile]ダイアログが開きます。
作成するコンフィグレーションの名前を[Profile Name]に入力して[Clone]をクリックします。
コンフィグレーションの[Spatial Awareness]タブを開き、[Enable Spatial Awareness System]のチェックを入れます。
空間認識が有効化され、[DefaultMixedRealitySpatialAwarenessSystemProfile]が設定されます。
本プロファイルは空間認識するとともに、現実空間のメッシュを表示ししてしまうので、今回は見た目の表示だけ無効化します。
プロファイルを変更するため、[Clone]ボタンをクリックして新しいカスタムプロファイルを作成します。
[Clone Profile]ダイアログが開きます。
作成するコンフィグレーションの名前を[Profile Name]に入力して[Clone]をクリックします。
詳細設定の[Windows Mixed Reality Spatial Mesh Observer]を開きます。
更に[DefaultMixedRealitySpatialAwarenessMeshObserverProfile]を変更するため、[Clone]ボタンをクリックします。
[Clone Profile]ダイアログが開きます。
作成するコンフィグレーションの名前を[Profile Name]に入力して[Clone]をクリックします。
これで見た目の設定を変更できます。
[Display Option]の項目を[Occlusion]に変更します。
これで現実空間のアタリ判定を設定しつつ、見た目のメッシュ表示を無効化できました。
空間認識の機能の設定は完了です。
診断ツールを無効化する(オプション)
デフォルトのコンフィグレーション設定を利用していると、アプリの動作時に負荷を計測する診断ツールが常に表示されます。
これを非表示にしたい場合は本項目の手順を行ってみてください。
コンフィグレーションの[Diagnostics]タブを開き、[Enable Diagnostics System]のチェックを外します。
これで診断ツールが無効化されます。
更にプロファイルを変更することで、他にもハンドメッシュの表示なども切り替えることができます。
以下の記事でこれらを簡単に切り替えるためのパネル操作を説明しています。詳細を知りたい場合は参照してください。
bluebirdofoz.hatenablog.com
アプリケーションのビルドとインストール
これでアプリシーンの全ての実装が完了しました。
後は Unity プロジェクトをビルドして、アプリケーションを HoloLens2 にインストールします。
こちらの手順は以下の「その3」記事と同様です。
「Unityでのビルド」と「HoloLens2へのインストール」の項目の手順を実施してください。
bluebirdofoz.hatenablog.com