开发

最佳实践

健康与安全建议:在构建混合现实体验时,强烈建议您评估自己的内容,以便为您的用户打造舒适、安全的体验。在借助场景功能设计和开发应用之前,请参阅健康与安全设计准则。

概览

在开发中使用场景功能,会使您的体验变得更加复杂。本页解释了常见问题,并提供了使用场景功能的最佳实践:
  • 了解如何加载和更新您的场景。
  • 了解如何通过世界锁定功能来处理虚拟内容与现实世界之间的偏移。
  • 了解如何使用场景网格。

在使用场景功能和混合现实时选择追踪原点

您应根据您的体验来选择最合适的原点。例如,如果您的体验包含虚拟现实和混合现实,您可以选择最适合虚拟现实体验的追踪原点。在混合现实体验中可以使用舞台作为参考原点。在混合现实中,最佳实践是使用锚点来定位虚拟元素。这可以通过创建空间锚点来对齐相机设备,或者将对象与单个空间锚点进行父级关联,或者将对象直接与场景锚点进行父级关联。

加载和更新场景

应用什么时候应该加载场景功能或运行新的空间设置?

一般来说,我们建议在有需要时再加载场景功能。混合现实应用可能在启动时就会加载场景功能,因为体验会直接在混合现实中启动。如果您的应用程序主要是沉浸式 (VR),但有一个混合现实 (MR) 模式,建议当用户进入混合现实部分体验时加载场景功能。
如果场景功能加载成功,您需要判断用户是否在场景内还是远离场景——详见下文。

如何处理远离当前场景或位于另一层的场景?

由于用户会把 Quest 设备带到多个房间,应用程序可能会接收到一个距离当前用户位置较远的场景,甚至可能是在另一层楼的场景。应用程序可以采取一些简单的步骤来处理这些场景。
例如,一款游戏可能会使用场景功能将传送门放置在房间的墙壁上,透过这些传送门可以看到虚拟世界。用户从另一个房间启动该游戏时,可能会进入一个天空盒中,或者可能不会注意到设置在远处房间中的体验。对于这样的游戏,最好是让用户捕获他们当前所在的房间,而非使用远处已捕获的房间。
最佳实践是建议用户在当前场景外时捕获一个新场景。可以通过以下几种不同的方式实现:
  • 使用场景功能直接进行操作,在加载场景时检查用户是否处于场景内。一种方法是从用户位置向各个方向(上、下、左、右、前、后)射线检测场景元素 — 如果所有的射线投射都有碰撞结果,说明用户处于场景内。如果在场景外,提示用户使用场景捕获 API 捕获新场景。

处理偏移

在应用和设备会话过程中,像墙壁、桌子等表面,以及任何场景元素通常都可能会发生几厘米的偏移。以桌面为例,场景中物体的表面可能会比现实世界中高出或低几厘米。
混合现实实用程序包中的世界锁定功能可以处理偏移问题,并通过聚焦于根据偏移产生的轻微偏差来更新相机位置,从而保持虚拟坐标系的稳定。如果没有使用世界锁定功能,定期更新锚点的位置至关重要。由于系统会保持空间内锚点的相对位置对齐,优化的方法是只获取一个锚点的位置,并将其用作根转换。

适应用户体验

如果您的体验在某个表面上(如墙壁或桌面)显示互动元素,确保这些元素保持可互动性非常重要,即使该表面相对于实际的桌面或墙面向下偏移了几厘米。例如,桌面上虚拟按钮的“碰撞框”应该足够高,以便即使表面偏移几厘米,用户仍然可以点击它们。墙面上的虚拟元素或其他物体同样如此。

生成完整网格

如果您的应用需要一个封闭的房间布局,可以通过场景元素来生成。参考应用 Phanto 可以用作如何执行此操作的示例。

使用地面场景锚的 2D 边界

对应地面的场景锚具有一个边界,它是墙壁与地面交汇处的封闭 2D 折线。这个边界可用于点在多边形内的检测,以判断物体是否在房间内。它也可以用来代替墙面场景锚。不过,为了确保追踪的准确度,建议还是使用单独的墙面场景锚。

使用场景网格

场景网格是一种低保真度、高覆盖率的工件,用于描述房间内自由空间和占用空间的边界。它在空间设置过程中自动生成,并可供应用查询。在靠近天花板、地面和墙壁的位置,场景网格会与这些表面精准对齐;在靠近物体的地方,场景网格则会尽量描述这些物体的边界。

如何集成场景网格

我们建议将场景网格用于快速碰撞规避障碍物:对于短时间接触的刚体(例如弹跳的球)、投射物和粒子特效对象,场景网格可以实现虚拟内容与真实物体之间的真实碰撞。使用场景网格进行交集检查,有助于 AI 导航和内容放置时准确识别空间中的障碍物。尽管可以在这些使用案例之外使用场景网格,但需要格外小心,避免明显伪影破坏用户的沉浸体验。
场景网格并不会替代场景模型中的现有几何体(平面和体积)——对于简单碰撞,建议使用平面和体积几何体。虽然场景网格能捕获桌面上的杂物,但对于您的应用而言,使用桌面表面可能更合适。
场景网格可以与平面和体积几何体结合使用——场景网格可用于与次级虚拟内容发生碰撞,而应用大部分的虚拟与现实互动则发生在真实桌面上。
场景网格仅在空间设置期间进行捕获——动态移动的物体(如椅子、门、人或宠物)会被固定到场景网格中,但捕获后不会更新。建议引导用户以某种方式进行捕获,使应用能够有效使用场景网格。在应用启动时可视化网格,并清晰地展示所需的覆盖范围,将有助于缓解静态场景网格的局限性。

场景网格的局限性

我们不建议在任何需要高精度几何图形的任务中使用场景网格。
  • 避免将场景网格用于视觉效果。在许多情况下,由于缺乏准确的法线和对真实物体的完整覆盖,场景网格会产生不理想的效果,进而破坏体验。
  • 避免在物体或家具上放置内容,最好放置在地面、天花板和墙壁上。虽然在某些情况下,这样做看起来不错,但它很容易破坏沉浸式体验,视觉上突出显示某些不协调的地方。但粒子特效是个例外,它们存在的时间不宜过长,否则会暴露网格覆盖的局限性。
  • 避免在家具上攀爬或跳跃。虽然场景网格可以实现这一点,但我们建议设计避免与表面接触的角色,如气垫船、无人机或飞行生物,并让它们悬停在距离网格表面安全的高度(超过 10 厘米)。由于保真度低,行走生物在网格上攀爬可能看起来不够逼真。
  • 避免依赖法线精度。虽然在地面、天花板和墙壁的空旷区域,法线通常是准确的,但物体上的法线可能是无法预测的。需要精确的离表面弹跳或依赖法线来定位游戏元素的游戏玩法可能会受到影响,导致玩家的挫败感。
  • 避免缓慢碰撞和静态接触,最好选择快速碰撞。缓慢碰撞可能显得不真实,并暴露错误区域,而快速碰撞则使用户更难察觉。尤其要避免接触的内容。
  • 物体可能会卡住。虽然场景网格保证没有孔洞,但刚体可能会卡在狭窄的空间里。确保此类情况不会破坏玩家的体验,例如允许玩家召回/传送重要物品,或者在物体被抛掷后自动销毁它们。