Unreal 中的空间映射

利用空间映射,你可以将对象放置在现实世界的物理表面上。 对 HoloLens 周围的世界进行映射时,全息影像看起来会让用户感觉更加真实。 空间映射还利用深度提示,在用户的世界中为对象定位,这有助于说服用户这些全息影像实际位于其空间中。 在空间中浮动或随用户移动的全息影像并不会让人感觉真实,因此建议尽可能始终放置一些项目,让人保持舒适感。

可以在空间映射文档中找到有关空间映射质量、位置、封闭、呈现等内容的详细信息。

应下载 Microsoft OpenXR 插件以使用空间映射,该插件可在 Unreal MarketplaceGitHub 上获得。

启用空间映射

若要在 HoloLens 上启用空间映射,请执行以下操作:

  • 打开“编辑”>“项目设置”,并向下滚动到“平台”部分。
    • 选择“HoloLens”并检查“空间感知”

Screenshot of the HoloLens project settings capabilities with spatial perception highlighted

若要选择在 HoloLens 游戏中使用空间映射并调试“MRMesh”,请执行以下操作:

  1. 打开“ARSessionConfig”并展开“ARSettings”>“世界映射”部分。

  2. 选中“从跟踪几何生成网格数据”,可指示 HoloLens 插件开始异步获取空间映射数据,并通过 MRMesh 将其呈现给 Unreal

  3. 选中“在线框中呈现网格数据”,以显示 MRMesh 中每个三角形的白色线框轮廓。

Spatial Anchors Store Ready

运行时的空间映射

可以修改以下参数以更新空间映射运行时行为:

  • 打开“编辑”>“项目设置”,向下滚动到“平台”部分,并选择“HoloLens”>“空间映射”

Spatial Anchors Project Settings

  • “每立方米最大三角形”将更新空间映射网格中三角形的密度
  • “空间网格体积大小”是在玩家周围渲染和更新空间映射数据的立方体的大小
    • 如果预期的应用程序运行时环境很大,那么这个值可能需要很大才能匹配实际空间。 如果应用程序只需要将全息影像直接放置在用户周围的表面上,那么这个值可能会较小。 当用户在世界内走动时,空间映射卷将随之移动。

使用 MRMesh

首先,你需要启动“空间映射”:

Blueprint of the ToggleARCapture function with spatial mapping capture type highlighted

为空间捕获空间映射后,建议关闭空间映射。 可在一定时间后完成空间映射,也可当各方向的光线投射均对 MRMesh 返回碰撞时完成。

若要在运行时访问 MRMesh,请执行以下操作

  1. 将“ARTrackableNotify”组件添加到蓝图 Actor

Spatial Anchors AR Trackable Notify

  1. 选择“ARTrackableNotify”组件,然后在“详细信息”面板中展开“事件”部分
    • 在要监视的事件上,选择 按钮+

Spatial Anchors Events

在这种情况下,会监视“添加时跟踪几何”事件,这将查找与空间映射数据匹配的有效世界网格。 可以在 UARTrackableNotify 组件 API 中找到事件的完整列表。

可以在蓝图事件图或 C++ 中更改网格的材料。 下面的屏幕截图显示蓝图路由:

Spatial Anchors Example

使用 C++ 的空间映射

在游戏的 build.cs 文件中,向 PublicDependencyModuleNames 列表添加 AugmentedReality 和 MRMesh

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();
    }
}

注意

对于已更新和已删除的事件,存在类似的委托,分别为 AddOnTrackableUpdatedDelegate_Handle 和 AddOnTrackableRemovedDelegate_Handle

可以在 UARTrackedGeometry API 中找到事件的完整列表。

另请参阅