AR/VR示例
本教程为您提供了迈向Godot游戏引擎中AR和VR世界的跳板.
Godot 3中引入了一个新的框架,称为AR/VR服务器.在这个框架之上,具体的实现可以将其作为接口使用,其中大部分是基于GDNative的插件.本教程只关注核心框架所抽象出的核心元素.这个框架有足够的功能让你创建一个完整的VR体验,然后可以为各种接口部署.然而,每个平台往往有一些独特的功能,是不可能抽象出来的.这样的功能将被记录在相关的接口上,不属于本入门手册的范围.
AR/VR server
当Godot启动时,每个可用的接口都会让AR/VR服务器知道.GDNative接口被设置为单例;只要它们被添加到你项目中的GDNative单例列表中,它们就会被服务器知道.
你可以使用函数 get_interfaces().这个接口是一个直接的实现,使用手机上的3DOF传感器来确定方向,并向屏幕输出立体图像.它也可以在Godot核心中使用,并在桌面输出到屏幕上,这使它成为原型设计或像这样的教程的理想选择.
要启用接口,请执行以下代码:
GDScript
C#
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;
}
这段代码找到我们希望使用的接口,并对其进行了初始化,如果成功的话,将主视窗与该接口绑定.这最后一步将视窗的一些控制权交给了接口,从而自动实现了视窗上的立体渲染等功能.
对于我们的移动VR界面,以及任何主要输入直接显示在屏幕上的界面,主视窗需要是 arvr 被设置为 true
的那个视窗.但是对于在外部连接设备上渲染的界面,你可以使用一个辅助视窗.在后一种情况下,在屏幕上显示其输出的视窗将显示左眼的未扭曲版本,而在设备上显示完成处理的立体输出.
最后,您应该只初始化一次界面; 切换场景和重新初始化界面都会带来很多性能消耗. 如果您想暂时关闭耳机,只需禁用视窗或在视窗上将 arvr 设置为 false
. 不过,在大多数情况下,一旦玩家进入VR,您最好不要禁用耳机,因为这会让玩家感到很不舒服.
新的AR/VR节点
添加了三种新节点类型,用于支持Godot中的AR和VR,以及一种额外的节点类型,尤其是AR. 这些是:
ARVROrigin - 我们在世界上的起源点
ARVRCamera - 一个特殊的相机子类,可被定位追踪
ARVRController - 一个新的空间类,它跟踪控制器的位置
ARVRAnchor - AR实现的一个定位点,将真实世界的位置映射到您的虚拟世界
前两个必须存在于场景中,AR / VR才能工作,本教程仅关注它们.
:ref:`ARVROrigin <class_ARVROrigin>`是一个重要的节点,你必须在场景中某处有且仅有一个这样的节点.该节点将现实世界的跟踪空间中心映射到虚拟世界的某个位置.其他所有的东西都是相对于这个点进行位置跟踪.这个点处在哪里,有不同的实现,但是理解这个节点如何工作的最好例子是看一个房间比例的位置.虽然拥有函数可以调整这个点,使其默认在玩家身上居中,但原点将是你所在房间的中心位置.当你在房间里实际走动时,HMD的位置会被跟踪到与这个中心位置的关系,并且在虚拟世界中的跟踪是镜像的.
为了简单起见,当你在房间里实际移动时,ARVR原点保持在原处,摄像机和控制器的位置将根据你的移动而调整.当你在虚拟世界中移动时,无论是通过控制器输入还是实现传送系统,你必须调整的是原点的位置.
:ref:`ARVRCamera <class_ARVRCamera>`是第二个节点,它必须始终是你的场景的一部分,它必须始终是你的原始节点的子节点.它是Godot普通摄像机的一个子类.然而,它的位置在每一帧都会根据HMD的物理方向和位置自动更新.同时,由于向HMD渲染或在真实世界的相机上渲染AR覆盖所需的精度,大多数标准的相机属性被忽略了.FOV、长宽比和投影模式都被忽略了.唯一使用的相机属性是近平面和远平面的设置.
请注意,对于我们的原生移动VR实现来说,没有位置追踪,只有手机的方向,以及延伸到HMD的方向被追踪.这种实现方式人为地将摄像头置于1.85的高度(Y).
结论:你在场景中使AR或VR工作的最低设置应该是这样的:
这就是你需要开始使用原生移动界面的全部内容.显然,你需要在你的场景中添加更多的东西,所以有一些东西可以看,但在那之后,你可以把游戏导出到你选择的手机上,把它插入一个浏览器,然后就可以了.
官方插件和资源
前面说过,Godot并不是开箱就支持各种VR和AR SDK,需要特定SDK提供插件.在 GodotVR Repository ,有几个官方插件.
Godot Oculus Mobile <https://github.com/GodotVR/godot\_oculus\_mobile>\`\_提供对Oculus Go和Oculus Quest的支持.Quest需要额外的设置,详见 :ref:`doc_developing_for_oculus_quest.
`Godot OpenVR <https://github.com/GodotVR/godot_openvr>`_(不要与OpenXR混淆)支持Steam使用的OpenVR SDK.
Godot Oculus 支持Oculus SDK(仅PC平台头戴设备).
`Godot OpenHMD <https://github.com/GodotVR/godot_openhmd>`_支持OpenHMD,这是一个开源的API和耳机驱动程序.
`Godot OpenXR <https://github.com/GodotVR/godot_openxr>`_支持VR和AR软件的开放标准OpenXR.这个插件处于开发初期,只支持Linux,需要参考在资源库中描述的额外设置.
这些插件可以从 GitHub 或Godot资产库下载.
除了插件之外,还有几个官方的demo.
`Godot Oculus演示<https://github.com/GodotVR/godot-oculus-demo> `_.
Godot OpenVR FPS <https://github.com/GodotVR/godot\_openvr\_fps>\`\_(这个项目的教程是 :ref:`doc_vr_starter_tutorial_part_one).
`Godot XR工具<https://github.com/GodotVR/godot-xr-tools>`_,它展示了VR功能的实现,如移动和拾取物体.
其他需要考虑的事情
我们需要在本入门手册中简要介绍一些其他一些重要的知识.
首先是我们的单位.在一般的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游戏,你可能会注意到他们在效果上更保守一些,或者使用一些好的老式光学技巧.