WebXRInterface

Inherits: ARVRInterface < Reference < Object

使用 WebXR 的 AR/VR 接口。

描述

WebXR是一个开放标准,允许创建在网络浏览器中运行的VR和AR应用程序。

因此,这个界面只有在HTML5导出中运行时才能使用。

WebXR支持广泛的设备,从能力很强的设备(如Valve Index、HTC Vive、Oculus Rift和Quest)到能力较弱的设备(如Google Cardboard、Oculus Go、GearVR或普通智能手机)。

由于WebXR是基于Javascript的,它大量使用回调,这意味着WebXRInterface被迫使用信号,而其他AR/VR界面会使用立即返回结果的函数。这使得WebXRInterface的初始化比其他AR/VR接口要复杂很多。

下面是启动一个沉浸式VR会话所需的最小代码。

  1. extends Spatial
  2. var webxr_interface
  3. var vr_supported = false
  4. func _ready():
  5. # 我们假设这个节点有一个按钮作为子节点。
  6. # 这个按钮是让用户同意进入沉浸式VR模式。
  7. $Button.connect("pressed", self, "_on_Button_pressed")
  8. webxr_interface = ARVRServer.find_interface("WebXR")
  9. if webxr_interface:
  10. # WebXR使用了大量的异步回调,
  11. # 所以我们要连接各种信号来接收它们。
  12. webxr_interface.connect("session_supported", self, "_webxr_session_supported")
  13. webxr_interface.connect("session_started", self, "_webxr_session_started")
  14. webxr_interface.connect("session_ended", self, "_webxr_session_ended")
  15. webxr_interface.connect("session_failed", self, "_webxr_session_failed")
  16. # 这将立即返回——自身的_webxr_session_supported()方法
  17. # (我们在上面连接了'session_supported' 信号)将在稍后被调用
  18. # 让我们知道它是否被支持。
  19. webxr_interface.is_session_supported("immersive-vr")
  20. func _webxr_session_supported(session_mode, supported):
  21. if session_mode == 'immersive-vr':
  22. vr_supported = supported
  23. func _on_Button_pressed():
  24. if not vr_supported:
  25. OS.alert("Your browser doesn't support VR")
  26. return
  27. # 获得沉浸式的VR体验,而不是AR('immersive-ar')
  28. # 或一个简单的3DoF查看器('viewer')。
  29. webxr_interface.session_mode = 'immersive-vr'
  30. # 'bounded-floor'是房间大小,'local-floor'是站着或坐着的
  31. # 体验(如果你有3DoF耳机,它会让你离地面1.6米)。
  32. # 而'local'则是让你在ARVROrigin处。
  33. # 这个列表意味着它将首先尝试请求 "bounded-floor",
  34. # 如果没有其他支持的话,就退而求其次,选择 "local-floor",
  35. # 如果没有别的就选 "local" 支持。
  36. webxr_interface.requested_reference_space_types = 'bounded-floor, local-floor, local'
  37. # 为了使用'local-floor'或'bounded-floor',
  38. # 我们须标记这些特征。
  39. webxr_interface.required_features = 'local-floor'
  40. webxr_interface.optional_features = 'bounded-floor'
  41. # 如果无法请求会话,这将返回false。
  42. # 然而,在这个过程中,它仍然可能异步失败
  43. # 只有在
  44. # _webxr_session_started()或_webxr_session_failed()方法被调用时,才知道它是否真的成功或失败。
  45. if not webxr_interface.initialize():
  46. OS.alert("Failed to initialize")
  47. return
  48. func _webxr_session_started():
  49. $Button.visible = false
  50. # 这告诉Godot开始进行渲染。
  51. get_viewport().arvr = true
  52. # 这将是您从上面请求的类型中最终得到的引用空间类型。
  53. # 如果你想让游戏在'bounded-floor'和 'local-floor' 中有一点不同,
  54. # 这是很有用的。
  55. print ("Reference space type: " + webxr_interface.reference_space_type)
  56. func _webxr_session_ended():
  57. $Button.visible = true
  58. # 如果用户退出沉浸模式,
  59. # 我们就会告诉Godot重新渲染到网页上。
  60. get_viewport().arvr = false
  61. func _webxr_session_failed(message):
  62. OS.alert("Failed to initialize: " + message)

有几种方法来处理 “controller” 控制器的输入。

你可以使用这些方法中的一个或全部,让你的游戏或应用程序支持更广泛或更窄的设备和输入方法,或者允许与更高级的设备进行更高级的交互。

教程

属性

PoolVector3Array

bounds_geometry

String

optional_features

String

reference_space_type

String

requested_reference_space_types

String

required_features

String

session_mode

String

visibility_state

方法

ARVRPositionalTracker

get_controller ( int controller_id ) const

void

is_session_supported ( String session_mode )

信号

  • reference_space_reset ( )

发出该消息以表明引用空间已被重置或重新配置。

何时或是否发出取决于用户的浏览器或设备,但可能包括当用户改变了他们的游戏空间的尺寸,你可以通过bounds_geometry访问,或按下/按住一个按钮来重新定位他们的位置。

参阅WebXR的XRReferenceSpace重置事件


  • select ( int controller_id )

当一个“controller”控制器完成其“primary action”主要动作后触发。

使用 get_controller 来获得更多关于控制器的信息。


  • selectend ( int controller_id )

当一个“controller”控制器完成其“primary action”主要动作时触发。

使用 get_controller 来获得更多关于控制器的信息。


  • selectstart ( int controller_id )

当一个“controller”控制器开始其“primary action”主要动作时触发。

使用 get_controller 来获得更多关于控制器的信息。


  • session_ended ( )

当用户结束WebXR会话时触发,可以使用浏览器或设备的用户界面来完成。

此时,你应该执行get_viewport().arvr = false来指示Godot恢复对屏幕的渲染。


  • session_failed ( String message )

如果会话启动失败,由ARVRInterface.initialize触发。

message可以选择包含一个来自WebXR的错误信息,如果没有信息,则为空字符串。


  • session_started ( )

如果会话成功启动,由ARVRInterface.initialize触发。

此时,应该执行get_viewport().arvr = true来指示Godot开始向AR/VR设备进行渲染是安全的。


  • session_supported ( String session_mode, bool supported )

is_session_supported触发,表示是否支持指定的session_mode


  • squeeze ( int controller_id )

当其中一个“controller”控制器完成其“primary squeeze action”主要按压动作后触发。

使用 get_controller 来获得更多关于控制器的信息。


  • squeezeend ( int controller_id )

当其中一个“controller”控制器完成其“primary squeeze action”主要按压动作时触发。

使用 get_controller 来获得更多关于控制器的信息。


  • squeezestart ( int controller_id )

当其中一个“controller”控制器开始其“primary squeeze action”主要按压动作时触发。

使用 get_controller 来获得更多关于控制器的信息。


  • visibility_state_changed ( )

visibility_state已更改时触发。

属性说明

Getter

get_bounds_geometry()

定义用户游戏区域边界的多边形的顶点。

这仅在 reference_space_type"bounded-floor" ,并且仅在支持它的某些浏览器和设备上可用。

reference_space_reset 信号可以指示何时改变。


Setter

set_optional_features(value)

Getter

get_optional_features()

ARVRInterface.initialize 设置 WebXR 会话时使用的可选功能的逗号分隔列表。

如果用户的浏览器或设备不支持指定的功能,初始化将继续,但您将无法使用请求的功能。

这对已经初始化的接口没有任何影响。

可能的值来自 WebXR 的 XRReferenceSpaceType。如果要使用特定的引用空间类型,则必须将其列在 required_featuresoptional_features 中。


Getter

get_reference_space_type()

引用空间类型,来自requested_reference_space_types属性中设置的请求类型列表,最终由ARVRInterface.initialize在设置WebXR会话时使用。

可能的值来自WebXR的XRReferenceSpaceType。如果你想使用一个特定的引用空间类型,它必须被列入required_featuresoptional_features中。


  • String requested_reference_space_types

Setter

set_requested_reference_space_types(value)

Getter

get_requested_reference_space_types()

ARVRInterface.initialize 设置 WebXR 会话时使用的引用空间类型的逗号分隔列表。

按顺序请求引用空间类型,将使用用户设备或浏览器支持的第一个。 reference_space_type 属性包含最终使用的引用空间类型。

这对已经初始化的接口没有任何影响。

可能的值来自 WebXR 的 XRReferenceSpaceType。如果要使用特定的参考空间类型,则必须将其列入 required_featuresoptional_features 中。


Setter

set_required_features(value)

Getter

get_required_features()

ARVRInterface.initialize 设置 WebXR 会话时使用的所需功能的逗号分隔列表。

如果用户的浏览器或设备不支持指定的功能,初始化将失败并发出 session_failed

这对已经初始化的接口没有任何影响。

可能的值来自 WebXR 的 XRReferenceSpaceType。如果要使用特定的参考空间类型,则必须将其列入 required_featuresoptional_features 中。


Setter

set_session_mode(value)

Getter

get_session_mode()

设置WebXR会话时,ARVRInterface.initialize所使用的会话模式。

在已经初始化的情况下,这对接口没有任何影响。

可能的值来自WebXR的XRSessionMode,包括:"immersive-vr", "immersive-ar", 和"inline"


Getter

get_visibility_state()

指示用户是否可以看到 WebXR 会话的图像。

可能的值来自 WebXR 的 XRVisibilityState,包括 "hidden", "visible", 和 "visible-blurred"

方法说明

获取给定 controller_idARVRPositionalTracker

在 WebXR 的上下文中, “controller”控制器可以是高级 VR 控制器,如 Oculus Touch 或 Index 控制器,甚至可以是屏幕上的点击、语音命令或设备本身的按钮按下。当使用非传统控制器时,将 ARVRPositionalTracker 的位置和方向解释为指向用户希望与之交互的对象的射线。

使用此方法获取有关触发以下信号之一的控制器的信息:


  • void is_session_supported ( String session_mode )

检查给定的session_mode是否被用户的浏览器支持。

可能的值来自WebXR的XRSessionMode,包括:"immersive-vr", "immersive-ar", 和"inline"

此方法不返回任何东西,而是将结果发送给session_supported信号。