Unreal での空間マッピング
空間マッピングを使用すると、オブジェクトを実際の環境の物理サーフェスに配置できます。 HoloLens の周囲の世界がマップされている場合、ホログラムはユーザーにとっていっそう現実的なものに見えます。 また、空間マッピングにより、奥行きの手がかりを利用してユーザーの世界にオブジェクトが固定されるので、それらのホログラムが実際に自分の空間にあることを納得しやすくなります。 ホログラムが空間に浮かんでいたりユーザーと一緒に移動したりすることは現実的でないため、常にできる限り快適になるようにアイテムを配置する必要があります。
空間マッピングの品質、配置、オクルージョン、レンダリングなどの詳細については、空間マッピング に関するドキュメントを参照してください。
空間マッピングを使用するには、Microsoft OpenXR プラグインをダウンロードする必要があります。Unreal マーケットプレ―スまたは GitHub で入手可能です。
空間マッピングの有効化
HoloLens で空間マッピングを有効にするには、次の手順を実行します。
-
[編集] [プロジェクトの設定] を開いて、[プラットフォーム] セクションまで下にスクロールします。
- [HoloLens] を選択し、 [空間認知] をオンにします。
HoloLens ゲームで空間マッピングをオプトインし、 [MRMesh] をデバッグするには、次のようにします。
[ARSessionConfig] を開き、[ARSettings] [ワールド マッピング] セクションを展開します。
[追跡対象ジオメトリからメッシュ データを生成する] をオンにします。これにより、空間マッピング データの非同期取得を開始し、MRMesh を介して Unreal に表示するように HoloLens プラグインに指示されます。
MRMesh ですべての三角形の白いワイヤーフレーム アウトラインを表示するには、 [ワイヤーフレームでメッシュデータをレンダリングする] をオンにします。
実行時の空間マッピング
次のパラメーターを変更して、空間マッピングのランタイム動作を更新できます。
- [Edit](編集) > [Project Settings](プロジェクトの設定) を開き、[Platforms](プラットフォーム) セクションまで下にスクロールして、[HoloLens] > [Spatial Mapping](空間マッピング) を選択します。
- [Max Triangles Per Cubic Meter](立方メートルあたりの最大三角形数) で、空間マッピング メッシュの三角形の密度が更新されます。
-
[Spatial Meshing Volume Size](空間メッシュのボリューム サイズ) は、空間マッピング データをレンダリングおよび更新するための、プレーヤー周りのキューブのサイズを示します。
- 予想されるアプリケーションの実行時環境が大きくなると思われる場合は、この値を現実世界のスペースに合わせて大きくしなければならない場合があります。 アプリケーションでユーザーの周囲の表面にホログラムを配置するだけであれば、値を小さくすることができます。 ユーザーが移動するにつれて、空間マッピングのボリュームも移動します。
MRMesh の操作
最初に、空間マッピングを開始する必要があります。
空間の空間マッピングのキャプチャが済んだら、空間マッピングをオフにすることをお勧めします。 空間マッピングは、一定の時間が経過した後、または各方向のレイキャストから MRMesh に対する衝突が返されるようになったら、完了できます。
実行時に MRMesh にアクセスするには、次のようにします。
- ブループリント アクターに ARTrackableNotify コンポーネントを追加します。
-
ARTrackableNotify コンポーネントを選択し、 [詳細] パネルの [イベント] セクションを展開します。
- 監視するイベントの [ + ] 選択をクリックします。
この場合は、 [追跡ジオメトリの追加] イベントが監視され、空間マッピング データに一致する有効なワールド メッシュが検索されます。 イベントの完全な一覧については、UARTrackableNotify コンポーネント API を参照してください。
メッシュのマテリアルは、ブループリント イベント グラフまたは C++ で変更できます。 次のスクリーンショットは、ブループリントのルートを示しています。
C++ での空間マッピング
ゲームの build.cs ファイルで、AugmentedReality と MRMesh を PublicDependencyModuleNames リストに追加します。
PublicDependencyModuleNames.AddRange(
new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"EyeTracker",
"AugmentedReality",
"MRMesh"
});
MRMesh にアクセスするには、OnTrackableAdded デリゲートをサブスクライブします。
#include "ARBlueprintLibrary.h"
#include "MRMeshComponent.h"
void AARTrackableMonitor::BeginPlay()
{
Super::BeginPlay();
// Subscribe to Tracked Geometry delegates
UARBlueprintLibrary::AddOnTrackableAddedDelegate_Handle(
FOnTrackableAddedDelegate::CreateUObject(this, &AARTrackableMonitor::OnTrackableAdded)
);
}
void AARTrackableMonitor::OnTrackableAdded(UARTrackedGeometry* Added)
{
// When tracked geometry is received, check that it's from spatial mapping
if(Added->GetObjectClassification() == EARObjectClassification::World)
{
UMRMeshComponent* MRMesh = Added->GetUnderlyingMesh();
}
}
Note
更新および削除イベントにも、それぞれ AddOnTrackableUpdatedDelegate_Handle および AddOnTrackableRemovedDelegate_Handle という同様のデリゲートがあります。
イベントの完全な一覧については、UARTrackedGeometry API を参照してください。