Latest Post

Meta 和 MOFAD 让您在增强现实中参观 Ebony 测试厨房 虚拟现实技术知识点总结

文章目录

教程说明

Meta Quest一体机具有直通功能。 它采用VST(Video See Through)技术,使用户能够通过头显看到真实场景,并且可以将虚拟物体融入到透视场景中与用户进行交互。 利用这个特性,我们可以开发一些混合现实MR应用,将虚拟与现实融为一体。

前期一体机开发所需的环境配置可以参考本教程:Unity VR开发教程:Meta Quest一体机开发(一)环境配置

电脑操作系统:Windows

使用的VR设备:Meta Quest 2

使用的Unity版本:2021.3.5 LTS(建议使用LTS版本2021及以上)

Oculus Integration版本:v54(目前也适用于v54及以上版本)

官方文档:

注意:本教程可能具有时间敏感性,因为 Oculus SDK 更新迭代相对较快。 如果你使用的SDK版本比我的新,如果不方便查看官方文档,也可以先尝试一下本教程的配置。 步骤,如果您发现教程过时,欢迎您提供反馈,我会及时对说明进行修改。 一切以官方文件为准。

最终的效果是在透视下看到真实场景中的虚拟物体。

在这里插入图片描述

配置Perspective的流式调试功能

开启此功能后,您可以在设备和计算机正在流式传输时运行支持透视的软件。 这时,你可以直接点击Unity编辑器中的运行按钮,在头显中看到透视场景。 这使得调试更加方便,无需将其打包到耳机中并每次都运行。

配置步骤很简单:

Quest 的系统版本必须为 v37 及以上。 Oculus PC 客户端软件版本必须为 v37 及以上,并确保设置 -> Beta 中的“开发者运行时功能”和“通过 Oculus Link 查看”选项已打开。

在这里插入图片描述

第 1 步:设置 OVRManager

首先,我们创建一个新场景并删除场景中的主摄像机。 然后搜索 OVRCameraRig Prefab 并将其拖到场景中。 这个物体相当于XR中的相机。

在这里插入图片描述

在 OVRCameraRig 中找到 OVR Manager 脚本。 接下来要做的步骤是:

1)在Quest Features的General选项中,将Passthrough Support设置为Supported或Required,这样打包的应用程序就可以启用透视功能。

2) 选中 Insight Passthrough 下的启用 Passthrough。 这将在应用程序启动时初始化透视函数。 如果不想在程序启动时初始化,可以取消勾选Enable Passthrough,然后在自己的脚本中设置OVRManager.instance.isInsightPassthroughEnabled = true/false来控制透视图的打开和关闭。 这里的效果相当于手动勾选或取消Enable Passthrough。

在这里插入图片描述

另外,OVR Manager 中有一个 Tracking Origin Type 参数需要注意。 它相当于跟踪参考系统。 参数分为眼位、地板位和舞台。

VR设备会跟踪头戴式显示器,因此现实世界头戴式显示器的位置和旋转数据将传输到Unity,以便Unity中的眼睛相机能够匹配现实生活中玩家的头戴式显示器及其位置和方向。 头显的位置和旋转数据是三维坐标,因此它们的值必须相对于一定的参考系。 这就是跟踪源类型参数派上用场的地方。 Oculus官方文档对这三种类型的定义如下:()

如果直观地看的话,Tracking Origin Type也相当于设置了VR世界中头部的初始高度。

如果选择“Floor Level”,则会以安全区域的地面为参考系(一般情况下,打开VR设备前会先设置地面高度,然后再绘制安全区域)作为参考系。 运行程序后,头部高度将以地面为参考点。 初始高度相当于放置在场景中眼睛摄像头的高度加上玩家耳机到现实安全区域地面的距离。

选择“Eye Level”时,HMD 本身将用作参考系统。 头部的初始高度与场景中放置的眼部摄像头的高度相同,现实中不会添加 HMD 到地面的额外距离。

选择Stage,它像Floor Level一样使用地面作为参考系统,但不会受到耳机重新定位的影响。 搬迁是什么意思? 以Quest为例,长按右手柄上的Oculus按钮或重新绘制安全区都会重新定位用户的位置和方向,或者可以说用户的位置和方向将重新定位在初始位置。 假设我们刚刚进入一个游戏,我们在现实中的位置相当于虚拟世界中的初始位置,在原点(0,0,0),然后一开始我们的正前方有一个方块。 这时候我们在现实中转90°,然后向前迈出一步,然后重新定位。 如果您选择Floor Level,则该方块将重新定位在我们面前,与初始位置不同; 如果选择舞台,则重新定位将不起作用,并且块仍将处于其原始位置。 您可以在阅读完本教程的全部内容后亲自尝试一下并感受其中的不同。 我还将在下面展示它们的差异。

在这里插入图片描述

⚡相机初始高度

眼睛高度:

在这里插入图片描述

楼层/舞台:

在这里插入图片描述

⚡楼层和舞台的区别

楼层:

在这里插入图片描述

阶段:

在这里插入图片描述

步骤 2:添加 OVRPassthroughLayer 脚本

接下来,我们在 OVRCameraRig 对象上添加 OVRPassthroughLayer 脚本,然后将 Placement 设置为 Underlay:

在这里插入图片描述

Quest中的透视真实场景相当于一个单独的图层,而我们的虚拟场景和虚拟物品相当于附加的图层。

当Placement设置为Underlay时,透视对应的真实层被放置在应用层的底部,此时真实层位于虚拟层下方。 可以理解为以真实场景为背景,虚拟物体叠加在真实场景上。 也可以理解为虚拟物体会遮挡真实物体。

当 Placement 设置为 Overlay 时,情况相反。 相当于将真实层放在应用程序的最上面,即真实层位于虚拟层之上。 这时,真实场景会覆盖整个虚拟场景,我们只能看到真实场景,看不到虚拟物体。

因为我们想要在透视下看到真实场景中的虚拟物体,所以我们必须选择Underlay。

位于“放置”参数下方的“合成深度”表示图层的深度。 值越小,渲染得越晚,即靠在前面渲染得越远。 该参数一般在使用多个透视图层时使用,因为Quest的透视API不仅可以将整个图层变成透视场景,即你看到的是完整的现实世界,还可以做到局部透视,例如,在虚拟物体表面添加透视图层,如下图:

在这里插入图片描述

合成深度通常用于多个透视层。 例如,如果有一个深度为0的对象和一个深度为1的对象,则首先渲染深度为1的对象,然后渲染深度为0的对象。 当物体放置在一起时,深度为 0 的物体会遮挡深度为 1 的物体。

不过,部分透视将在以后的教程中介绍,本教程中不再讨论。

第 3 步:将虚拟对象添加到场景中

我在 OVRCameraRig 对象前面添加了一个 Cube 方块:

在这里插入图片描述

但如果此时你尝试运行程序,你会发现即使OVRPassthroughLayer的Placement设置为Underlay,你仍然看不到真实的场景,只能看到虚拟的场景。 因为我们还有几步要做。

第四步:删除场景中的天空盒

如果渲染天空盒,因为我们之前已经将真实图层设置在虚拟图层下方,所以天空盒场景会覆盖真实场景。 根据需求,我们想要场景的全视角,所以不需要渲染天空盒。

在Unity菜单栏中选择Window -> Rendering -> Lighting,单击Environment选项,将Skybox Material设置为None。

在这里插入图片描述

第五步:设置相机

在Hierarchy面板中找到OVRCameraRig/TrackingSpace/CenterEyeAnchor子对象,它相当于我们的相机。

在这里插入图片描述

然后在Inspector面板中,将Camera组件的Clear Flags设置为Solid Color,然后将Background的alpha值设置为0,即设置背景的透明度为0。Background的颜色决定了背景的颜色透视场景。 如果设置为黑色(RGBA全为0),您将看到默认的透视颜色。 因为我使用的是Quest 2,如果我将背景设置为黑色,那么我看到的是Quest 2默认的黑白透视。如果是Quest pro或者后来的带有彩色透视的Quest设备,那么我看到的应该是色彩视角。 场景(与真实场景颜色相同)。

在这里插入图片描述

在这里插入图片描述

至此,透视环境配置完成。

最终效果:

在这里插入图片描述

笔记:

1)因为我们之前在OVRPassthroughLayer脚本中设置了Underlay,所以真实层将位于虚拟层下方。 当我们用真手伸入块时,真手将被虚拟块遮挡。

2)由于Meta的隐私政策,透视场景在Unity编辑器中看不到,但在耳机中可以正常显示。

同时,在Oculus/SampleFramework/Usage/Passthrough/Scene文件夹下还有一些官方提供的透视demo,大家可以研究一下。

在这里插入图片描述

不过需要注意的是,OVRCameraRig 的 OVRManager 脚本中的 Passthrough Support 需要确认选择了 Supported 或Required,才能在打包的程序中看到透视场景。

在这里插入图片描述