简介和先决条件
1.1. 简介
本文档旨在为您提供开发在采用 SpatialLabs 技术的设备上运行的沉浸式体验所需的信息。虽然 SpatialLabs 的硬件和外形尺寸是独一无二的,但 SpatialLabs 应用程序与 VR 应用程序非常相似,因为它们都以立体方式渲染,并且 Unreal 虚拟摄像头会在 3D 空间中跟踪用户的头部。尽管如此,SpatialLabs 还是拥有一套独特的功能,您可以在项目中使用这些功能来提供 AR/VR 设备无法实现的体验。
1.2. 什么是 SpatialLabs
SpatialLabs 的核心是利用软件和硬件功能的组合,将平面二维显示屏转变为三维舞台,内容可以在其中定位(并因此被感知)在不同的深度。由于用户不需要任何可穿戴设备或额外的硬件,因此这通常被称为裸眼 3D 或立体 3D。
能够以真正的 3D 形式呈现内容具有诸多优势,例如增强沉浸感以及更好地感知形状、位置和深度。它还为您提供了一种新的媒介,让您可以将您的想法变为现实,并以创造性的方式吸引用户并为他们提供价值。
SpatialLabs 通过构建几个组件来实现所有这些目标:
- 游戏引擎 :借助 SpatialLabs 插件,Unreal 可以立体渲染您的场景,生成一对图像,每只眼睛各一个
- 眼动追踪相机 :通过向每只眼睛投射不同的图像来感知深度。由于不涉及可穿戴设备,安装在设备上的一对立体摄像头会跟踪用户眼睛在 3D 空间中的位置
- 透镜 :使用 Unreal 渲染的图像对和摄像头跟踪的用户眼球位置,透镜可以将左图像的像素投射到左眼,反之亦然,从而产生 3D 效果。据说透镜会“编织”立体图像对,以便显示最终的组合图像,其中帧中的每个像素都指向正确的眼睛
1.3. 先决条件
要开发 SpatialLabs 体验,需要满足以下条件:
- 安装了 SpatialLabs Experience Center Pro 的采用 SpatialLabs 技术的 Acer 设备。请注意,您可以在非 SpatialLabs 设备上开发您的项目。但是,您需要一台设备才能预览、测试和运行您的应用程序。Unreal 项目只能在 SpatialLabs Pro 版本上运行。
- 使用兼容版本的虚幻引擎的有效安装(请参阅下面的版本兼容性信息)
- 将 SpatialLabs Unreal 插件的副本添加到您的项目中(说明如下)
- 为了打包你的项目,你需要安装 Visual Studio(推荐 VS2019),其中同时安装“使用 C++ 进行桌面开发”和“使用 C++ 进行游戏开发”工作负载,并包含组件“虚幻引擎安装程序”

1.4. 引擎版本兼容性
目前仅支持 UE4 版本 4.26 和 4.27。
笔记
所有虚幻截图均来自虚幻版本 4.26。其他引擎版本的用户界面可能略有不同。
2.1. 下载插件
从 SpatialLabs 下载页面下载虚幻引擎的 SpatialLabs 插件,然后解压缩下载的文件。

2.2. 创建插件文件夹
在 Unreal 项目文件夹中创建一个新文件夹,并将其命名为“Plugins”。将解压后的“SpatialLabs”文件夹复制到这个新建的 Plugins 文件夹中。

笔记
确保复制下载的压缩文件夹内的 SpatialLabs 文件夹,而不是解压后的文件夹本身。
2.3. 启用 SpatialLabs 插件
启动 Unreal 编辑器并加载您的项目,然后通过转到“编辑”➤“插件”导航到插件菜单。您应该能够通过选择左侧面板中的“项目”➤“虚拟现实”找到 SpatialLabs 插件。确保选中“已启用”框以激活 SpatialLabs 插件。出现提示时,请勿重新启动编辑器。

2.4. 禁用 OpenXR 插件
仍在插件窗口中,转到左侧面板中的“内置”➤“虚拟现实”➤“OpenXR”。确保未选中“已启用”框以禁用 OpenXR 插件。您现在可以重新启动虚幻编辑器。

2.5. 启用“在 VR 中启动”
在顶部菜单栏中的“编辑”下,导航到“项目设置”,然后转到“项目”➤“描述”➤“设置”。确保“在 VR 中启动”已启用,如下图所示。这是 Unreal 以立体 3D 模式渲染应用程序所必需的。

2.6. 设置分辨率和窗口模式
SpatialLabs 插件需要特定的分辨率和窗口模式才能正常工作。要进行设置,请导航到项目的 Config 文件夹并找到文件 GameUserSettings.ini(如果缺少,请创建该文件)。打开文件进行编辑并添加以下几行:
[/Script/Engine.GameUserSettings]
分辨率尺寸 X=3840
分辨率尺寸 Y=2160
全屏模式=1
3.1. 在编辑器中预览
SpatialLabs 插件可让您在编辑器内快速预览 SpatialLabs 中的场景。要做到这一点,请在编辑器工具栏中找到“播放”按钮旁边的小三角形,然后选择“VR 预览”。

笔记
仅当您在 ConceptD 7 SpatialLabs Edition 3D 笔记本电脑或 Acer SpatialLabs TM View Pro 显示器上开发虚幻项目时,VR 预览才可用。
3.2. 快速启动
还可以通过右键单击“.uproject”文件并选择“启动游戏”来在编辑器外快速启动未打包的项目。

笔记
为了正确启用立体 3D 模式,您的虚幻应用程序必须按照上面提供的说明在 3840×2160 窗口全屏模式下运行。
世界单位换算成米
启用 SpatialLabs 插件后,会生成一个代表物理显示器的虚拟屏幕。然后,虚幻相机将与用户的眼睛相对应,其相对于虚拟屏幕的位置和视点由跟踪的眼睛位置决定。这样,用户就可以通过显示器感知立体深度。一些视图目标控件可以自动返回到此虚拟屏幕,例如关卡序列中的 CameraActor 或 CineCameraActor。
4.1. 兵种定制
要设置主 Pawn 蓝图,请添加一个子“Scene”组件(下面名为“VirtualScreenRoot”)。在此“Scene”组件下,添加一个名为“XRCamera”的“Camera”组件。以下层次结构确保虚拟屏幕从视图目标接收相同的位置和旋转值。
成分 | 姓名 |
场景 | 虚拟屏幕根 |
相机 | XR 相机 |

4.2. 兵的放置
将 Pawn 添加到关卡后,它通常会放置在与模型相同的位置。下图显示模型与虚拟屏幕(红色窗口)一起显示。这种放置方式允许用户在立体 3D 中轻松舒适地将视线集中在模型上,模型会略微突出于显示屏。


如果将模型放置在 Pawn 前面,它将显示在虚拟屏幕内部,从而产生正视差。


相反,如果将模型放置在 Pawn 后面,它就会弹出虚拟屏幕,造成负视差。
默认情况下,虚拟屏幕基于 SpatialLabs 显示器的物理尺寸。因此,您的 Unreal 场景及其中的对象将以真正的 1-1 比例显示。World to Meters 变量允许您自定义此行为并根据项目需求覆盖比例因子。World to Meters 值为 100 表示缩放比例在物理上是精确的 (1:1)。值为 500 时,比例将更改为 1:5,值为 1000 时,比例将更改为 1:10,从而使场景中的对象看起来更小。

5.1. 秤量设置
每个虚幻关卡都通过“世界设置”面板应用了其独特的“世界到米”变量。您可以在面板的“VR”类别下找到设置。或者,您也可以在运行时使用“将世界设置为米比例”蓝图函数以编程方式设置此值。


6.1. 设置视口分辨率
在顶部菜单栏的“编辑”下,导航到 “编辑器首选项” ,然后转到“关卡编辑器”➤“播放”➤“游戏视口设置”,并将“新视口分辨率”设置为 3840×2160,如下图所示。

在顶部菜单栏中的“编辑”下,导航到“项目设置”,然后转到“引擎”➤“用户界面”➤“DPI 缩放”。确保选中“游戏模式下允许高 DPI”复选框。如果未选中该复选框,并且 Windows 显示设置的缩放值不是 100%,则用户小部件将以不正确的大小呈现。

6.2. 小部件蓝图 API
该插件提供了三个蓝图功能,可以使用蓝图编辑器在操作菜单中找到它们。这些功能包括:
- 添加到 SpatialLabs 视口 :将小部件添加到虚拟屏幕
- 清除 SpatialLabs Viewport :清除虚拟屏幕上的所有小部件
- 从 SpatialLabs 视口移除 :从虚拟屏幕移除小部件
在下面的示例中,Create Widget 节点创建 Widget 蓝图,然后将其添加到 SpatialLabs 视口。

笔记
连续调用 “添加到 SpatialLabs 视口” 函数时,可能需要插入“延迟”节点,以避免稍后插入的小部件无法正确添加到视口。您可以测试 0.2 秒的延迟,但可能需要进行实验才能找到适合您项目的延迟值。
6.3. 调整小部件布局和锚定
Widget Blueprint Editor 提供了各种 Widget 类型,开发人员可以使用它们来设计用户界面的布局和外观。为了让插件正确绘制左右眼的 Widget,需要遵循一些规则:
首先,在控件层次结构中添加一个 Canvas Panel 作为根节点。Canvas Panel 控件类型用于在虚拟屏幕上以绝对定位方式排列 UI 布局。选择其他类型的面板作为根布局可能无法为双眼正确绘制子控件。
其次,在 “详细信息 ”面板中,将根“画布”面板下的所有小部件的“锚点”属性设置为“左上角”。

虚拟屏幕上的 UMG 小部件
6.1. 设置视口分辨率
在顶部菜单栏中点击“编辑”,导航到 “编辑器偏好设置”,然后进入“关卡编辑器” ➤ “播放” ➤ “游戏视口设置”,并将“新视口分辨率”设置为 3840×2160,如下图所示。

在顶部菜单栏中点击“编辑”,然后导航到“项目设置”,接着进入“引擎” ➤ “用户界面” ➤ “DPI 缩放”。确保“在游戏模式下允许高 DPI”复选框被勾选。如果未勾选且 Windows 显示设置的缩放值不是 100%,用户界面小部件将以不正确的大小渲染。

6.2. 小部件蓝图 API
该插件提供了三个蓝图函数,可以在使用蓝图编辑器时在操作菜单中找到。这些函数是:
- 添加到 SpatialLabs 视口 :将小部件添加到虚拟屏幕
- 清除 SpatialLabs 视口 : 清除虚拟屏幕上的所有小部件
- 从 SpatialLabs 视口中移除 : 从虚拟屏幕中移除一个小部件
在下面的示例中,创建小部件节点创建了小部件蓝图,然后将其添加到 SpatialLabs 视口中。

注意
当连续调用添加到 SpatialLabs 视口 函数时,可能需要插入一个延迟节点,以避免稍后插入的小部件无法正确添加到视口中的问题。您可以测试 0.2 秒的延迟,但可能需要实验以找到适合您项目的延迟值。
6.3. 调整小部件布局和锚点
小部件蓝图编辑器提供了各种小部件类型,开发者可以在设计用户界面的布局和外观时使用。为了使插件能够正确地为左右眼绘制小部件,需要遵循一些规则:
首先,在小部件层次结构中添加一个画布面板作为根节点。画布面板小部件类型用于在虚拟屏幕上以绝对定位方式排列 UI 布局。选择其他类型的面板作为根布局可能无法正确为双眼绘制子小部件。
其次,在详细信息 面板中,将所有父级为根画布面板的小部件的锚点属性设置为左上角。

配置 SpatialLabs
在顶部菜单栏的“编辑”下,导航到“项目设置”,然后转到“插件”➤“SpatialLabs”。SpatialLabs 插件定义了立体 3D 模式下的全局配置。这些设置包括:
常规:
- 设备可用
- 如果 SpatialLabs 设备可用,则为 True。[da1]
- 世界比例因子
- 该值与每个地图的“世界到米”值(在其世界设置中找到)相乘,以便对项目中的所有地图应用统一比例
显示:
- 相机偏移
- 将活动相机在 X/前轴方向上相对于显示器进行偏移
- 警告:这应仅作为最终解决方案使用。建议通过移动相机来调整视锥体
头部追踪:
- 动态相机视场角(默认:True)
- 默认情况下,相机的视场角(FOV)是根据用户的眼部位置动态计算的。启用此选项后,相机将使用其自身的 FOV 值
- 禁用动态相机视场角(FOV)从根本上改变了观看体验,适用于某些但不适用于所有类型的项目。建议测试两种行为,以确定哪种更适合您的项目
- 使用固定头部位置
- 该功能将头部位置锁定为“固定头部位置”中指定的位置(见下文)
- 这对于不希望相机随玩家头部移动/旋转的体验非常有用
- 固定头部位置:
- 启用“使用固定头部位置”时要使用的头部位置

使用 Ultraleap 手部追踪与 SpatialLabs
虽然鼠标和键盘为用户提供了熟悉且灵活的输入机制,但添加的手部追踪功能则解锁了一种更自然、直观的与 3D 模型交互的方式。
通过简单地用手指抓取模型来旋转或缩放,就像在您面前操作物理模型一样,轻松审查设计和探索模型,增强沉浸感并加速工作流程。
- 常见使用场景的示例蓝图
- 提供易于重用的功能的 Actor 组件
- 暴露手部追踪事件回调的蓝图 API
要将 Ultraleap 的 Unreal XR 插件与 SpatialLabs 一起使用,您可以使用 LeapMotionSDK ORION 4.1.0 与插件 v3.7.11(适用于 Unreal 4.26)或 v3.7.12(适用于 Unreal 4.27),这些版本已验证兼容性。
注意
Ultraleap 的手部追踪软件受 Ultraleap 追踪 SDK 协议和最终用户许可协议的条款约束,除非 Ultraleap 与您或您的组织签订了单独的许可协议,或 Ultraleap Ltd.与您、您的公司或其他组织之间签订了其他协议。LeapMotion SDK 并非由 SpatialLabs 开发,也不与 SpatialLabs 有关联。
与鼠标和头部的交互
以下是设置鼠标和头部交互时使用的可用蓝图函数的分解。请注意,使用场景仅适用于 SpatialLabs 支持的设备。这些函数包括:
- 获取鼠标世界位置:检索鼠标相对于显示平面的世界空间坐标位置。
- 获取头部到鼠标射线:从用户眼睛中心向世界空间坐标中的鼠标位置投射一条射线。
- 获取头部位置:检索用户眼睛中心相对于相机组件的局部空间坐标位置。
- 获取头部屏幕空间位置:检索用户眼睛中心相对于跟踪传感器组件在局部空间坐标中的位置。

下面的示例展示了如何绘制与虚拟屏幕对齐的鼠标调试点,并从用户头部到鼠标进行正确的追踪。

在 SpatialLabs 中设置最顶层文件选择器
在 Unreal Engine 中为 SpatialLabs 显示基本文件选择器有三种建议的方式:
- 使用 UE SWindow
在 UE 中创建自己的 SWindow 后,通过以下代码获取窗口句柄:
HWND myWindowHandle = (HWND)MyWindow->GetNativeWindow()->GetOSWindowHandle();
然后使用 Win32 API SetWindowPos 将窗口置顶,
代码 SetWindowPos(myWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
- 使用 Win32 API IFileDialog
创建 IFileDialog 并通过方法 Advise 添加类型为 IFileDialogEvents 的自定义事件。在自定义事件中实现 OnSelectionChange 方法,如下代码所示:
STDMETHODIMP OnSelectionChange(IFileDialog* pfd)
{
IOleWindow* window;
如果 (SUCCEED(pfd->QueryInterface(&window)))
{
HWND hwnd;
如果 (SUCCEED(window->GetWindow(&hwnd)))
{
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
}
window->Release();
}
return S_OK;
}
- 使用旧的 Win32 API GetOpenFileName
创建一个 OPENFILENAME 结构体,并提供一个 OFNHookProc 钩子过程,如下代码所示:
static UINT_PTR CALLBACK OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
if ((uiMsg == WM_NOTIFY) && (reinterpret_cast<OFNOTIFY*>(lParam)->hdr.code == CDN_INITDONE))
{
SetWindowPos(GetParent(hdlg), HWND_TOPMOST, 200, 200, 0, 0, SWP_NOSIZE);
}
返回 0;
}
OPENFILENAME ofn;
FMemory::Memzero(&ofn, sizeof(OPENFILENAME)); ofn.lpfnHook = OFNHookProc;
ofn.Flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_ENABLEHOOK;
然后将 OPENFILENAME 结构传递给函数 GetOpenFileName 以打开文件选择对话框。
不兼容性
11.1. DX12 和光线追踪
SpatialLabs 插件目前还不支持光线追踪和 DX12。请在项目设置的 Windows 平台部分中的“目标 RHI”下将 RHI 设置为默认或 DirectX 11。

11.2. 渲染功能
- 在立体模式下,右眼的 VolumetricCloud 渲染不正确。参考
- SSGI 在立体模式下的右眼渲染不正确。参考
- DFAO 在立体模式下不受支持。参考
11.3. 其他组件
- UE4 在使用 Groom 组件运行立体模式时崩溃。参考
已知问题
12.1. STAT 窗口
控制台命令面板的大小基于当前 Windows 显示的缩放和布局设置。将缩放值设置为 100%可以更合适地显示面板大小。


12.2. UMG 问题
此列表旨在让开发者了解当前不支持哪些小部件,以及实现常见小部件功能或外观的替代方案。
小部件 | 已知问题 | 替代方案 |
进度条 | 进度条中填充颜色和跑马灯图像的显示不正确。小部件蓝图中进度百分比的变量值仍然可以访问。 | 在进度条小部件上叠加一个使用动画纹理或材质的图像小部件。 |
组合框 | 文本内容未显示,并且将光标悬停在列表项上时悬停效果不起作用。 | 放置一组按钮小部件以模仿下拉菜单的外观和感觉。 |
可编辑文本 | 输入的文本内容未显示。文本内容本身仍然可以在小部件蓝图中访问。 | 将一个 TextBlock 小部件叠加在 TextBox 小部件上,接收其文本内容。确保 TextBlock 的可见性不可点击。 |
12.3. 窗口行为
当运行 SpatialLabs 应用程序时,会显示一个新窗口作为最顶层的窗口(除了 UE4 窗口)。此窗口会干扰 Windows 中的 Alt+Tab 行为,虽然可以将输入焦点切换到另一个应用程序,但前景不会改变。因此,如果希望同时使用多个应用程序与 SpatialLabs 应用程序,建议使用外部显示器。请注意,此问题也会影响打包的应用程序,因为某些窗口行为(如最小化)目前无法正常工作,需要找到解决方法。
性能
13.1. 注意事项
SpatialLabs 插件以高分辨率渲染两个纹理(每只眼睛一个)。任何与显示的像素数量成比例的渲染功能(例如 TAA、AO、SSR、其他屏幕空间效果)将是影响性能的主要因素。这些是优化性能时首先要考虑的因素。
13.2. 性能优化
13.2.1. 自定义 DefaultScalability.ini
建议使用自定义的 DefaultScalability 配置文件来调整渲染设置。虽然像阴影贴图分辨率这样的设置可以保持较高(因为它们不会随屏幕分辨率缩放),但如果性能出现问题,我们建议首先降低以下设置:
- r.AmbientOcclusionMaxQuality
- r.BloomQuality
- r.Tonemapper.质量
- r.PostProcessAA.质量
13.2.2. 垂直同步和最大帧率
尽可能启用垂直同步,因为禁用它可能会导致屏幕撕裂。目标帧率应始终等于或高于显示器的刷新率(60Hz)。这可以为用户提供最佳体验。您还可以限制最大帧率以减少系统负载。可以通过在项目的 DefaultEngine.ini 配置文件中添加以下行来实现:
[/脚本/引擎.渲染器设置]
r.垂直同步=1
t.最大帧率=60
13.2.3. DLSS
DLSS 版本 2.2.1 与 SpatialLabs 插件兼容,建议用于复杂和渲染密集的场景(请注意 2.2.0 不完全兼容)。要安装 DLSS,请按照以下步骤操作:
- 从 NVidia 网站下载 DLSS
- 安装插件。建议将插件安装为引擎插件。插件下载包中包含有关如何安装的进一步说明。
- 在 UE4 项目中启用 DLSS 插件。
- 现在可以通过蓝图或控制台命令控制 DLSS 质量:
r.NGX.DLSS.Quality
注意
DLSS 本身有固定成本。在高帧率(帧时间小于 10 毫秒)下,启用 DLSS 的性能增益可能小于固定成本。
13.3. 性能分析
13.3.1. RenderDoc
RenderDoc 是一个有用的工具,可用于分析 GPU 并查看渲染管道中的瓶颈所在。
注意
需要使用连接到笔记本电脑的第二台显示器来使用 RenderDoc。由于 Alt+Tab 无法使用,这是在运行 SpatialLabs 应用程序时切换到 RenderDoc 的唯一选择。
13.3.2. Unreal Stats
UE4 中的内置统计系统(使用“stat startfile”和“stat stopfile”)可以正常工作,并可用于捕获统计文件。该文件可以通过 Unreal Frontend 加载,以分析 CPU 和 GPU 性能。
13.3.3. ProfileGPU
内容设计建议
以下列表提供了一系列关于如何设计可用于 SpatialLabs 的内容的建议。
- 不要:避免将对象放置得太远(例如太阳或月亮)或太靠近用户的眼睛。用户将很难集中精力在这些对象上。
- 不要:在物体之间创建过大的深度差异。眼睛很难适应深度变化。最好将深度变化保持在最小或逐渐过渡,例如使用渐变动画。
- 不要:避免背景太远。用户的头部运动与远处的物体结合会导致场景看起来不稳定。
- 不要:避免高对比度。这会使所谓的鬼影效应更加明显。这是由于左眼图像的一小部分对右眼(反之亦然)来说是可见的。高对比度会使这种现象更加明显。
- 不要:景深。景深可能会造成困惑,因为用户试图聚焦于屏幕的特定部分,但由于景深而无法聚焦。
- 不要:避免越界。对象应完整显示和渲染。当一个对象与显示边界重叠且部分遮挡时,深度感知和沉浸感会受到影响。
- 不要:避免高频率内容,如小字体文本或非常高分辨率的纹理。此类内容将显示可见的镜头图案,使用户难以看清。
- 做:设计屏幕大小的对象。看着屏幕边缘,对象超出屏幕会破坏沉浸感。
- 做:放慢速度并最小化相机移动。快速移动(例如 180 度转身)可能会让人感到极度晕眩。
- 请:将 2D 元素与 3D 对象分开放置。当 2D 元素放置在 3D 对象上方时,用户将难以集中注意力。请确保这些元素之间有足够的空间。最好将 UI 元素放置在避免与 3D 对象交叉的位置,例如屏幕边缘。
- 请:创建清晰的图像(例如,增加 r.tonemapper.sharpen 控制台变量)。避免激活如运动模糊等效果。虽然它们为 2D 显示提供了更电影化的感觉,但它们会使感知 SpatialLabs 显示的 3D 效果更加困难。
- 请:经常在 SpatialLabs 显示上进行测试,以确保整个体验过程中的质量和舒适度都得到保持。
Was this helpful?
0 / 0