Project Anywhere XR

Unreal Engine と HoloLens 2 を使用し、拡張現実において大規模なデータセットで地理空間テクノロジーやデータ ストリーミングを利用する方法について、Project Anywhere XR サンプルを使って説明します。

Choose your operating system:

Windows

macOS

Linux

Project Anywhere XR は、地理空間テクノロジー、グローバル 3D テレイン、およびデータ ストリーミングの概念実証を行うもので、Unreal Engine 内で世界を 3D タイルとして視覚化します。このバージョンの Project Anywhere は、HoloLens 2 アプリケーションで大規模なデータセットを使用できることをデモで示します。

このプロジェクトでは、次のプラグインを活用し、拡張現実内のテーブルトップに世界を再現します。

前提条件

開始する前に、以下が設定されていることを確認してください。

必要なサードパーティ プラグインは、 Unreal Engine マーケットプレイス で入手することができます。必要なプラグインなしでプロジェクトを起動すると、それらをダウンロードしてインストールするよう求められます。

HoloLens 2 デバイスがない場合でも、Mixed Reality UXTools プラグインに含まれている Microsoft の 入力シミュレーション を使用し、エディタ内エミュレーションによってプロジェクトを実行できます。

プロジェクトのセットアップ

以下の手順に従って Project Anywhere XR サンプルのコンテンツを使用してプロジェクトを設定し、アセットを Cesium Ion アカウントに接続します。

  1. Epic Games Launcher から Project Anywhere XR サンプルをダウンロードし、Unreal Editor で新しいプロジェクトを作成します。

  2. Cesium Ion アカウントにログインします。

  3. [Asset Depot (アセット デポ)] タブに移動し、次の 3D タイル アセットを追加します。

    • Aerometrex Denver Photogrammetry (#354307)

    • Bing Maps Aerial (#2)

    • Cesium OSM Buildings (#96188)

    • Cesium world terrain (#1)

    • Melbourne Photogrammetry (#69380)

    利用条件をよくお読みください。一部は非商用目的のみとされています。

    image alt text

  4. [Access Tokens (アクセス トークン)] タブに移動します。

    image alt text

  5. [Create Token (トークンを作成)] をクリックし、 [Create token (トークンを作成)] パネルを開きます。

    image alt text

  6. [Create token] パネルで、以下を実行します。

    • [Name (名前)] フィールドを「 Project Anywhere XR 」に設定します。

    • [Scope (スコープ)] で、次のオプションを有効にします。

      • assets:list

      • assets:read

      • profile:read

      • assets:write

      • geocode

    • [Resources] で、 [Selected assets (選択されたアセット)] のラジオ ボタンをオンにし、 [Available Assets (利用可能なアセット)] のリストを表示します。トークンは、アプリケーション内で使用するアセットのセットに対してのみ有効にすることをお勧めします。

    • [Available Assets] のリストで、次のアセットを選択します。

      • Aerometrex Denver Photogrammetry (#354307)

      • Bing Maps Aerial (#2)

      • Cesium OSM Buildings (#96188)

      • Cesium world terrain (#1)

      • Melbourne Photogrammetry (#69380)

    • [Create (作成)] をクリックし、トークンを作成します。

    image alt text

  7. [Project Anywhere XR] を選択し、そのテキストを [Token (トークン)] の下にコピーします。

    image alt text

  8. Unreal Editor の [World Outliner (アウトライナ)] で、次の Cesium3DTileset アクタを選択します。

    • Cesium OSM Buildings

    • Cesium World Terrain

    • Denver

    • Melbourne Photogrammetry

  9. [Details (詳細)] パネルに、これらの各アクタに共通するプロパティが表示されます。 Ion Access Token プロパティを見つけ、Cesium Ion アカウントから生成したトークンを貼り付けます。

    image alt text

  10. Cesium World Terrain アクタをを選択し、その Bing Maps Aerial コンポーネントを選択します。

  11. [Details] パネルの Ion Access Token プロパティに、Cesium Ion アカウントから生成されたトークンを貼り付けます。

    image alt text

  12. トークンを 4 個の Cesium3DTileset アクタと Bing Maps Aerial コンポーネントに設定すると、ビューポートにテレイン データが表示されます。

    image alt text

  13. ツールバーで、 [Save Current (現在のレベルを保存)] をクリックし、レベル内の変更を保存します。

プロジェクトを表示する

このアプリケーションは、Microsoft の Holographic Remoting Player を使用し、コンピュータから HoloLens 2 デバイスにコンテンツをストリーミングするために設計されています。コンテンツをストリーミングすることで、コンピュータに大規模なデータセットをロードしてレンダリングを作成し、そのレンダリングしたフレームをネットワーク経由でデバイスに送信できます。プロジェクトをアプリケーションとしてパッケージ化し、デバイスにデプロイする場合、データセットはそのデバイスのメモリ容量に適合している必要があります。

Holographic Remoting Player を使用して Unreal Editor からデバイスにストリーミングする方法の手順については、「 Holographic Remoting Player を使用したデバイスへのストリーミング 」を参照してください。

デバイスにストリーミングする際は、ネットワークの転送速度を 15000 kb / s に上げて、より高い品質のイメージを使用することでエクスペリエンスを改善します。

image alt text

コンピュータに接続された HoloLens 2 デバイスがない場合でも、エディタ内エミュレーションとキーボードおよびマウスによる入力を使用してプロジェクトを表示することができます。エディタ内エミュレーションを有効にするには、以下の操作を行います。

  1. メイン メニューから [Edit (編集)] > [Project Settings (プロジェクト設定)] を選択して [Project Settings] ウィンドウを開きます。

  2. [Project Settings] ウィンドウの [Platforms (プラットフォーム)] で、 [Windows Mixed Reality] を選択します。

  3. [Holographic Remoting (ホログラフィック リモーティング)] セクションで、 [Enable Input Simulation (入力シミュレーションを有効化)] True に設定します。

    image alt text

エディタ内エミュレーションを使用する方法の詳細については、Microsoft のドキュメントで 入力シミュレーション を参照してください。

このプロジェクトのエディタ内エミュレーションには、次の制限事項があります。

  • エディタ内エミュレーションでは、キャリブレーションがサポートされていません。テーブルトップを自動的に配置するには、キャリブレーションに空間メッシュが必要です。このメッシュは、アプリケーションが環境をスキャンした際に作成されるものです。

  • エディタ内での再生時には、アプリケーションはブックマークの選択に使用されるピンチ インタラクション イベントを受信しません。しかし、これらのインタラクションをキーボードの 1 および 2 のキーを使用して両手に対してエミュレートすることができます。

プロジェクトが起動すると、仮想テーブルトップが表示されます。ワールドのセクションは、テーブル上にマップとして、次の情報とともに表示されます。

  • マップの中心の地理的座標 (緯度/経度/高度の形式で表現)

  • マップ内に表示されている領域に対する、実世界での長さ

image alt text

ハンド メニューを使用する

プロジェクトには、目の前に表示される手のどちらかを開くことでアクセスできるメニューが含まれています。メニューには地球のモデルが含まれていて、画びょうで特定の位置を選択してマップを更新したり、スライダで地球のモデルを回転させたり、ボタンでテーブルを移動させたり表示されたデータについて調べたりすることができます。このメニューは、HoloLens 2 用の UXTool Hand Menu を使用し、ブループリント BP_HandMenu で定義されています。

image alt text

メニューの操作方法と、メニューがどのように作成されたかについて、以下のセクションで説明します。

ブックマークを使用して特定の位置に移動する

地球のモデルには、ワールド内の特定の位置をマークする画びょうがあり、テーブルトップ上でその位置を選択して表示することができます。

位置を選択するには、画びょうが赤色になってツールヒントに位置の名前が表示されるまで手を近づけます。指でピンチして、テーブルトップでマップがこの位置になるように更新します。

image alt text

軸を中心にして局地的に地球のモデルを回転させるには、スライダをピンチしてモデルの下にドラッグし、スライダを放して回転を止めます。

image alt text

アプリが起動すると、BP_HandMenu アクタのブックマークのデータ テーブル DT_Bookmarks_PAXR のエントリに基づいて、画びょうが動的にスポーンします。画びょうのブループリント BP_Bookmark_Button (カスタムの UxtPressableButton ) は、地球とともに画びょうが自動的に回転するよう、球コンポーネントに接続されています。

メニュー ボタン

次のボタンを使用すると、使用されるデータに関する情報を取得したり環境内でテーブルトップを移動したりすることができます。

メニュー ボタン

説明

Data Attribution (データの帰属)

ハンド メニューで [Data Attribution (データの帰属)] ボタンをクリックすると、表示されているマップのデータ帰属を読むことができます。

image alt text

Calibrate (キャリブレーションする)

初めてアプリを起動すると、ルーム内のデフォルトの場所にホログラフィック テーブルが表示されます。このボタンを押すと、テーブルがビューの正面になるように自動的に位置が再調整されます。詳細については、次のセクションの「 ルーム内で仮想テーブルトップを移動する 」を参照してください。

Move Up (上に移動)

Z 軸に沿ってテーブルの位置を段階的に上に移動します。

Move Down (下に移動)

Z 軸に沿ってテーブルの位置を段階的に下に移動します。

Rotate Left (左に回転)

Z 軸を中心にしてテーブルを段階的に左に回転させます。

Rotate Right (右に回転)

Z 軸を中心にしてテーブルを段階的に右に回転させます。

BP_HandMenu ブループリントを操作する

メニューは、HoloLens 2 用の UXTool Hand Menu をベースとして、ブループリント BP_HandMenu で定義されています。UxtPalmUpConstraint を有効化または無効化することで、メニューは表示または非表示になります。ボタンのインタラクションは、 BP_AnywhereXRPlayerController 内の該当するアクションにリダイレクトされます。 BP_HandMenu は、BeginPlay で次のものを初期化します。

  • BP_AnywhereXRPlayerController への参照を変数 MRAnywhere Player Controller に格納します。

  • Data Attribution (データの帰属) ウィジェットを作成および非表示にします。

  • すべてのメニュー イベントを、対応するイベント ハンドラにバインドします。

  • スライダ イベントを、地球のモデルの回転にバインドします。

  • DT_Bookmarks_PAXR データ テーブル内のすべてのエントリを読み取り、それらを対応するブックマークのスポーンに使用します。

ルーム内で仮想テーブルトップを移動する

初めてアプリケーションを起動すると、ルーム内のデフォルトの場所に仮想テーブルトップが表示されます。位置は、メニューの [Calibrate (キャリブレーションする)] ボタンまたはメニューの [Move (移動)] ボタンおよび [Rotate (回転)] ボタンを使用し、ルーム内のより適切な位置 (暗いテーブルが好ましい) に変更できます。テーブルを配置する際に、 ARPin を使用するとテーブルがワールドに固定されます。

キャリブレーションを開始するには、ハンド メニューで、 [Calibrate (キャリブレーションする)] ボタンを押します。これによって、現在のテーブルトップが非表示になり、キャリブレーション プロセス用の新しい仮想テーブルトップに置き換わります。新しいテーブルトップは形状もサイズも前のものと同じであり、表示している方向に向けられます。頭の位置と固定ポイントの間のベクターによって、テーブルトップのマップの北の方向が決定されます。

テーブルトップの位置と北の方向を確認するには、以下の操作を行います。

  • 頭を動かして、キャリブレーション用テーブルトップを任意の位置に移動します。この操作中に、ルームの空間メッシュが使用されます。

  • 再度タップしてキャリブレーション用テーブルトップを解除し、テーブルの位置を設定します。

image alt text

テーブルトップの位置を微調整する場合は、メニューの [Move] ボタンおよび [Rotate] ボタンを押して段階的な変更を加えます。

image alt text

ブループリント BP_AnywhereXRPlayerController には、キャリブレーションとテーブルの移動のためのロジックが含まれています。次のセクションでは、キャリブレーションに使用するいくつかの関数について説明します。

キャリブレーション関数

StartTable Calibration 関数は、ハンド メニューの [Calibrate] ボタンから呼び出されます。この関数を呼び出すと、次のアクションが実行されます。

  • BP_AnchorGizmo のスポーン。また、デバイスの方向に従って自動的にキャリブレーション モードを開始します。

  • BP_AnchorGizmo の [Tap To Place(タップして配置)] によってトリガーされた Anchor Placed イベントに自身をバインドする。

  • 仮想テーブルトップが非表示になり、競合が発生しないよう、仮想テーブルトップを無効にする。

StartTable Calibration 関数のブループリントのグラフ。画像をクリックするとフルサイズで表示されます。

ユーザーが BP_AnchorGizmo を配置すると、 OnAnchorPlaced 関数が呼び出されます。この関数を呼び出すと、次のアクションが実行されます。

  • 確定された位置のトランスフォームを取得し、関数 ChangeTableOrigin を呼び出す。

  • BP_AnchorGizmo を破棄する。

  • テーブルトップを新しい位置で有効にし、非表示を終了して競合が再度発生しないようにする。

OnAnchorPlaced 関数のブループリントのグラフ。画像をクリックするとフルサイズで表示されます。

ChangeTableOrigin 関数は、OnAnchorPlaced によって呼び出されます。この関数を呼び出すと、次のアクションが実行されます。

  • テーブルに特定の Teleport 関数を呼び出し、すべての依存オブジェクトを適切に再配置します。

  • ARPin の位置をローカル ストアに格納する。

ChangeTableOrigin 関数のブループリントのグラフ。画像をクリックするとフルサイズで表示されます。

仮想テーブルのマップを操作する

仮想テーブルのマップでは、手のインタラクションによるパンおよびズームがサポートされています。向きは実装されなかったため、このマップの北の方向は変わりません。マップには視覚的なヒントが表示され、ユーザーによるインタラクションが可能であることが示されます。インタラクションは、テレインではなく、平らなテーブルのジオメトリをトレースします。

image alt text

マップをパンするには、一方の手でピンチし、マップを移動したい方向に手を動かします。ピンチを解放すると、マップが解放されます。

image alt text

マップのズーム インとズーム アウトを行うには、両手でピンチして両手を離していくとズーム アウトし、両手を近づけていくとズーム インします。ピンチを解放すると、マップが解放されます。

image alt text

マップのインタラクション ロジックは、BP_HolographicTable 内に定義されています。チームによるマップのインタラクション実装時には、次の考慮事項に基づいて設計の選択を行いました。

  • HoloLens の操作は単一オブジェクトにのみ機能するが、Cesium 3D のタイルセットは複数のアクタによって構成される。アプリケーションは、テーブルを固定しながら HoloLens を操作するインタラクションをインターセプトし、その後タイルセットに対して入力のトランスレーションとスケーリング アクションを適用します。

  • 地球は丸いため、パンを実行し続けると、水平移動によって最終的に自分が地球の表面から離れてしまう。スケールが小さい場合、これは問題になりません。しかし、最大スケールでズーム アウトを行った場合、このことが顕著に表れます。パンの動作では地球の丸みを考慮に入れる必要がありますが、この丸みをステップごとに適用するのは負荷が高くなる場合があります。

    この問題を解決するには、この動作が設定されたしきい値を超えるとすぐにタイルセット アクタの原点がテーブルの中心に再配置されるようにします。この効果は認識可能なものではなく、また計算の正確さも確保されます。

  • マップには山が表示される場合があるため、楕円体の表面と地面の表面の間の高さが変化する。ズーム インし、楕円体の原点をテーブルの中心に固定すると、地面の表面はそのはるか遠くに浮かびます。このオフセットは、地球の場所ごとに異なります。タイルセットを垂直方向に動かし、常に確実にテーブルにフィットさせることはできますが、地球上の四角形の土地に対し、最小の高さを把握する方法はありません。

    この問題を解決するには、現在の場所やスケールにかかわらず、ライン トレースによって地面の高さを判定し、制御アルゴリズムを適用してテーブルにフィットさせるようにします。

  • 表示可能なジオメトリがあると、HoloLens 2 のインタラクションが衝突する。デフォルトでは、マップ内に表示されるテレインは、HoloLens 2 のレイキャストをブロックし、テーブルに衝突するのを妨害します。

    これを解決するため、 TileSets というカスタムのコリジョン チャンネルが [Project Settings (プロジェクト設定)] に設定されています。各 Cesium3DTiles のコリジョン プロパティは、TileSets チャンネルを使用するコリジョンのみをブロックしますが、それらの表示チャンネルは無視します。

これらの設計の選択により、仮想テーブルトップでインタラクションを行う際にすべての 3D タイルのリストを取得し、それらを水平方向と垂直方向に移動し、スケーリングしてズーム エフェクトを適用し、ディスプレイスメントのしきい値を超えた場合にはすべてを再配置してマップを水平に維持することができます。

既知の問題

発生する可能性のある既知の問題と、それらに対する回避策を次に示します。

  • シッピング 用にアプリケーションをパッケージ化し、起動時に [Fatal Error (致命的エラー)] というメッセージが表示された場合、この問題には、次の 2 つの回避策があります。

    • Cesium For Unreal プラグインを使用しているすべての Unreal Editor インスタンスを閉じる。また、 %LOCALAPPDATA%\UnrealEngine\4.27 にある cesium-request キャッシュ ファイルを削除する

    • アプリを 開発 用にパッケージ化する

  • VR Preview でエディタを使用してアプリケーションをプレビューし、ハンド トラッキングは機能するのにインタラクションが登録されない場合は、HoloLens 2 デバイスと Unreal アプリケーションの両方を再起動する

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル