Unity 中的照相机设置
本文内容
当佩戴混合现实头戴显示设备时,它将成为你的全息世界的中心。 Unity 照相机 组件会自动处理立体渲染,并随着你的头部进行移动和旋转。 但是,若要完全优化视觉质量和全息影像稳定性 ,应设置如下所述的照相机设置。
HoloLens 与 VR 沉浸式头戴显示设备
Unity 照相机组件上的默认设置适用于传统的 3D 应用程序,由于这种应用程序不具备真实世界,因此需要类似天空盒的背景。
在沉浸式头戴显示设备 上运行时,你会渲染用户看到的所有内容,因此你可能需要保留天空盒 。
但是,当在 HoloLens 等全息头戴显示设备上运行时,真实世界应显示在照相机渲染的所有内容之后 。 将照相机背景设置为透明(在 HoloLens 中,黑色渲染为透明色),而非“天空盒”纹理:
选择“层次结构”面板中的“主照相机”
在“检查器”面板中,找到照相机组件,并将“清除标志”下拉列表从“天空盒”更改为“纯色”
选择背景颜色选取器,并将 RGBA 值更改为 (0, 0, 0, 0)
如果从代码进行此设置,可以使用 Unity 的 Color.clear
MRTK 将基于照相机系统配置文件中的配置 自动处理特定相机设置。
命名空间: Microsoft.MixedReality.Toolkit.CameraSystem
类型: MixedRealityCameraSystem
为了检查照相机的不透明度,MixedRealityCamera 系统具有 IsOpaque
属性 。
CoreServices.CameraSystem.IsOpaque;
照相机设置
无论开发哪种体验,主照相机始终是附加到设备的头戴式显示器的主要立体渲染组件。 如果将用户的起始位置想像为 (X: 0, Y: 0, Z: 0),可以更容易地设计应用。 由于主照相机可跟踪用户头部的移动,因此可以通过设置主照相机的起始位置来设置用户的起始位置。
你需要做出的核心选择是,要为 HoloLens 还是 VR 沉浸式头戴显示设备进行开发。 做好决定后,请跳至任何适用的设置部分。
HoloLens 照相机设置
对于 HoloLens 应用,需要针对所有想要锁定到场景环境中的对象使用定位点。 建议使用无界限空间来最大程度地提高稳定性,并在多个房间中创建定位点。
按照此分步教程 在 Unity 项目中添加并自动配置混合现实工具包。 还可以直接使用适用于 Unity 的 MRTK 中的 MixedRealityPlayspace 类,并将“目标级别”设置为“世界” :
MRTK 应自动处理游戏空间和照相机的位置,但最好再检查一下:
从“层次结构”面板中,展开“MixedRealityPlayspace”这一 GameObject,并查找“主照相机”子对象
在“检查器”面板中查找“转换”组件,并将“位置”更改为“(X: 0, Y: 0, Z: 0)”
在 XRInputSubsystem 上设置跟踪源模式。 获取子系统后,调用 TrySetTrackingOriginMode :
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Device);
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Unbounded); // Recommendation for OpenXR
可以将 ARSession 用于 HoloLens 应用程序,它与定位点和 ARKit/ARCore 配合使用效果更好。
重要
需要安装 AR Foundation 才能使用 AR 会话和相关功能。
在不使用 ARSession 的情况下,也可以手动应用照相机更改:
在“层次结构”面板中选择“主照相机”
在“检查器”面板中查找“转换”组件,并将“位置”更改为“(X: 0, Y: 0, Z: 0)”
Unity 中“检查器”窗格中的照相机
将 TrackedPoseDriver 添加到“主照相机”
在“层次结构”面板中选择“主照相机”
在“检查器”面板中查找“转换”组件,并将“位置”更改为“(X: 0, Y: 0, Z: 0)”
Unity 中“检查器”窗格中的照相机
转到“Windows 应用商店播放器设置”的“其他设置”部分
选择“Windows Mixed Reality”作为设备,在较旧版本的 Unity 中,它可能会列为“Windows Holographic”
选择“支持的虚拟现实”
由于主照相机对象会自动标记为照相机,因此 Unity 支持所有移动和转换。
注意
需要在应用的每个场景中将这些设置应用到照相机。
默认情况下,在 Unity 中创建新场景时,Unity 将在包含照相机组件的层次结构中包含一个主照相机 GameObject,但可能未正确应用这些设置。
VR 照相机设置
Windows Mixed Reality 支持各种体验级别 的应用,既支持仅限方向的应用和坐姿级别应用,也支持房间级别应用。 在 HoloLens 上,你可以进一步构建世界级别应用,让用户可以步行 5 米以上的距离,探索建筑的整个平面甚至更远的地方。
在 Unity 中构建混合现实体验的第一步,是确定应用的目标体验级别 :
房间级别或站立级别
注意
如果要为 HL2 构建混合现实体验,建议创建一种视线水平的体验,或考虑使用场景理解 来推断场景地板。
使用适用于 Unity 的 MRTK 的 MixedRealityPlayspace 类,并将“目标级别”设置为“房间”或“站立” :
MRTK 应自动处理游戏空间和照相机的位置,但最好再检查一下:
从“层次结构”面板中,展开“MixedRealityPlayspace”这一 GameObject,并查找“主照相机”子对象
在“检查器”面板中查找“转换”组件,并将“位置”更改为“(X: 0, Y: 0, Z: 0)”
转到“Windows 应用商店播放器设置”的“其他设置”部分
选择“Windows Mixed Reality”作为设备,在较旧版本的 Unity 中,它可能会列为“Windows Holographic”
选择“支持的虚拟现实”
由于主照相机对象会自动标记为照相机,因此 Unity 支持所有移动和转换。
注意
需要在应用的每个场景中将这些设置应用到照相机。
默认情况下,在 Unity 中创建新场景时,Unity 将在包含照相机组件的层次结构中包含一个主照相机 GameObject,但没有正确应用以下设置。
命名空间: UnityEngine.XR
类型: XRDevice
对于“站立空间规模”或“房间规模”体验,需要将内容相对于地板放置 。 可以使用空间阶段 来判断用户的平面,空间阶段代表用户定义的平面原点和可选的房间边界,需要在第一次运行时进行设置 。
为了确保 Unity 在地板级别使用其世界坐标系统进行操作,可以进行设置并测试 Unity 是否在使用 RoomScale 跟踪空间类型:
if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
// RoomScale mode was set successfully. App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
// RoomScale mode was not set successfully. App cannot make assumptions about where the floor plane is.
}
如果 SetTrackingSpaceType 返回 true,则 Unity 已成功切换其世界坐标系统以跟踪场地参照系 。
如果 SetTrackingSpaceType 返回 false,则表明 Unity 无法切换到场地参照系,原因可能是用户尚未在其环境中设置地板。 虽然返回 false 值并不常见,但如果场地设置在不同的房间,且设备移动到当前房间后用户没有设置新的场地,则可能会发生这种情况。
应用成功设置 RoomScale 跟踪空间类型后,平面上会显示放置在 y=0 平面上的内容。 (0, 0, 0) 处的原点将是用户在房间设置过程中站立的地板上的特定位置,其中 -Z 表示设置过程中面对的正前方。
坐姿体验
使用适用于 Unity 的 MRTK 的 MixedRealityPlayspace 类,并将“目标级别”设置为“坐姿” :
MRTK 应自动处理游戏空间和照相机的位置,但最好再检查一下:
从“层次结构”面板中,展开“MixedRealityPlayspace”这一 GameObject,并查找“主照相机”子对象
在“检查器”面板中查找“转换”组件,并将“位置”更改为“(X: 0, Y: 0, Z: 0)”
转到“Windows 应用商店播放器设置”的“其他设置”部分
选择“Windows Mixed Reality”作为设备,在较旧版本的 Unity 中,它可能会列为“Windows Holographic”
选择“支持的虚拟现实”
由于主照相机对象会自动标记为照相机,因此 Unity 支持所有移动和转换。
注意
需要在应用的每个场景中将这些设置应用到照相机。
默认情况下,在 Unity 中创建新场景时,Unity 将在包含照相机组件的层次结构中包含一个主照相机 GameObject,但没有正确应用以下设置。
命名空间: UnityEngine.XR
类型: XRDevice
若要构建“仅限方向”或“坐姿级别”体验,需将 Unity 的跟踪空间类型设置为“静止” 。 静止跟踪空间会将 Unity 的世界坐标系统设置为跟踪静止参照系 。 在“静止”跟踪模式下,启动应用时,放置在编辑器中相机默认位置(前向为 -Z)正前方的内容将出现在用户面前。
XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
命名空间: UnityEngine.XR
类型: InputTracking
对于纯粹的“仅限方向”体验,例如 360 度视频查看器(其中头部位置更新会破坏视觉效果),可以将 XR.InputTracking.disablePositionalTracking 设置为 true :
InputTracking.disablePositionalTracking = true;
对于“坐立空间规模”体验,若要让用户稍后重新定位坐姿原点,可调用 XR.InputTracking.Recenter 方法 :
InputTracking.Recenter();
如果要构建坐姿级别体验 ,可通过调用 XR.InputTracking.Recenter 方法,将 Unity 的世界原点重新定位到用户当前头部位置 。
设置照相机背景
如果使用的是 MRTK,则会自动配置和管理照相机的背景。 对于 XR SDK 或旧版 WSA 项目,建议在 HoloLens 上将照相机的背景设置为纯黑色,在 VR 上则保留天空盒设置。
使用多个照相机
当场景中有多个照相机组件时,Unity 可根据哪个 GameObject 具有 MainCamera 标记,从而知道使用哪个照相机进行立体渲染。 在旧版 XR 中,它还可使用此标记来同步头部跟踪。 在 XR SDK 中,头部跟踪由附加到照相机的 TrackedPoseDriver 脚本驱动。
共享深度缓冲区
根据要渲染的头戴显示设备类型,将应用的深度缓冲区共享给 Windows 的每一帧,将使应用在息影像稳定性方面获得以下两种提升之一:
在提供深度缓冲区时,VR 沉浸式头戴显示设备可以处理位置重投影,调整你的全息影像以防止错误预测位置和方向 。
HoloLens 头戴显示设备具有几种不同的方法 。 提供深度缓冲区时,HoloLens 1 将自动选择焦点 ,优化与大部分内容相交的平面上的全息影像稳定性。 HoloLens 2 将使用深度 LSR(请参阅备注) 来稳定内容。
MRTK 的配置对话框 将尝试为 XR SDK 和旧版 WSA 设置深度缓冲区,但最好检查这些选项卡并验证 Unity 中的设置。
对 Unity 应用是否向 Windows 提供深度缓冲区进行设置:
转到“编辑”>“项目设置”>“XR 插件管理”,并确保展开菜单项 。
单击与所选 XR 运行时对应的菜单项,“Windows Mixed Reality”或“OpenXR”。 此外,由于“Windows 独立”和“通用 Windows 平台”选项卡都可用,请确保选择了正确的生成平台。
启用和配置:
对于 OpenXR,请在“深度提交模式”下拉列表中选择深度格式或“无” 。
对于 Windows Mixed Reality,选中或取消选中“共享深度缓冲区”复选框 。 然后,从“深度缓冲区格式”下拉列表中选择一种格式 。
注意
通常建议使用 16 位深度缓冲区来提高性能。 但是,如果使用 16 位深度格式,模具缓冲区所需效果(如某些 Unity UI 滚动面板)将不起作用,因为在此设置中,Unity 不会创建模具缓冲区 。 相反,选择 24 位深度格式通常会创建 8 位模具缓冲区 (如果适用于终结点图形平台) 。
对 Unity 应用是否向 Windows 提供深度缓冲区进行设置:
转到“编辑”>“项目设置”>“播放器”>“通用 Windows 平台选项卡”>“XR 设置” 。
展开“Windows Mixed Reality SDK”项 。
选中或取消选中“启用深度缓冲区共享”复选框 。 新项目中会默认选中“启用深度缓冲区共享”,但在较旧的项目中可能默认未选中该项。
深度缓冲区可以提高视觉质量,只要 Windows 可以使用 Unity 中主照相机上设置的近面和远面,将深度缓冲区中每个标准化像素的深度值准确地映射回以米为单位的距离。 尽管半透明渲染器通道在显示现有颜色像素的同时,写入深度缓冲区可能会混淆重投影,但如果渲染器通道以典型方式处理深度值,则通常情况下此处不应有任何问题。 如果你知道渲染器通道会使许多最终深度像素的深度值不准确,则通过取消选中“启用深度缓冲区共享”,可能可以获得更好的视觉质量。
注意
通常建议使用 16 位深度缓冲区来提高性能。 但是,如果使用 16 位深度格式,模具缓冲区所需效果(如某些 Unity UI 滚动面板)将不起作用,因为在此设置中,Unity 不会创建模具缓冲区 。 相反,选择 24 位深度格式通常会创建 8 位模具缓冲区 (如果适用于终结点图形平台) 。
使用剪切平面
在混合现实中,渲染离用户太近的内容可能会让人产生不舒服的感觉。 可以在照相机组件上调整近点剪切平面和远点剪切平面 。
选择“层次结构”面板中的“主照相机”
在“检查器”面板中,查找照相机组件“剪切平面”,并将“近点”文本框从“0.3”更改为“0.85” 。 渲染得更近的内容可能导致用户觉得不舒服,应根据渲染距离指南 加以避免。
重新定位照相机
如果要构建坐姿级别体验 ,可通过调用旧版 XR 中的 XR.InputTracking.Recenter 方法或 XR SDK 中的 XRInputSubsystem.TryRecenter 方法,将 Unity 的世界原点重新定位到用户当前头部位置。
隐形传送
此功能通常保留用于 VR 体验:
MRTK 提供了一个内置的传送系统 ,该系统可自动在铰接式手和控制器之间运行。
建议使用 MRTK 的传送实现。
如果选择不使用 MRTK,Unity 在 XR 交互工具包 中提供传送实现。
如果选择实现自己的传送,请记住不能直接移动照相机。 由于 Unity 控制用于头部跟踪的照相机,你需要在层次结构中为照相机提供一个父级,并改为移动该 GameObject。 这相当于 MRTK 的游戏空间。
建议使用 MRTK 的传送实现。
如果选择实现自己的传送,请记住不能直接移动照相机。 由于 Unity 控制用于头部跟踪的照相机,你需要在层次结构中为照相机提供一个父级,并改为移动该 GameObject。 这相当于 MRTK 的游戏空间。
重投影模式
HoloLens 和沉浸式头戴显示设备都将重新投影应用渲染的每一帧,这样就可以在发出光子时针对用户的实际头部位置的任何错误预测进行调整。
默认情况下:
如果应用为给定帧提供深度缓冲区,VR 沉浸式头戴显示设备将负责位置重投影 。 沉浸式头戴显示设备还会调整全息影像,以防止错误预测位置和方向。 如果未提供深度缓冲区,系统将只更正对方向的错误预测。
全息头戴显示设备(如 HoloLens 2)将负责位置重投影(无论应用是否提供其深度缓冲区) 。 在 HoloLens 上不需要深度缓冲区就可以进行位置重投影,因为在真实世界提供稳定背景的情况下,渲染通常是稀疏的。
MRTK 目前没有用于重投影模式的帮助程序。 有关详细信息,请参阅其他选项卡之一。
下一个开发检查点
如果你遵循了我们规划的 Unity 开发旅程,则目前正处于探索 MRTK 核心构建基块的过程中。 从这里,你可以继续了解下一部分基础知识:
或跳转到混合现实平台功能和 API:
你可以随时返回到 Unity 开发检查点 。
另请参阅