Hololens 用内置的图像稳定系统来实现稳定性,它自动在后台运行,无须专门启动。当然,开发者也可以利用技术提高 Hologram 的稳定性,避免会降低稳定性的操作。
Hologram 质量术语
————————————————————————————————————————————————————————————————————————————————————————————
好的部署环境和好的应用开发都关系到 Hologram 的质量,在 HoloLens 能追踪周围情况的环境中部署能持续 60 帧每秒运行的应用可以保证 Hologram 和匹配的坐标系统的同步。对于用户来说,稳定性意味着 Hologram 不相对于环境而偏移。不佳的部署环境会导致不一致性、低渲染率等问题,以下术语用于分辨这些问题:
- 精确性 Hologram 一旦被固定在现实世界中,都应相对于周围环境保持在,即使有用户的运动和较小的环境变化。精确性问题 就是 Hologram 出现在了用户不期望的地方,两个看起来一样但实际不同的房间可能发生这种问题。
- 抖动 即用户看到的高频抖动的 Hologram,当对环境的追踪退化时可能发生这种情况,解决方案是使用sensor tuning (传感优化器)。
- 不稳定 低渲染频率会导致 holograms 的不均匀运动和重影,尤其当 holograms 在运动时。为此开发者需要保证持续的60 FPS。
- 漂移 用户看到 hologram 从原先被放置的位置移动开了,这种情况发生于 holograms 被放在离 spatial anchors (空间锚点)很远的地方时,尤其是放置在还没有被充分绘制的部分环境中。所以在离空间锚点近的地方创建 holograms 可降低漂移的可能性。
- 跳动 即 hologram 偶尔从原本位置突然跳开,这可能是追踪在调整 holograms 以匹配环境的更新变化。
- 摆动 hologram 随着用户的头部运动摇晃,当 holograms 没有放在 stabilization plane (稳定平面)或者 Hololens 没有为当前用户 calibrated校准时会发生这种情况。用户可运行calibration (校准应用)解决该问题, 开发者可更新 stabilization plane 进一步提高稳定性。
- 颜色分离 HoloLens 的显示是 color sequential display(色序显示),以 60Hz 闪现红-绿-蓝-绿的颜色通道(单个颜色字段?以240Hz显示)。 当用户用眼睛追踪 hologram 的运动时, hologram 是头尾边缘分离成它们的组成颜色,造成彩虹效应。颜色分离的程度取决于 hologram 运动的速度。极少数案例中,当注视一个静止的 hologram 时快速运动观察者的头部,也会造成彩虹效应。这就叫 color separation 颜色分离。
帧速率
————————————————————————————————————————————————————————————————————————————————————————————
帧速率是 hologram 稳定性的第一要素,展现给用户的每一幅图像必须绘制在正确的点上。 Hololens 的显示每秒刷新240次,每帧渲染图展现4个单独的颜色字段,所以用户体验到的帧速率是 60 FPS(帧每秒)。为尽可能提供更好的用户体验,开发者必须保证 60 FPS,即每16毫秒就要给操作系统提供一张新的图像。
60 FPS
为使 holograms 看起来与真实世界融合,Hololens 从用户的位置开始渲染图像。而图像渲染需要时间, Hololens 会在图像显示出时预测用户头部的位置,预测算法得到的是近似值。硬件系统调整渲染图片来计算预测头部位置和实际头部位置的差值,使用户眼中的图像看起来在正确的位置并且holograms 是稳定的。图像更新在较小的改变下运行良好,并且不能完全解决渲染中的问题,例如运动视差。
以60 FPS 渲染,从以下三个方面保持 holograms 的稳定:
- 最小化渲染和显示图像之间的整体延迟。在游戏线程和渲染线程同步运行的引擎中,以 30 FPS 运行会增加 33.3ms 的延迟。降低延迟以减少预测误差,从而提升 hologram 的稳定性。
- 使每张图像有一致的延迟。 如果以 30 FPS 渲染,显示却仍是 60 FPS,同一张图像被连续显示两次,第二帧比第一帧有 16.6ms 的延迟并且必须纠正更多的错误。这种误差值的不连续性会导致 60Hz 的抖动。
- 减少不均匀运动和重影的抖动。更快的 hologram 运动和更低的渲染率伴随着更明显的抖动,因此一直保证 60 FPS 可避免运动 hologram 的抖动。
帧速率的一致性
帧速率的一致性和高的帧速率一样重要。对任何内容丰富的应用来说偶尔的丢帧是不可避免的,HoloLens 利用一些复杂算法实现了丢帧故障恢复。当然,对用户来说,不断波动的帧速率比持续低帧速率运行更明显。例如,一个应用在前 5 帧以 60 FPS 渲染、接下来 10 帧又以 30 FPS 渲染,比一直用 30 FPS 渲染表现得更不稳定。
有关说明,在 mixed reality capture (混合现实捕获)运行时,操作系统会强制使应用降到 30 FPS。
性能分析
许多工具都可以用来测量应用的帧速率:
- GPUView
- Visual Studio Graphics Debugger
- 3D 引擎中的性能测试器,例如Unity
Hologram 渲染距离
————————————————————————————————————————————————————————————————————————————————————————————
视频: https://youtu.be/-606oZKLa_s
注视一个对象时,人的视觉系统集成了多个基于距离的信号。?
- Accommodation 调节 - 单眼焦点
- Convergence 会聚 - 双眼向内或向外移动以会聚目光于一个物体上
- Binocular vision 双目视觉 - 左右眼看到的图像差异取决于物体离你的注视点的距离
- 阴影,相对角尺寸以及其它的单眼信号
会聚和调节很独特,因为他们是视网膜外的信号,与眼睛为感知不同距离的物体的改变有关。会聚和调节是相关联的,当注视一个很近的物体时(例如你的鼻子),视线交点调节于一个很近的点上;注视无穷远处的物体时,视线是平行的,调节到无穷远处。Hololens 的显示固定于离用户约 2.0m 光学距离的地方,所以使用 HoloLens 时用户需要调节视线交点在 2.0m 处以获得清晰的图像。开发者把应用内容和 holograms 凡在不同的深度来控制用户视线的会聚点。用户调节和会聚视线到不同的距离时,这两个信号自然的连接被打破,导致视觉不适合疲劳,尤其是二者冲突很大时。把用户会聚的内容尽可能放在接近 2.0m 的地方,可以避免或者最小化冲突带来的视觉不适(例如在有深度的场景中,把用户感兴趣的内容尽可能放在接近 2.0m 距离的区域)。否则,在用户来回观察不同距离内容的情况下,会聚和调节的冲突会带来很大的不适感。换言之,观察一个放在 50cm 距离处的稳定的 hologram 比观察放在相同距离但是朝你来回运动的 hologram 在视觉上更舒适。
把内容放在 2.0m 处的另一个原因是双目的显示在这个距离完全重叠。如果把图像放在该平面区域外,当它们移动到全息框架边缘以外时会在一边的显示可见另一边的显示消失。这种双目对抗会破坏 hologram 的深度感知。
放置 hologram 的最佳距离
裁剪平面
为实现最佳舒适度,推荐渲染裁剪面在 85cm 处,并从 1m 的地方开始淡出内容。在用户和 hologram 都静止的应用中,观察 holograms 的舒适观察距离可达到 50cm,这种情形下,应用的裁剪平面不能低于 30cm并且从距离裁剪面至少 10cm 处开始淡出。一旦内容被放置的距离低于 85cm,就需要避免用户频繁靠近或远离 holograms、或者 holograms 频繁移向或远离用户的行为,因为这很可能导致会聚和调节冲突带来的不舒适感。尽可能减少用户与内容低于 85cm 距离的交互,如果必须低于这个距离,用户或 holograms 在深度方向运动的时间最好不要超过 25% 。
最佳实践
稳定平面
————————————————————————————————————————————————————————————————————————————————————————————
设备会自动选择稳定平面,开发者可以通过选择场景中的聚焦点(focus point)来帮助设备的选择。Unity 应用可通过 SetFocusPoint() 来选择最佳聚焦点。DirectX 应用的默认旋转立方体模板(spinning cube template)中包含设置聚焦点的例子。
// SetFocusPoint informs the system about a specific point in your scene to
// prioritize for image stabilization. The focus point is set independently
// for each holographic camera.
// You should set the focus point near the content that the user is looking at.
// In this example, we put the focus point at the center of the sample hologram,
// since that is the only hologram available for the user to focus on.
// You can also set the relative velocity and facing of that content; the sample
// hologram is at a fixed point so we only need to indicate its position.
renderingParameters.SetFocusPoint(
currentCoordinateSystem,
spinningCubeRenderer.Position
);
聚焦点的位置主要依赖于被观察的 hologram。app 提供了可参考的视线向量(gaze vector),设计者决定想要用户观察到的内容,对开发者来说提高 hologram 稳定性唯一重要的事就是以 60FPS 进行渲染。即使稳定平面得到了优化,低于 60FPS 的渲染也会显著降低 hologram 的稳定性。
最佳实践
例如:
- 如果应用包含平面内容(阅读类、视频播放类应用等),将稳定平面与内容平面对齐。
- 如果有3个固定的小球,将稳定平面经过用户视野中所有小球的中心。
- 如果场景中的内容在不同的深度,优先考虑远处的物体。
- 每一帧都要调整稳定点使之与用当前户观察的 hologram 一致。
注意事项
- 确保稳定平面的法向一致朝向摄像机(例如 -camera.forward)。设置了稳定平面后就不管它,容易造成稳定平面跑到用户身后去了或者连接到了一个不再出现在用户视野中的物体上。
- 不要使稳定平面忽前忽后地快速运动。
- 不要把稳定平面的距离和朝向设置成固定的。
- 不要使稳定平面穿过用户。
颜色分离
————————————————————————————————————————————————————————————————————————————————————————————
颜色分离很难避免,但以下方法可以缓解颜色分离现象:
会出现颜色分离的情形:
- 物体快速运动,包括光标(cursor)等绑定头部运动的物体。
- 物体离 stabilization plane(稳定平面)很远。
减少颜色分离现象的方法:
- 使物体滞后于用户目光的运动,物体看起来像是用弹簧与目光连接的并且有惯性。这减缓了cursor的运动(缩短分离距离)并把它放在用户可能的凝视点之后。只要在用户停止目光移动时物体能快速跟上运动,看起来就很自然。
- 如果要移动 hologram 并且需要用户观察到移动过程,尽量将移动速度保持在 5 度/秒以下。
- 用 light (光)而不是 geometry (几何形状或物体)来制作cursor。用与目光运动绑定在一起的的虚拟光照制作的交互指针不会造成颜色分离。
- 根据用户正在凝视的 hologram 调节稳定平面。
- 尽量使物体为纯色(红、绿或蓝)。
- 适当的时候把内容切换为模糊版本,例如将白色圆环光标转换为沿着移动方向的模糊线条
再次强调,实现 hologram 的稳定性最重要的方法是保持 60FPS 渲染率和设置稳定平面。如果发现了明显的颜色分离,首先要检查帧速率是否达到预期。
相关阅读
————————————————————————————————————————————————————————————————————————————————————————————
- Performance recommendations for HoloLens apps HoloLens 应用程序的性能推荐
- 颜色设计
交互原则