WebXRInterface¶
继承: XRInterface < RefCounted < Object
使用 WebXR 的 AR/VR 接口。
描述¶
WebXR是一个开放标准,允许在Web浏览器中创建VR和AR应用程序。
因此,此接口仅在Web导出中运行时可用。
WebXR支持各种各样的设备,从功能强大的设备(例如Valve索引,HTC Vive,Oculus Rift和Quest)到功能较低的功能(例如Google Cardboard,Oculus Go,GearVR或Plain Smarthones)。
由于WebXR基于JavaScript,因此广泛使用回调,这意味着 WebXRInterface 被迫使用信号,其他XR接口将使用立即返回结果的功能。 这使 WebXrinterface 比其他XR接口要复杂得多。
这是开始沉浸式VR会话所需的最低代码:
extends Item3D
var webxr_interface
var vr_supported = false
func _ready():
# 我们假设该节点小时候有一个按钮。
# 此按钮是为了让用户同意输入沉浸式VR模式。
$Button.pressed.connect(self._on_button_pressed)
webxr_interface = XRServer.find_interface("WebXR")
if webxr_interface:
#Webxr使用许多异步回调,因此我们连接到各种
# 信号以接收它们。
webxr_interface.session_supported.connect(self._webxr_session_supported)
webxr_interface.session_started.connect(self._webxr_session_started)
webxr_interface.session_ended.connect(self._webxr_session_ended)
webxr_interface.session_failed.connect(self._webxr_session_failed)
# 这立即返回 - 我们的_webxr_session_supported()方法
# (我们连接到上面的“ session_support”信号)将
webxr_interface.is_session_supported(“ immersive-vr”)
func _webxr_session_supported(session_mode, supported):
if session_mode == 'immersive-vr':
vr_supported = supported
func _on_button_pressed():
if not vr_supported:
OS.alert("Your browser doesn't support VR")
return
# 我们想要一个沉浸式VR会议,而不是AR(“沉浸式AR”)或
# 简单3DOF查看器('viewer')。
webxr_interface.session_mode = 'immersive-vr'
# '有限的地板“是房间尺度,“本地地板”是站立或坐着
# 经验(如果有3DOF耳机,它将使您在地面上16m),
# 而“本地”使您对Xrorigin放下。
# 此列表意味着它将首先尝试请求“有界地板”,然后
webxr_interface.requested_reference_space_types = 'bounded-floor, local-floor, local'
# 为了使用“本地地板”或“有界地板”,我们也必须
# 根据需要或可选标记功能。 通过包括“手动”
# 作为可选功能,如果支持,它将启用。
webxr_interface.required_features = 'local-floor'
webxr_interface.optional_features = 'bounded-floor, hand-tracking'
# 如果我们甚至无法请求会话,这将返回false,
# 但是,在此过程的后期,它仍然可以异步失败,所以我们
# 只知道当我们的时候真的成功还是失败了
# _webxr_session_started() 或者 _webxr_session_failed() 调用方法。
if not webxr_interface.initialize():
OS.alert("Failed to initialize")
return
func _webxr_session_started():
$Button.visible = false
# 这告诉I3D Act 开始渲染到耳机。
get_viewport().use_xr = true
# 这将是您最终获得的参考空间类型
# 您上面要求的类型。 如果您希望应用能够
# 在“界面”与“本地地板”中的工作有所不同。
print("Reference space type: ", webxr_interface.reference_space_type)
# 这将是成功启用的功能列表
# (除了不支持此属性的浏览器外).
print("Enabled features: ", webxr_interface.enabled_features)
func _webxr_session_ended():
$Button.visible = true
# 如果用户退出沉浸式模式,那么我们告诉i3d渲染到网络
# 再次页面。
get_viewport().use_xr = false
func _webxr_session_failed(message):
OS.alert("Failed to initialize: " + message)
有几种处理“控制器”输入的方法:
使用 XRController 的节点及其 XRController.button_pressed 和 XRController.button_released 信号。在 i3D 的 XR 应用程序中,这是处理控制器的常见方式,不过仅适用于像 Oculus Touch 或 Index 控制器这样的高级 VR 控制器,例如。
使用 select, squeeze 以及相关的信号。这种方法不仅适用于高级的虚拟现实控制器,也适用于诸如在屏幕上轻触、说出语音指令或者直接在设备上按下按钮等非传统输入方式。
您可以同时采用这两种方法,以使您的应用或应用程序能够支持更广泛或更有限的设备及输入方式,或者能够与更高级的设备实现更高级别的交互。
属性¶
方法¶
get_display_refresh_rate() const |
|
get_input_source_target_ray_mode(input_source_id: int) const |
|
get_input_source_tracker(input_source_id: int) const |
|
is_input_source_active(input_source_id: int) const |
|
void |
is_session_supported(session_mode: String) |
void |
set_display_refresh_rate(refresh_rate: float) |
信号¶
display_refresh_rate_changed() 🔗
显示器的刷新率发生改变后触发。
reference_space_reset() 🔗
发出此信号表示参考空间已被重置或重新配置。
此信号(或是否会发出)取决于用户的浏览器或设备,但可能包括用户更改其应用空间尺寸的时刻(您或许可以通过 XRInterface.get_play_area() 方法获取这一信息),或者按下/保持按钮以重新定位自身位置的时刻。
请参阅 WebXR's XRReferenceSpace reset event 以获取更多信息。
select(input_source_id: int) 🔗
在其中一个输入源完成其“主要操作”之后发出。
使用 get_input_source_tracker() 和 get_input_source_target_ray_mode() 以获取有关输入源的更多信息。
selectend(input_source_id: int) 🔗
当其中一个输入源完成其“主要操作”时便会发出此信号。
使用 get_input_source_tracker() 和 get_input_source_target_ray_mode() 以获取有关输入源的更多信息。
selectstart(input_source_id: int) 🔗
当输入源之一启动其“主要动作”时发出。
Use get_input_source_tracker() and get_input_source_target_ray_mode() to get more information about the input source.
session_ended() 🔗
当用户结束WebXR会话时发射(可以使用浏览器或设备的UI完成)。
在这一点上,你应该做 get_viewport().use_xr = false 指示i3D Act 恢复渲染到屏幕。
.. rst-class:: classref-item-separator
session_failed(message: String) 🔗
发出 XRInterface.initialize() 如果会话未能开始。
message 可以选择包含来自WebXR的错误消息,或者如果没有消息,则可以包含一个空字符串。
.. rst-class:: classref-item-separator
session_started() 🔗
发出 XRInterface.initialize() 如果会话成功开始。
在这一点上,这是安全的 get_viewport().use_xr = true 指示I3D Act 开始渲染到XR设备。
session_supported(session_mode: String, supported: bool) 🔗
由 is_session_supported() 触发,表示是否支持指定的 session_mode。
squeeze(input_source_id: int) 🔗
在其中一个输入来源完成了“主要的挤压动作”后发出。
使用 get_input_source_tracker() 和 get_input_source_target_ray_mode() to get more information about the input source.
squeezeend(input_source_id: int) 🔗
当其中一个输入来源完成其“主要挤压动作”时,发出。
Use get_input_source_tracker() and get_input_source_target_ray_mode() to get more information about the input source.
squeezestart(input_source_id: int) 🔗
当其中一个输入来源开始其“主要挤压动作”时,发出。
使用 get_input_source_tracker() 和 get_input_source_target_ray_mode() to get more information about the input source.
visibility_state_changed() 🔗
当 visibility_state 已更改时触发。
枚举¶
enum TargetRayMode: 🔗
TargetRayMode TARGET_RAY_MODE_UNKNOWN = 0
不知道目标射线模式。
TargetRayMode TARGET_RAY_MODE_GAZE = 1
目标射线从观察者的眼睛出发,指向所观察的方向。
TargetRayMode TARGET_RAY_MODE_TRACKED_POINTER = 2
目标射线由手持指示器发射,很可能是 VR 触摸控制器。
TargetRayMode TARGET_RAY_MODE_SCREEN = 3
目标射线由触摸屏、鼠标等触觉输入设备发射。
属性说明¶
String get_enabled_features()
由逗号分隔的功能列表成功启用了 XRInterface.initialize() 设置WebXR会话时.
这可能包括设置要求的功能 required_features 和 optional_features, and will only be available after session_started has been emitted.
Note: 这可能不是所有Web浏览器的支持,在这种情况下,它将是一个空字符串。
由逗号分隔的可选功能列表 XRInterface.initialize() 设置WebXR会话时。
如果用户的浏览器或设备不支持给定功能之一,则初始化将继续,但是您将无法使用请求的功能。
当已经初始化时,这对接口没有任何影响。
可能的值来自 WebXR's XRReferenceSpaceType, 或包括其他功能 "hand-tracking" 启用手动跟踪。
String get_reference_space_type()
参考空间类型 (从在此处设置的请求类型列表中 requested_reference_space_types 属性), 最终被 XRInterface.initialize() 设置WebXR会话时。
可能的值来自 WebXR's XRReferenceSpaceType. 如果要使用特定的参考空间类型,则必须在任何一个中列出 required_features 或者:ref:optional_features<class_WebXRInterface_property_optional_features>.
String requested_reference_space_types 🔗
void set_requested_reference_space_types(value: String)
String get_requested_reference_space_types()
由逗号分隔的参考空间类型列表 XRInterface.initialize() 设置WebXR会话时。
按顺序要求参考空间类型,将使用用户设备或浏览器支持的第一个类型。 这 reference_space_type 属性包含最终选择的参考空间类型。
当已经初始化时,这对接口没有任何影响。
可能的值来自 WebXR's XRReferenceSpaceType. 如果要使用特定的参考空间类型,则必须在任何一个中列出 required_features or optional_features.
逗号分隔的列表,用于使用的所需功能 XRInterface.initialize() 设置WebXR会话时。
如果用户的浏览器或设备不支持给定功能之一,则初始化将失败,并且 session_failed 将发出。
当已经初始化时,这对接口没有任何影响。
可能的值来自 WebXR's XRReferenceSpaceType, 或包括其他功能 "hand-tracking" 启用手动跟踪。
会话模式由 XRInterface.initialize() 设置WebXR会话时。
当已经初始化时,这对接口没有任何影响。
可能的值来自 WebXR's XRSessionMode, 包括: "immersive-vr", "immersive-ar", 和 "inline".
String get_visibility_state()
指示用户是否可以看到WebXR会话的图像。
可能的值来自 WebXR's XRVisibilityState, 包括 "hidden", "visible", 和 "visible-blurred".
方法说明¶
Array get_available_display_refresh_rates() const 🔗
返回当前 HMD 所支持的显示刷新率。网页浏览器支持该功能,并且该接口已初始化时才会返回。
float get_display_refresh_rate() const 🔗
返回当前 HMD 的显示刷新率。不是所有 HMD 和浏览器都支持。使用 set_display_refresh_rate() 前可能不会汇报精确值。
TargetRayMode get_input_source_target_ray_mode(input_source_id: int) const 🔗
返回给定的目标射线模式``input_source_id``.
这可以帮助解释该输入源的输入。 看 XRInputSource.targetRayMode for more information.
XRControllerTracker get_input_source_tracker(input_source_id: int) const 🔗
得到一个 XRControllerTracker 对于给定 input_source_id.
在WebXR的上下文中,输入源可以是高级VR控制器,例如Oculus Touch或Index Controller,甚至可以是屏幕上的点击,口语命令或按钮在设备本身上按下。 当使用非传统输入源时,请解释:ref:XRPositionalTracker<class_XRPositionalTracker> 当射线指向用户希望与对象相互作用的对象。
使用此方法获取有关触发以下信号之一的输入源的信息:
bool is_input_source_active(input_source_id: int) const 🔗
如果存在具有给定 input_source_id 的活动输入源,则返回 true。
void is_session_supported(session_mode: String) 🔗
检查给定 session_mode 由用户的浏览器支持。
可能的值来自 WebXR's XRSessionMode, 包括: "immersive-vr", "immersive-ar", 和 "inline".
此方法没有返回,而是发出 session_supported 信号与结果。
void set_display_refresh_rate(refresh_rate: float) 🔗
为当前的 HMD 设置屏幕刷新率。不是所有 HMD 和浏览器都支持。不会立即生效,发出 display_refresh_rate_changed 信号后才会生效。