はじめに
Microsoft Build 2021 の Keynote で Metaverse ( メタバース ) の事例が紹介されたり、MS Learn : Azure Digital Twins と Unity を使用して Mixed Reality デジタルツインを構築する ハンズオンセッションがあったりと、Mixed Reality と他の技術要素 ( IoT, Digital Twins etc.. ) を掛け合わせたシステム構成が今後 Mixed Reality を実装していく中でも非常に重要だと感じたので、MS Learn ラーニングパスを活用して学習をしてみたいと思います。
[Connect IoT data to HoloLens 2 with Azure Digital Twins and Unity](https://mybuild.microsoft.com/sessions/815a692f-398b-4772-ac18-c021f5116757?source=schedule) ー Microsoft Build 2021 ( 日本時間 : 5月27日 午前7時~午前8時15分 )
※基本的な手順は MS Learn に記載されているので、本記事では作業を進める中での注意点や補足情報などを共有することに重点をおいています。
Metaverse とは!?
Microsoft Build 2021 キーノート内で Microsoft CEO のサティア・ナデラ氏が AB InBev (ベルギーに本社がある多国籍企業) の Metaverse 実装事例を紹介していましたが、詳しい内容が「Building Digital Twins, Mixed Reality and Metaverse App」で解説されていたので、こちらも少しご紹介したいと思います。
Building Digital Twins, Mixed Reality and Metaverse Apps
ー Microsoft Build 2021 ( 日本時間 : 5月27日 午前6時~午前6時30分 )
meta (接頭語) + verse (語幹) の造語。 直訳すると__「より包括的な宇宙」__となり、Physical World (物理世界) の上に、多層のレイヤーからなる Digital Reality (デジタルリアリティ) を重ねた世界概念を指します。この言葉が初めて使用されたのは、1992年アメリカのSF小説「Snow Crash」と言われています。Mixed Reality は 1994年に初めて定義されたので ( 現在、Microsoftが提唱している MR の定義とは少し異なる )、30年前に人々が考えていた未来が少しづつ実現可能性の高い現実になっていることが感慨深いですね。
本記事内で紹介するラーニングパス
- Set up a mixed reality project for Azure Digital Twins in Unity
- Build a 3D Scene for mixed reality in unity
- Configure 3D assets for mixed reality in Unity
- Connect IoT data to HoloLens 2 with Azure Digital Twin and Unity
※ 2021/05/31 現在、こちらの学習モジュールは英語版のみとなっています。
本記事の検証環境
- Microsoft HoloLens 2
- OSビルド : 20346.1002 (21H1)
- Windows 10 PC
- OSビルド : 19042.985
- Windows 10 SDK : 10.0.19041.0
- Unity : 2020.3.8f1 (LTS)
-
Visual Studio 2019 : Version 16.10.0
Universal Windows Platform (UWP) Workload インストール済み - Microsoft Mixed Reality Feature Tool : v1.0.2104.3 Beta
- Mixed Reality Toolkit v2.6.1
- Microsoft Azure アカウント
- Bing Maps 開発者アカウント
- Azure CLI インストール済み
※ このラーニングパスを実行する際の前提条件は、こちら をご確認ください。これ以降の手順は、ソフトウェア、ライブラリのバージョンが MS Learn 公式サイトに記載されているものと異なりますので、ご留意の上、お読みいただけますと幸いです。
Azure Digital Twins と Unity を使用して Mixed Reality デジタル ツインを構築する
1. Unity で Azure Digital Twins のためのプロジェクトをセットアップする (35分)
1.GitHub より ZIPフォルダ をダウンロードする
2.Unity Hub より Unity 2020.3.8f1 をインストールする (任意)
3.Mixed Reality Feature Tool ( MixedRealityFeatureTool.exe ) を開く
【 補足 】 Mixed Reality Feature Tool の仕組み
Mixed Reality Feature Tool は Mixed Reality アプリケーション開発に必要なパッケージを検索することができ、既存プロジェクトへパッケージをインポートする際に、バリデーションや圧縮ファイルのダウンロード、manifest.json の更新などをサポートしてくれるツールです。

4.Mixed Reality Feature Tool で Project Path を指定する
※1.で落としてきた Unity-Project フォルダを指定

5.[Discover Features] ボタンを押す
6.提供された Unity プロジェクトと互換性のあるバージョンを指定する
- Mixed Reality Toolkit Extensions 2.5.4
- Mixed Reality Toolkit Foundation 2.5.4
- Mixed Reality Toolkit GPU Stats 1.0.3
- Mixed Reality Toolkit Plane Finding 1.0.0
- Mixed Reality Toolkit Standard Assets 2.5.4
- Mixed Reality Open XR Plugin 0.1.3
- Microsoft Spatializer 1.0176
- Mixed Reality Input 0.9.2006

8.Get Features ボタンを押す
9.Validation ボタンを押し、エラーが無ければ Import ボタンを押す

10.変更点の承認が要求されるので Approve ボタンを押す

11.次の画面が表示されれば、インストール作業は完了です

( Mixed Reality Feature Tool のバージョンを更新したら.. )
筆者の環境ではメモリを読み込むことが出来ませんでしたのエラーメッセージと共に、Mixed Reality Feature Tool が強制終了するようになってしまいました。ただ、GitHub から Clone してきたプロジェクトには既に Mixed Reality Toolkit v2.6.1 等、必要なライブラリの圧縮ファイル (xxx.tgz) が含まれており、manifest.json から PJルート/Packages/MixedReality 配下のファイルを指定する記載があるので、こちらのライブラリ等を使用して進めることにしました。
本記事で使用したパッケージ ( 一覧 )
- Mixed Reality Toolkit Extensions 2.6.1
- Mixed Reality Toolkit Foundation 2.6.1
- Mixed Reality Toolkit GPU Stats 1.0.3
- Mixed Reality Toolkit Plane Finding 1.0.0
- Mixed Reality Toolkit Standard Assets 2.6.1
- Mixed Reality Open XR Plugin 0.9.3
- Microsoft Spatializer 1.0.196
- Mixed Reality Input 0.9.2006
- Mixed Reality Toolkit Test Utilities 2.6.1
12.Unity Hub を起動し、対象プロジェクトを追加します

2. Unity で Mixed Reality のための 3Dシーン をビルドする (60分)
1.Unity プロジェクトを開く
※ プロジェクトを開くまでに数分~10分程度かかる場合があります。
2.Project ウィンドウより Asset > Scenes > MainScene を開く

これからの手順はこの MainScene を編集してシーンを完成に近づけていきます。このプロジェクトは OpenXR Plug-in を使用しています。OpneXR は、開発者が幅広いAR/VRデバイスをシームレスにターゲットできるようにすることで、AR/VR開発を簡素化することを目的として、Khronos によって開発されたオープンソースプロジェクトです。この新しいプラグインを使用するためには Unity Editor の設定を少し変更する必要があります。
3.ゲームビューへの入力ロックオプションを有効にする
Window > Analysis > Input Debugger > Option より
[Lock Input to Game View] を選択する。

4.Prefab フォルダを開きます ( Assets > Art > Prefabs )
5.Static Terrain (地形) をドラッグ&ドロップでシーンに追加します
6.追加した Static Terrain の Inspector を編集します
Transform Position ( X = -1.25, Y = -0.59, Z = 2 )

7.プロジェクトパネルからヒエラルキーパネルへドラッグします
ドラッグする Prefab : Assets > Art > Prefabs > Bing Maps Design
8.Bing Maps Design の Inspector より Maps SDK の Developer Key を入力します

9.Bing Maps Design の Inspector より Map Renderer (Script) の値を編集します
Bing Map 開発者用アカウントは公式サイトより発行します。


10.Bing Map Design の Transform を以下値に変更します
( X = 0, Y = -0.7, Z = 2 )

11. [Play] ボタンを押してゲームウィンドウで確認します
Static Terrain と Dynamics Terrain の違いを観察します。Dynamic Terrain (下図 : 右) は Bing Maps より Terrain を動的に呼び出せるので、無限の地形と等高線を描画することができています。一方で、Static Terrain (下図 : 左) は Dynamic Terrain と比較し、高解像画像を使用されています。

これ以降の手順では Dynamics Terrain のみを使用するので、Static Terrain は削除しておきます。
12.Static Terrain をヒエラルキーパネルから削除します
13.HoloLens 2 へ作成したアプリケーションをデプロイします
Build Settings (Ctrl+Shift+B) を開き、Universal Windows Platoform へ Switch Platform を行い、対象のシーンを指定 (Scenes/MainScene) した後、[Build]ボタンを押します。
現時点で OpenXR Plugin は、アーキテクチャ「x64 or ARM64」ビルドのみサポートしており、HoloLens 2 向けにビルドをするので 「ARM64」 を選択します。
Build Settings | 設定値 |
---|---|
Target Device | HoloLens |
Architecture | ARM64 |
Build Type | D3D Project |
Target SDK Version | Latest installed |
Minimum Platform Version | 10.0.18362.0 |
Visual Studio Version | Latest installed |
Build and Run on | USB Device |
Build configuration | Release |

Unity 2020 + OpenXR のプロジェクト設定方法は「Switching the build platform」に詳しい情報が記載されているので、こちらを参照してください。
また、MRTK v2.6 には既知のコンパイルエラーが発見されており、HoloLens 2 + ARM64 ビルドを実行する際には、Visual Studio 2019 Version 16.8 以降を使用する必要があります。
上記の既知のコンパイル問題を知らずに、Visual Studio 2019 Version 16.2 でビルドを実行すると、以下Exception ( Exception thrown at .. (GameAssembly.dll) in Azure Digital Twins.exe ... ) が発生し、アプリ起動後すぐに強制終了となったので、同様のエラーが発生した場合は、Visual Studio のバージョンも確認すると良いと思います。
14.実機でアプリケーションの動作を確認する
MS Learn - ② Build a 3D Scene for mixed reality in Unity 成果物 / Bing Map API を使用して Dynamic Terrain (動的な地形・地図) を表現することができます。
— Futo Horio (@Futo_Horio) June 1, 2021
Azure Digital Twins と Unity を使用して Mixed Reality デジタルツインを構築する https://t.co/iexW9SvJC5 #MSBuild pic.twitter.com/ZMIYYacanj
3. Unity で Mixed Reality のための 3Dアセットの設定を行う (40分)
Unity の Prefab システムを使用すると、すべてのコンポーネント、プロパティ値、子ゲームオブジェクトを再利用可能なアセットとして作成、構成、および保存することができます。
本章でインポートする風力タービンモデルは、Autodesk Filmbox 形式 (*.fbx) であり、レンダリングパフォーマンスを向上させるためにメッシュに定義された詳細レベル ( LOD : Level Of Detail ) グループを備えています。LOD を使用することによって、Prefab と Camera との距離に基づいて、Prefab の三角ポリゴン数を切り替え、GPU処理の負荷を軽減します。
LOD 0 (カメラとの距離が近い場合)


また、MRTK を使用することにより、シーン内に配置する風力タービン (Prefab) に没入度の高いインタラクションをすぐに実装することができます。特に、名前空間 (NameSpace) Microsoft.MixedReality.Toolkit.UI に含まれる以下のオブジェクトクラスがこのプロジェクトで使用されます。
クラス名 | 概要 |
---|---|
ObjectManipulator | オブジェクトを片手、または両手で移動、拡大・縮小、回転できるようにします |
BoundsControl | オブジェクトの周りに立方体を描画して、オブジェクトの変形が可能であること視覚的に表現すると同時に、オブジェクトの変形 ( 回転、および拡大・縮小 ) を可能にします |
NearInteractionGrabbable | Collider |
RotationAxisConstraint | タービンがY(上)軸を中心に回転するように、オブジェクトの回転軸の制御を行います |
各デジタルツイン風力タービン Prefab には、Microsoft Azure から受信したデータを保存し、Unity プロジェクト内で対応する ScriptableObject を持っています。ScriptableObjects は基本的に、シーンやアプリケーション全体でデータをグローバルに保持できる軽量オブジェクトです。風力タービンはこの ScriptableObject を参照し続け、データが更新された際にアセットに通知を行います。以下の Prefab を見て、アタッチされている MRTK コンポーネントと、Azure データが受信される場所を確認してください。
1.Assets > Art > Prefabs 配下の Wind Turbine Design を確認します

風力タービンのインスペクターを見ると、LODグループ、上記の MRTK コンポーネント、およびこのプレハブにアタッチされた他のスクリプトがあることが分かります。
2.タービンのシミュレーションに対応した Scriptable Objects を Assets > Scriptable Objects > Trubin Site Data にて確認します

Static Terrain の上に風力タービンを配置する ( 任意 )
1.Project ウィンドウ より Assets > Art > Prefabs を開きます

2.これまでの手順で追加した Map ( Bing Map Design ) を削除します
3.ヒエラルキーウィンドウに Static Terrain.prefab をドラッグ&ドロップします
4.Wind Turbine Static Map.prefab をシーンウィンドウに追加します
5.Wind Turbine Static Map を Static Terrain の子オブジェクトにします

6.Wind Turbine Static Map のスケールを ( X=0.003, Y=0.003, Z=0.003 ) に変更し、Static Terrain のスケールと合わせます
7.編集メニュー項目の下にある移動ツールを選択し、Wind Turbine を Static Terrain の中央に移動させます

8. 4.から6.の手順を繰り返し、風力タービンを追加します(任意)
今回は MS Learn に合わせて風力タービンを3つに追加しました。

9.File > Save よりシーンを保存します
Dynamic Terrain の上に風力タービンを配置する
1. Bing Maps 開発者用アカウントを作成する
2. プロジェクトウィンドウより Assets > Art > Prefabs を開く
3. もし既に map がシーンに追加されている場合は削除 or 無効化する
4. ヒエラルキーパネルに Bing Map Design.prefab を追加する
5. Bing Map Design.prefab の子オブジェクトとして Wind Turbine Design を追加する

6. 手順 5.を繰り返し、Wind Trubine Design (Prefab) を任意の位置に追加する

7. File > Save でシーンを保存します
8. HoloLens 2 へデプロイし、端末で試します
MS Learn - ③ Configure 3D Assets for Mixed Reality in Unity 成果物 / Microsoft.MixedReality.Toolkit.UI 内のオブジェクトクラスを利用して発電所の風力タービンに操作性を持たせ、Directional Indicator を使用してユーザーにタービンの位置を知らせます。https://t.co/SXKbO9vXY0 #MSBuild pic.twitter.com/sK08oNFzus
— Futo Horio (@Futo_Horio) June 1, 2021
最後に
4つ目の学習モジュール「Azure Digital Twin と Unity を使用して IoT データを HoloLens 2 に接続する」の解説記事は後日、後編で記載予定です。最後までお読みいただき、ありがとうございました。LGTM を押していただけると嬉しいです!!!