AR/VR底漆

本教程为您提供了进入AR和VR世界的跳板,在Godot游戏引擎中。

Godot3引入了一种新的架构,称为AR/VR服务器。在这个体系结构之上,特定的实现可以作为接口使用,其中大多数是基于gdnative的插件。本教程只关注由核心架构抽象的核心元素。这个体系结构有足够的特性,您可以创建一个完整的虚拟现实体验,然后可以为各种接口进行部署。然而,每个平台通常都有一些无法抽象的独特特性。这些特性将记录在相关接口上,并且不在本底漆的范围内。

AR/VR服务器

当godot启动时,每个可用的接口将向ar/vr服务器公开。GDNative接口被设置为singleton;只要它们被添加到项目中的GDNative singleton列表中,它们将使服务器知道它们自己。

你可以使用这个功能 get_interfaces() 要返回可用接口的列表,但是对于本教程,我们将使用 native mobile VR interface 在我们的例子中。这个界面是一个简单的实现,它使用手机上的3dof传感器进行定向,并向屏幕输出立体图像。它也在Godot核心中提供,并输出到桌面上的屏幕,这使得它非常适合于原型制作或像本教程这样的教程。

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

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

这段代码找到我们想要使用的接口,初始化它,如果成功的话,将主视区绑定到接口。最后一步是对界面的视区进行一些控制,它会自动在视区上启用立体渲染等功能。

对于我们的移动虚拟现实界面,以及主输入直接显示在屏幕上的任何界面,主视区需要是ARVR设置为真的视区。但是对于在外部附加设备上呈现的接口,可以使用辅助视区。在后一种情况下,在屏幕上显示其输出的视区将显示未变形的左眼,同时在设备上显示完全处理的立体输出。

最后,您应该只初始化一次接口;切换场景和重新初始化接口只会带来大量开销。如果要暂时关闭耳机,只需禁用视区或在视区中将ARVR设置为“假”。但在大多数情况下,一旦进入虚拟现实,你就不会关闭耳机,这会让玩家感到不安。

新的AR/VR节点

为了支持Godot中的AR和VR,增加了三种新的节点类型,特别是针对AR,增加了一种新的节点类型,如下所示:

  • ARVROrigin -我们的世界起点

  • ARVRCamera -摄像机的一个特殊子类,它是位置跟踪的。

  • ARVRController -跟踪控制器位置的新空间类

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

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

ARVROrigin 是一个重要的节点,您必须在场景中的某个地方有并且只有一个节点。此节点将真实世界跟踪空间的中心映射到虚拟世界中的某个位置。其他一切都是相对于这一点按位置跟踪的。这一点在不同的实现中所处的位置完全不同,但了解此节点如何工作的最佳示例是查看房间比例的位置。虽然我们有函数来调整点,使其在默认情况下位于玩家的中心,但原点将是您所在房间的中心位置。当你在房间里走来走去时,会根据这个中心位置跟踪HMD的位置,并且跟踪在虚拟世界中是镜像的。

为了简单起见,当您在房间内移动时,ARVR原点保持在原来的位置,相机和控制器的位置将根据您的移动进行调整。当你在虚拟世界中移动时,无论是通过控制器输入还是当你实现一个传送系统时,它都是你必须调整的原点的位置。

ARVRCamera 是第二个节点,它必须始终是场景的一部分,并且必须始终是源节点的子节点。它是Godot普通相机的一个子类。但是,它的位置会根据HMD的物理方向和位置自动更新每个帧。此外,由于渲染到HMD或渲染现实世界相机上的AR覆盖所需的精度,大多数标准相机属性都被忽略。使用的相机的唯一属性是近平面和远平面设置。FOV、纵横比和投影模式均被忽略。

注意,对于我们的本地移动虚拟现实实现,没有位置跟踪,只有电话的方向和扩展,HMD被跟踪。此实现人为地将相机放置在1.85的高度(Y)。

结论:在场景中使AR或VR工作的最小设置应如下所示:

../../_images/minimum_setup.png

这就是你开始所需要的。显然,你需要在你的场景中添加更多的东西,所以有一些东西要看,但是在那之后,你可以将游戏导出到你选择的手机上,将它弹出到一个查看器中,然后离开。

其他需要考虑的事项

在这本初级读物中,我们还需要简要介绍一些其他的主题,这些主题很重要。

第一个是我们的单位。在普通的3D游戏中,你不需要考虑很多单位。只要一切都在同一个尺度上,盒子大小为1个单位 scale。例如,将此值设置为10将更改坐标系,因此10个单位=1米。

性能是另一件需要仔细考虑的事情。尤其是虚拟现实对你的游戏的征税比大多数人想象的要多得多。对于移动虚拟现实,在这里你必须格外小心,但即使是桌面游戏,也有三个因素让生活变得格外困难:

  • 你是立体的,两个换一个。虽然工作负载并没有完全翻倍,并且考虑到支持新的多视图OpenGL扩展等问题,但是在为双眼呈现图像时仍然存在额外的工作负载。

  • 一个正常的游戏可以在30帧/秒的速度下运行,理想情况下可以管理60帧/秒。这使您可以在低端和高端硬件之间进行大范围的操作。然而,对于任何一个应用于AR或VR的HMD,60fps是绝对最小的,你应该以稳定的90fps为目标来运行游戏,以确保你的用户不会马上患上运动病。

  • 高视场和相关的镜头失真效果需要许多虚拟现实经验来渲染双倍的分辨率。是的,一只VIVE每只眼睛的分辨率可能只有1080x1200,因此我们将每只眼睛的分辨率渲染为2160x2400。对于大多数AR应用程序来说,这不是一个问题。

总而言之,与普通的3D游戏相比,你的GPU的工作量要高得多。虽然正在进行改进,例如多视图和中央凹渲染,但并非所有设备都支持这些功能。这就是为什么你看到许多虚拟现实游戏使用更艺术的风格,如果你密切关注那些虚拟现实游戏,你可能会发现它们在效果上更保守,或者使用一些好的老光学技巧。