AR/VR 示例

本教程为您提供了迈向Godot游戏引擎中AR和VR世界的跳板.

Godot 3中引入了一个新的框架, 称为AR/VR服务器. 在这个框架之上, 具体的实现可以将其作为接口使用, 其中大部分是基于GDNative的插件. 本教程只关注核心框架所抽象出的核心元素. 这个框架有足够的功能让你创建一个完整的VR体验, 然后可以为各种接口部署. 然而, 每个平台往往有一些独特的功能, 是不可能抽象出来的. 这样的功能将被记录在相关的接口上, 不属于本入门手册的范围.

AR/VR 服务器

当Godot启动时, 每个可用的接口都会让AR/VR服务器知道.GDNative接口被设置为单例;只要它们被添加到你项目中的GDNative单例列表中, 它们就会被服务器知道.

你可以使用函数 get_interfaces() 来返回一个可用的接口列表, 但在本教程中, 我们将在我们的例子中使用 native mobile VR interface. 这个接口是一个直接的实现, 使用手机上的3DOF传感器来确定方向, 并向屏幕输出立体图像. 它也可以在Godot核心中使用, 并在桌面输出到屏幕上, 这使它成为原型设计或像这样的教程的理想选择.

要启用接口, 请执行以下代码:

GDScriptC#

  1. var arvr_interface = ARVRServer.find_interface("Native mobile")
  2. if arvr_interface and arvr_interface.initialize():
  3. get_viewport().arvr = true
  1. var arvrInterface = ARVRServer.FindInterface("Native mobile");
  2. if (arvrInterface != null && arvrInterface.Initialize())
  3. {
  4. GetViewport().Arvr = true;
  5. }

这段代码找到我们希望使用的接口, 并对其进行了初始化, 如果成功的话, 将主视窗与该接口绑定. 这最后一步将视窗的一些控制权交给了接口, 从而自动实现了视窗上的立体渲染等功能.

对于我们的移动VR界面, 以及任何主要输入直接显示在屏幕上的界面, 主视窗需要是 arvr 被设置为 true 的那个视窗. 但是对于在外部连接设备上渲染的界面, 你可以使用一个辅助视窗. 在后一种情况下, 在屏幕上显示其输出的视窗将显示左眼的未扭曲版本, 而在设备上显示完成处理的立体输出.

最后, 您应该只初始化一次界面; 切换场景和重新初始化界面都会带来很多性能消耗. 如果您想暂时关闭耳机, 只需禁用视窗或在视窗上将 arvr 设置为 false. 不过, 在大多数情况下, 一旦玩家进入VR, 您最好不要禁用耳机, 因为这会让玩家感到很不舒服.

新的 AR/VR 节点

添加了三种新节点类型, 用于支持Godot中的AR和VR, 以及一种额外的节点类型, 尤其是AR. 这些是:

  • ARVROrigin - 我们在世界上的起源点

  • ARVRCamera - 一个特殊的相机子类, 可被定位追踪

  • ARVRController - 一个新的空间类, 它跟踪控制器的位置

  • ARVRAnchor - AR实现的一个定位点, 将真实世界的位置映射到您的虚拟世界

前两个必须存在于场景中,AR / VR才能工作, 本教程仅关注它们.

ARVROrigin 是一个重要的节点, 你必须在场景中某处有且仅有一个这样的节点. 该节点将现实世界的跟踪空间中心映射到虚拟世界的某个位置. 其他所有的东西都是相对于这个点进行位置跟踪. 这个点处在哪里, 有不同的实现, 但是理解这个节点如何工作的最好例子是看一个房间比例的位置. 虽然拥有函数可以调整这个点, 使其默认在玩家身上居中, 但原点将是你所在房间的中心位置. 当你在房间里实际走动时,HMD的位置会被跟踪到与这个中心位置的关系, 并且在虚拟世界中的跟踪是镜像的.

为了简单起见, 当你在房间里实际移动时,ARVR原点保持在原处, 摄像机和控制器的位置将根据你的移动而调整. 当你在虚拟世界中移动时, 无论是通过控制器输入还是实现传送系统, 你必须调整的是原点的位置.

ARVRCamera 是第二个节点, 它必须始终是你的场景的一部分, 它必须始终是你的原始节点的子节点. 它是Godot普通摄像机的一个子类. 然而, 它的位置在每一帧都会根据HMD的物理方向和位置自动更新. 同时, 由于向HMD渲染或在真实世界的相机上渲染AR覆盖所需的精度, 大多数标准的相机属性被忽略了.FOV, 长宽比和投影模式都被忽略了. 唯一使用的相机属性是近平面和远平面的设置.

请注意, 对于我们的原生移动VR实现来说, 没有位置追踪, 只有手机的方向, 以及延伸到HMD的方向被追踪. 这种实现方式人为地将摄像头置于1.85的高度(Y).

结论: 你在场景中使AR或VR工作的最低设置应该是这样的:

../../_images/minimum_setup.png

这就是你需要开始使用原生移动界面的全部内容. 显然, 你需要在你的场景中添加更多的东西, 所以有一些东西可以看, 但在那之后, 你可以把游戏导出到你选择的手机上, 把它插入一个浏览器, 然后就可以了.

官方插件和资源

前面提到过,Godot 没有自带对各种 VR 和 AR SDK 的支持,想要使用某个 SDK,就需要使用插件。GodotVR 仓库中有一些官方插件。

  • Godot OpenXR:自 Godot 3.4 开始,这是官方 XR 插件。支持 OpenXR,即设计与构建 VR 和 AR 软件的开放标准。已在 SteamVR、Monada、Oculus 的 OpenXR(桌面及移动平台)运行时环境中测试通过。

  • Godot Oculus Mobile 提供对 Meta Quest 的支持

    • 注意:自 Godot 3.4 起,该插件已弃用。我们推荐迁移到 Godot OpenXR 插件。
  • Godot OpenVR(不要与 OpenXR 混淆)支持 Steam 使用的 OpenVR SDK。

  • Godot Oculus 支持 Oculus SDK(仅桌面平台头戴设备)。

    • 注意:自 Godot 3.4 起,该插件已弃用。我们推荐迁移到 Godot OpenXR 插件。
  • Godot OpenHMD 支持 OpenHMD,这是一个开源的头戴设备 API 和驱动程序。

这些插件可以从 GitHub 或 Godot 素材库下载。

除了插件之外,还有几个官方的 demo。

其他需要考虑的事情

我们需要在本入门手册中简要介绍一些其他一些重要的知识。

首先是我们的单位。在一般的 3D 游戏中,你不需要考虑太多单位的问题。只要所有的东西都是一样的比例,单位体积的盒子可以是任意大小,小到可以拿在手里小熊,大到一栋楼房。在 AR 和 VR 中,这种情况会发生变化,因为虚拟世界中的东西会映射到现实世界中。如果在现实世界中向前走 1 米,但在你的虚拟世界中只向前移动了 1 厘米,就有了问题。你的控制器的位置也是一样的,如果它们没有出现在正确的相对空间,就会打破玩家的沉浸感。大多数 VR 平台,包括 AR/VR 服务器,都假设 1 个单位 = 1 米。不过为了方便起见,AR/VR 服务器还通过 ARVROrigin 节点暴露了一个属性,叫做世界尺度。例如,将其设置为 10 的值,就会改变我们的坐标系,此时 10 个单位 = 1 米。

性能是另一件需要仔细考虑的事情. 特别是VR对你的游戏的影响比大多数人意识到的要大得多. 对于移动VR, 你必须在这里格外小心, 但即使是桌面游戏, 也有三个因素使生活变得更加困难:

  • 你渲染的是立体影像,一举两得。虽然并没有完全把工作量加倍,但要在管线中支持新的 MultiView OpenGL 扩展之类的内容,为双眼渲染图像仍然存在额外的工作量

  • 一个正常的游戏可以在30fps的情况下运行, 最好能达到60fps. 这让你在低端和高端硬件之间有很大的发挥空间. 然而, 对于任何AR或VR的HMD应用,60fps是绝对的最低限度, 你应该把你的游戏定位在一个稳定的90fps运行, 以确保你的用户不会马上出现晕动症.

  • 高FOV和相关的镜头失真效果需要许多VR体验才能以两倍的分辨率呈现. 是的,VIVE可能只有每只眼睛1080x1200的分辨率, 因此我们将每只眼睛渲染为2160x2400. 对于大多数AR应用程序来说, 这不是一个问题.

总而言之, 与普通的3D游戏相比, 你的GPU的工作负荷要高得多. 虽然有一些事情正在进行中, 以改善这一点, 如MultiView和foveated rendering, 但这些并不是所有设备都支持的. 这就是为什么你看到许多VR游戏使用更多的艺术风格, 如果你密切关注那些追求现实主义的VR游戏, 你可能会注意到他们在效果上更保守一些, 或者使用一些好的老式光学技巧.