夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ゼロから学ぶHoloLens 初心者向けチュートリアル HoloLensの五大要素を学ぶ 空間認識 その①

本日はチュートリアル枠です。

今回自分が3年前HoloLens に初めて触れ右も左もわからない中開発を行った頃の自分に向けてチュートリアルを作成します。

〇HoloLensへアプリをデプロイしよう!

今回はHoloLensアプリ開発環境を1から構築することを目的とします。 下のようなテーマで書いていこうと思います。

1.Unityの環境を構築しよう!

2.MRTKを使おう!MRTKとは何か?

    UnityEditorでMRTKを使おう

    アプリをUnityからビルドしよう。

    HoloLens実機にデプロイしよう

3.HoloLensの5大要素を学ぶ

    ・空間認識機能を実装する。←

4.応用編

〇環境

・Unity2019.4.18f1(LTS)

・VisualStudio2019

●筆者PC環境

 ・OS:Windows10 Pro

 ・プロセッサ:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz 3.50 GHz

 GPU:NVIDIA GoForceRTX 3080

 Microsoft HoloLens 1st

Microsoft HoloLens 2

 スペックに関しては高いほうが良いですが、HoloLensアプリ開発の場合VRと比べ求められるスペックは低いです。

 VRアプリ開発の場合PC自体がVRReady(VRゲームを実行できる環境)であることがほぼ必須ですが、HoloLensの場合VRReadyではなくても開発自体はできます。

 Unityが動くスペックであれば最低限問題ないです。

〇空間認識を使う

[空間認識(SpatialAwareness)]はHoloLensのMixedRealityを実現するうえで最も重要な要素です。

HoloLensの前面に内蔵された赤外線カメラによって周囲の物理環境をスキャン、メッシュ化し、アプリ内で使用できます。

これによってHoloLensでは現実の壁に穴をあける表現や壁の奥にあるオブジェクトが現実のそれと同じく見えなくなるといった表現が可能になります。

〇MRTKで空間認識を実装する

空間認識などのデバイス固有の基本機能は[MixedRealityToolkit]オブジェクトの[MixedRealityToolkit]コンポーネントで管理されています。

①Unityのhierarchyウィンドウから[MixedRealityToolkit]オブジェクトを選択し、インスペクターウィンドウに[MixedRealityToolkit]を表示させます。

f:id:Holomoto-Sumire:20210603075617j:plain

②[SpatialAwareness]のタブが空間認識の設定になりますが、初期状態では内部の設定を変更することができません。

f:id:Holomoto-Sumire:20210603080219j:plain

これはMRTKで最初から提供されているProfileは編集不能のためです。各開発者はこれら最初から提供されているテンプレートをもとに各自でカスタマイズする必要があります。

③MRTKのProfileを画像のように[Clone]を選択し、複製します。

f:id:Holomoto-Sumire:20210603080534j:plain

④複製したProfileでは任意の名前を付けることができます。

f:id:Holomoto-Sumire:20210603080857j:plain

⑤[EnableSpatialAwareness]にチェックを入れ有効化します。

f:id:Holomoto-Sumire:20210603081514j:plain

これによって空間認識が使用できるようになりました。

この状態でデプロイします。

アプリ起動時にSpatialAwarenessでスキャンした空間がメッシュとして表示されます。

youtu.be

以上でSpatialAwarenessの実装が終わりました。

次にSpatialAwarenessの物理挙動を確認するためにCubeを配置してみます。

⑥hierarchyウィンドウで右クリックをし[Cube]を選択、配置します。

f:id:Holomoto-Sumire:20210603201252j:plain

⑦Cubeを選択した状態でインスペクターウィンドウのTransformを次の画像のように設定します。

f:id:Holomoto-Sumire:20210603201414j:plain

これはCubeの座標をアプリ起動位置から80cm先、大きさが10cmの立方体という意味になります。

⑧[Cube]に[Rigidbody]コンポーネントを加えます。これはCubeに重力を与えます。

f:id:Holomoto-Sumire:20210603201722j:plain

 これで実行するとCubeが地面に落ちるという実装ができました。しかしSpatialAwarenessで張られるSpatialMeshはアプリ起動後に動的にスキャン、作成されるため現状ではMeshが作成される前にCubeが落ちてしまいます。

⑧プロジェクトウィンドウを右クリック、新規のC#スクリプトを作成し[Drop]と名付けます。

f:id:Holomoto-Sumire:20210603202031j:plain

⑨作成した[Drop]をダブルクリックしエディタで次のようにコードを記入します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Drop : MonoBehaviour
{
    [SerializeField]
    Rigidbody rb;
    
    void Awake()
    {
        StartCoroutine(Dropdown());
    }

    IEnumerator Dropdown()
    {
        //10秒間処理を待つ
        yield return new WaitForSeconds(10);
        rb.useGravity = true;
    }

   
}

⑩CubeにDropコンポーネントをアタッチしてCubeのRidigoBodyをDropコンポーネントにアタッチします。

f:id:Holomoto-Sumire:20210603203124j:plain

⑪次にRigidBodyの[use gravity]のチェックを外し重力を無効化します。

f:id:Holomoto-Sumire:20210603203357j:plain

これによって10秒後に重力が有効になるようになりました。

実機で確認します。

youtu.be

Cubeが地面に落ちることを確認しました。以上でHoloLensの空間認識機能が正しく使用できるようになりました。