XRServer

继承: Object

用于 AR 和 VR 功能的服务器。

描述

AR/VR 服务器是我们“高级虚拟现实”解决方案的核心,负责执行所有处理。

教程

属性

XRInterface

primary_interface

Transform3D

world_origin

Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)

float

world_scale

1.0

方法

void

add_interface(interface: XRInterface)

void

add_tracker(tracker: XRTracker)

void

center_on_hmd(rotation_mode: RotationMode, keep_height: bool)

void

clear_reference_frame()

XRInterface

find_interface(name: String) const

Transform3D

get_hmd_transform()

XRInterface

get_interface(idx: int) const

int

get_interface_count() const

Array[Dictionary]

get_interfaces() const

Transform3D

get_reference_frame() const

XRTracker

get_tracker(tracker_name: StringName) const

Dictionary

get_trackers(tracker_types: int)

void

remove_interface(interface: XRInterface)

void

remove_tracker(tracker: XRTracker)


信号

interface_added(interface_name: StringName) 🔗

添加新接口时触发。


interface_removed(interface_name: StringName) 🔗

当接口被移除时触发。


reference_frame_changed() 🔗

当参考帧变换更改时发出。


tracker_added(tracker_name: StringName, type: int) 🔗

当一个新的追踪器被添加时发出。如果你不使用一个固定数量的控制器,或者如果你将 XRAnchor3D 用于一个 AR 解决方案,请务必对此信号做出反应,以添加与该新追踪器相适的 XRController3DXRAnchor3D 节点 。


tracker_removed(tracker_name: StringName, type: int) 🔗

当一个追踪器被移除时发出。如此,你应该移除任何 XRController3DXRAnchor3D 点。这不是强制性的,这些节点只是变得不活动,并且当一个新的追踪器可用时,将再次激活(即打开一个新的控制器,来代替前一个控制器)。


tracker_updated(tracker_name: StringName, type: int) 🔗

当现有追踪器被更新时发出。如果用户切换控制器,则可能会发生这种情况。


枚举

enum TrackerType: 🔗

TrackerType TRACKER_HEAD = 1

追踪器追踪玩家头部的位置。这通常是玩家眼睛之间的中心位置。请注意,对于手持式 AR 设备,这可能是该设备的当前位置。

TrackerType TRACKER_CONTROLLER = 2

追踪器追踪控制器的位置。

TrackerType TRACKER_BASESTATION = 4

追踪器追踪基站的位置。

TrackerType TRACKER_ANCHOR = 8

追踪器追踪 AR 锚的位置和大小。

TrackerType TRACKER_HAND = 16

追踪器追踪手部的位置和关节。

TrackerType TRACKER_BODY = 32

追踪器追踪身体的位置和关节。

TrackerType TRACKER_FACE = 64

追踪器追踪面部的表情。

TrackerType TRACKER_ANY_KNOWN = 127

内部用于过滤任何已知类型的跟踪器。

TrackerType TRACKER_UNKNOWN = 128

如果我们尚未设置跟踪器类型,则在内部使用。

TrackerType TRACKER_ANY = 255

在内部用于选择所有跟踪器。


enum RotationMode: 🔗

RotationMode RESET_FULL_ROTATION = 0

完全重置 HMD 的方向。无论用户在现实世界中看向哪个方向。将在虚拟世界中锁定视角。

RotationMode RESET_BUT_KEEP_TILT = 1

重置方向,但保持设备的倾斜度。因此,如果我们正在往下看,会继续往下看,但航向会被重置。

RotationMode DONT_RESET_ROTATION = 2

不重置 HMD 的方向,只让玩家的位置居中。


属性说明

XRInterface primary_interface 🔗

当前绑定到 XRServer 的主 XRInterface


Transform3D world_origin = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 🔗

我们的跟踪空间在虚拟世界中的原点。渲染器会用到这个信息,根据新的跟踪数据来正确放置相机。

注意:这个属性由当前的 XROrigin3D 节点管理。暴露的目的是方便在 GDExtension 使用。


float world_scale = 1.0 🔗

  • void set_world_scale(value: float)

  • float get_world_scale()

游戏世界相对于现实世界的缩放。默认情况下,大多数 AR/VR 平台假定 1 个游戏世界单位等于现实世界的 1 米。


方法说明

void add_interface(interface: XRInterface) 🔗

注册一个 XRInterface 对象。


void add_tracker(tracker: XRTracker) 🔗

注册一个跟踪物理对象的新 XRTracker


void center_on_hmd(rotation_mode: RotationMode, keep_height: bool) 🔗

正确地理解这个函数非常重要。AR 和 VR 平台处理定位的方式略有不同。

对于不提供空间跟踪的平台,我们的原点 (0,0,0) 是 HMD 的位置,但你几乎无法控制玩家在现实世界中面对的方向。

对于提供空间跟踪的平台,我们的原点在很大程度上取决于系统。对于 OpenVR,原点通常是地面上跟踪空间的中心。对于其他平台,它通常是跟踪相机的位置。

此方法允许你将跟踪器置于 HMD 的位置。它将获取 HMD 的当前位置并使用它来调整你的所有跟踪数据;从本质上讲,将现实世界重新调整到玩家在游戏世界中的当前位置。

为了使这种方法产生可用的结果,跟踪信息必须可用。这通常在开始游戏后需要几帧。

你应该在几秒钟后调用此方法。例如,当用户请求重新调整显示时,按住控制器上的指定按钮一小段时间,或者当实现传送机制时。


void clear_reference_frame() 🔗

清除之前调用 center_on_hmd 设置的参考帧。


XRInterface find_interface(name: String) const 🔗

通过名称 name 查找接口。例如,如果你的项目使用 AR/VR 平台的功能,你可以通过名称找到该平台的接口并初始化。


Transform3D get_hmd_transform() 🔗

返回主接口的变换。


XRInterface get_interface(idx: int) const 🔗

返回在接口列表中给定 idx 索引处注册的接口。


int get_interface_count() const 🔗

返回当前在 AR/VR 服务器上注册的接口数量。如果你的项目支持多个AR/VR平台,你可以查看可用的接口,并向用户展示一个选择,或者简单地尝试初始化每个接口,并使用第一个返回 true 的接口。


Array[Dictionary] get_interfaces() const 🔗

返回可用接口的列表,每个接口的 ID 和名称。


Transform3D get_reference_frame() const 🔗

返回引用帧的变换。主要在内部使用,并公开以用于 GDExtension 构建接口。


XRTracker get_tracker(tracker_name: StringName) const 🔗

返回具有给定 tracker_name 的位置追踪器。


Dictionary get_trackers(tracker_types: int) 🔗

返回 tracker_types 的追踪器字典。


void remove_interface(interface: XRInterface) 🔗

移除该 interface


void remove_tracker(tracker: XRTracker) 🔗

移除该 tracker