(XR导航网 2024年08月30日)VR开发者社区正在探索创造一系列全新的机制,并展示了为什么MR是吸引Quest用户的最佳方式之一。为了帮助加速开发,Meta一直在努力推广已获得广泛接受的机制。
现在,这家公司将相关的推广机制统称为MR Motif,将其作为认可功能的蓝图,并帮助其他开发者在构建新MR体验时能够参考应用。MR Motif并非完整的应用,而是需要特定技术和API集合实现的常见功能方面。
在本文中,我们将介绍第一个MR Motif:透视过渡。
这是指从完全沉浸式体验过渡到混合现实体验,反之亦然。我们将讨论Passthrough透视是什么、在哪里以及如何使用它,以及其他开发者是如何利用Passthrough的魔力的。最后,你将能够掌握通过操纵滑块来调节周围环境的可见度,或者通过按下一个按钮直接从一种模式切换到另一种模式。
你可以在GitHub找到这个项目的所有源代码。
1. 概述
Passthrough技术利用设备的前置摄像头提供实时视频,从而帮助用户与虚拟元素交互,同时保持对真实环境的感知。这意味着用户可以在自己的空间里自由安全地活动。另外,Passthrough不仅只是作为背景元素,它同时允许你将用户的房间和家具融入游戏玩法中。
启用透视非常容易,但有一定的问题需要注意。在混合现实体验中使用透视需要单独的逻辑:Contextual Passthrough情境性透视和Conditional Passthrough条件性透视。
2. 如何在你的MR体验中启用透视
2.1.1 Contextual Passthrough情境性透视
是指应该根据系统建议启用透视的场景。换句话说,操作系统可以检测到这一点,并显示系统启动屏幕以及Passthrough中的Unity场景。在VR模式时,系统启动画面将以黑色背景显示。
2.1.2 在应用启动时使用Contextual Passthrough
启动屏幕是应用启动时显示的初始屏幕,通常显示应用的徽标或品牌,然后过渡到主要内容或界面。默认情况下,启动屏幕以黑色背景显示,并显示Unity徽标和/或应用徽标。对于直接进入Passthrough视图的MR应用,如果加载屏幕在后台显示Passthrough,用户体验通常会更好。
Meta OS已经允许你在Unity的OVR管理器组件打开System Splash Screen Background选项,并将其更改为Passthrough(Contextual)。
重要的是要确保“Show Splash Screen/显示启动画面”未选中,并且在Unity项目设置中没有为虚拟现实启动画面选择纹理。请记住,目前这个内置的启动画面只能通过Unity Pro许可证关闭。最后,你需要更新项目中的Android Manifest文件。要做到这一点,你需要进入“Meta”,然后进入“Tools”,并更新Android Manifest文件。
2.1.3 在你的应用中利用Contextual Passthrough
根据系统的建议,你可能希望部署VR或Passthrough背景。建议可通过以下方式获得:
passthroughToggled = OVRManager.IsPassthroughRecommended();
你可能希望将这个首选项保存在一个布尔变量中,以便以后更容易相应地启用或禁用透视层。将这种方法与Contextual Passthrough系统启动画面相结合,你可以提供不间断的用户体验。
2.1.4 使用Contextual Passthrough的一个热门示例
使用这种技术的热门应用通常将Passthrough作为其核心体验模式。这方面的一个例子是《Cubism》。在这款游戏中,启用MR模式的用户可以加载带有背景Passthrough启动画面的游戏,并继续在Passthrough中体验实际体验。
2.2.1 Conditional Passthrough条件性透视
另一种利用Passthrough的方法是使用它在MR和VR游戏模式之间切换,或有条件地切换到Passthrough(例如打开菜单,双击设备,改变场景,或有条件地淡入和淡出体验)。所有这一切用例都需要一种方法来有条件地在完全沉浸式VR和透视场景之间按命令切换。在特定时间展示整个环境或部分环境可以帮助玩家产生舒适感和沉浸感,从而提高留存率。
2.2.2 切换模式的直接方式
切换模式最直接的方法是简单地启用或禁用透视层,并更改主camera的clear flag和背景颜色。你同时可能希望实现一个切换方法并引入一个布尔变量,例如“passthroughToggled”,以便在运行时根据需要在模式之间准确切换。
passthroughLayer.enabled = passthroughToggled; camera.clearFlags = passthroughToggled ? CameraClearFlags.SolidColor : CameraClearFlags.Skybox; camera.backgroundColor = passthroughToggled ? Color.clear : Color.white;
尽管这种解决方案提供了一种简单的模式切换方法,但如果你的应用体验在Passthrough MR模式和沉浸式VR模式之间多次切换,你可能需要找到一种更优雅的过渡方式。
2.2.3 通过推荐方式切换模式
重要的是,启用Passthrough是异步的。像摄像头这样的系统资源可能需要几百毫秒来激活,在此期间Passthrough尚未被系统渲染。如果你的应用程序希望在启用后立即可见Passthrough,则可能会导致黑色闪烁。
你可以通过使用““PassthroughLayerResumed” event来避免这个问题,它可以层完全初始化并且Passthrough可见时发出。我们的目标是在两种模式之间顺利过渡,而不是立即从Passthrough切换到VR。
在XR应用中,在场景或模式之间淡出的一种常用方法是使用淡出屏幕,它通常由位于主camera前面的四个屏幕组成。通常情况下,开发者会顺利地将四边形材料淡出,你可以在Passthrough和VR之间使用类似的方法。Meta已经发布了一个名为“SelectivePassthrough”的着色器,这是Unity的Meta Core SDK的一部分,可以帮助你有选择地显示Passthrough。另外,当使用Passthrough Window Building Block时,你同样可以看到这个着色器的用例。
着色器允许你将屏幕像素变为透明并显示Passthrough。这就是你将使用的Passthrough渐变着色器。为了获得更平滑的渐变效果,你需要在OVRManager和OVRManager.eyeFovPremultipliedAlphaModeEnabled = false; in the Awake() 函数禁用premultiplied alpha模式。
禁用eyeFovPremultipliedAlphaModeEnabled将从premultiplied alpha混合切换到standard alpha blending。premultiplied alpha有时会导致视觉伪影,如闪烁或光晕效果,特别是在处理半透明像素或特定照明条件时。通过禁用它,你将使用standard alpha blending,这能够更好地应对相关情况,并产生更流畅的视觉效果。
2.2.4 为平滑转换创建逻辑
我们已经描述了如何通过调整_InvertedAlpha属性来渐变材质。
然而,如果你想实现渐变淡出,你将需要一个新的属性:_FadeDirection。在片段着色器中,你需要引入一个新的变量来调整颜色的alpha值。
接下来,你要从你的着色器中创建一个材质,在主camera创建一个球体,并将材质附加到这个球体。渐变逻辑应该会附加到球体,这样它就可以获取到meshrenderer的引用。脚本应该包含一个FadeDirection枚举,用于定义渐变效果的方向。逻辑的主要部分可以是切换Passthrough层并开始渐变效果的切换方法。如果目标alpha值为1,它开始逐渐消失。如果目标alpha为零,则启用透视层。你将需要将这个函数绑定到物理按钮或UI面板。
你可以在每次渐变完成时禁用或启用你的球体,并切换camera的clear flag和背景颜色。或者,如果你的游戏需要它,你可以让球体一直处于开启状态。这同时有一个额外的好处,亦即能够设置一个固定的距离,让你在Passthrough模式下看到虚拟内容。
2.2.5 使用Conditional Passthrough的一个热门示例
《 Wooorld》是一款使用Conditional Passthrough模式的热门应用。通过流畅地从透视MR模式切换到完全沉浸式VR模式,它提供了令人信服的用户体验。
2.2.6. 在透视模式下移除边界
尽管边界是完全沉浸式应用程序所需的重要安全系统,但它可能会减损MR体验。Boundary API 提供了一种通过Contextual Boundaryless来禁用边界的机制,它允许你的应用在没有边界的情况下运行。Boundary API可以通过Unity中的OVRManager组件访问。
为了启用对Boundary API的支持,有必要在OVRManager的任务特性中选择“支持”或“必需”。透视支持不能选择为“无”。另外,你需要勾选“Insight Passthrough & Guardian Boundary”下面的“Should Boundary Visibility Be Suppressed”框框。
要将更改应用到APK,你需要转到“Meta”,然后转到“Tools”,然后更新android manifest文件。值得一提的是,你只能在Passthrough模式下禁用边界,并且只能在设备运行应用时禁用边界,而不是出于安全原因在完全沉浸式模式下禁用边界。
你同时可以选择完全关闭边界。无边界应用在整个体验中禁用边界,并且不能有任何沉浸式体验。确保你的应用可以安全地在整个应用体验中禁用边界至关重要。
资源
本指南的源代码请访问这里。有关更多最佳实践和故障排除,请查看官方Passthrough文档。