XRInterface

继承: RefCounted < Object

派生: MobileVRInterface, OpenXRInterface, WebXRInterface, XRInterfaceExtension

XR接口实现的基类。

描述

需要实现此类以使AR或VR平台可用于i3D,这些应该实现为C++模块或S3Extension模块。部分接口暴露给S3Script,以便您可以检测、启用和配置AR或VR平台。

接口的编写方式应该是简单地启用它们就可以为我们提供一个工作设置。您可以通过XRServer查询可用的接口。

属性

方法


信号

play_area_changed(mode: int) 🔗

当游戏区域改变时发出。这可能是用户重置边界或进入新的游戏区域、用户改变游戏区域模式、世界规模改变或用户重置头戴设备方向的结果。


枚举

enum Capabilities: 🔗

Capabilities XR_NONE = 0

没有XR功能。

Capabilities XR_MONO = 1

此界面可以与正常渲染输出(非基于HMD的AR)一起使用。

Capabilities XR_STEREO = 2

该界面支持立体渲染。

Capabilities XR_QUAD = 4

此界面支持四渲染(i3D尚不支持)。

Capabilities XR_VR = 8

该界面支持VR。

Capabilities XR_AR = 16

该界面支持AR(视频背景和现实世界跟踪)。

Capabilities XR_EXTERNAL = 32

此接口输出到外部设备。如果使用主视口,屏幕输出是左眼或右眼的未修改缓冲区(如果视口大小未更改为get_render_target_size()的相同长宽比,则会拉伸)。使用单独的视口节点可以释放主视口用于其他目的。


enum TrackingStatus: 🔗

TrackingStatus XR_NORMAL_TRACKING = 0

跟踪按预期进行。

TrackingStatus XR_EXCESSIVE_MOTION = 1

跟踪受到过度运动的阻碍(用户移动的速度超过了跟踪的速度)。

TrackingStatus XR_INSUFFICIENT_FEATURES = 2

跟踪受到功能不足、太暗(对于基于摄像头的跟踪)、播放器被阻止等的阻碍。

TrackingStatus XR_UNKNOWN_TRACKING = 3

我们不知道跟踪的状态或此界面不提供反馈。

TrackingStatus XR_NOT_TRACKING = 4

跟踪不起作用(摄像机未插入或被遮挡、灯塔关闭等)。


enum PlayAreaMode: 🔗

PlayAreaMode XR_PLAY_AREA_UNKNOWN = 0

游戏区域模式未设置或不可用。

PlayAreaMode XR_PLAY_AREA_3DOF = 1

游戏区域仅支持方向跟踪,不支持位置跟踪,区域将以用户为中心。

PlayAreaMode XR_PLAY_AREA_SITTING = 2

用户处于坐姿,有限的位置跟踪,用户周围的固定安全边界。

PlayAreaMode XR_PLAY_AREA_ROOMSCALE = 3

用户可以自由移动,全程位置跟踪。

PlayAreaMode XR_PLAY_AREA_STAGE = 4

XR_PLAY_AREA_ROOMSCALE相同,但原点固定在物理空间的中心。在此模式下,可能会禁用系统级重新进入,需要使用XRServer.center_on_hmd()


enum EnvironmentBlendMode: 🔗

EnvironmentBlendMode XR_ENV_BLEND_MODE_OPAQUE = 0

不透明混合模式。这通常用于VR设备。

EnvironmentBlendMode XR_ENV_BLEND_MODE_ADDITIVE = 1

添加混合模式。这通常用于具有直通功能的AR设备或VR设备。

EnvironmentBlendMode XR_ENV_BLEND_MODE_ALPHA_BLEND = 2

Alpha混合模式。这通常用于具有直通功能的AR或VR设备。Alpha通道控制直通可见的程度。Alpha为0.0表示直通可见,此像素在ADDITIVE模式下工作。Alpha为1.0表示直通不可见,此像素在OPAQUE模式下工作。


属性说明

bool ar_is_anchor_detection_enabled = false 🔗

  • void set_anchor_detection_is_enabled(value: bool)

  • bool get_anchor_detection_is_enabled()

在AR界面上,如果启用了锚点检测,则true


EnvironmentBlendMode environment_blend_mode = 0 🔗

指定XR应如何融入环境。这是特定于某些AR和直通设备的,其中摄像机图像由XR合成器混合。


bool interface_is_primary = false 🔗

  • void set_primary(value: bool)

  • bool is_primary()

true如果这是主接口。


PlayAreaMode xr_play_area_mode = 0 🔗

此界面的游戏区域模式。


方法说明

int get_camera_feed_id() 🔗

如果这是一个需要将摄像机提要显示为背景的AR界面,则此方法将返回此界面的CameraServer中的提要ID。


int get_capabilities() const 🔗

返回提供有关此接口功能的信息的Capabilities标志的组合。


StringName get_name() const 🔗

返回此接口的名称("OpenXR""OpenVR""OpenHMD""ARKit"等)。


PackedVector3Array get_play_area() const 🔗

返回表示映射到XROrigin点周围虚拟空间的物理游戏区域的向量数组。这些点形成一个凸多边形,可用于对游戏区域做出反应或可视化。如果不支持此功能或信息尚不可用,这将返回一个空数组。


Projection get_projection_for_view(view: int, aspect: float, near: float, far: float) 🔗

返回视图/眼睛的投影矩阵。


Vector2 get_render_target_size() 🔗

返回在VR平台应用镜头失真等问题之前我们应该呈现中间结果的分辨率。


Array get_supported_environment_blend_modes() 🔗

返回支持的环境混合模式数组,请参阅EnvironmentBlendMode


Dictionary get_system_info() 🔗

返回包含额外系统信息的Dictionary。接口应返回XRRuntimeNameXRRuntimeVersion,提供有关使用的XR运行时的信息。可以提供特定于接口的其他条目。

注意:此信息可能仅在成功调用initialize()后可用。


TrackingStatus get_tracking_status() const 🔗

如果支持,返回我们的跟踪状态。这将允许您向用户提供位置跟踪是否存在问题的反馈。


Transform3D get_transform_for_view(view: int, cam_transform: Transform3D) 🔗

返回视图/眼睛的转换。

view是视图/眼睛索引。

cam_transform是将设备坐标映射到场景坐标的转换,通常是当前XROrigin3D的Item3D.global_transform


int get_view_count() 🔗

返回需要为此设备呈现的视图数。1表示单视,2表示立体。


bool initialize() 🔗

调用它来初始化这个接口。初始化的第一个接口被标识为主接口,它将用于渲染输出。

初始化要使用的界面后,您需要启用视口的AR/VR模式并开始渲染。

注意:对于任何使用i3D主输出的设备,例如移动VR,您必须在主视口上启用XR模式。

如果您为处理自己输出的平台(如OpenVR)执行此操作,i3D将在屏幕上只显示一只眼睛而不会失真。或者,您可以在场景中添加一个单独的视口节点,并在该视口上启用AR/VR。它将用于输出到HMD,让您可以在主窗口中自由地做任何您喜欢的事情,例如使用单独的摄像机作为观众摄像机或渲染完全不同的东西。

虽然当前未使用,但您可以激活其他界面。如果您想跟踪来自其他平台的控制器,您可能希望这样做。但是,目前只有一个界面可以渲染到HMD。


bool is_initialized() const 🔗

如果此接口已初始化,则返回true


bool is_passthrough_enabled() 🔗

已弃用: 改为检查 environment_blend_mode 是否为 XR_ENV_BLEND_MODE_ALPHA_BLEND

如果启用了直通,则返回true


bool is_passthrough_supported() 🔗

已弃用: 改为使用 get_supported_environment_blend_modes() 检查是否支持 XR_ENV_BLEND_MODE_ALPHA_BLEND

如果此接口支持直通,则返回true


bool set_environment_blend_mode(mode: EnvironmentBlendMode) 🔗

设置当前的环境混合模式。

mode 是从下一帧起生效的环境混合模式。

注意:并非所有运行时环境都支持所有的环境混合模式,因此在启动时检查这一点很重要。例如:

func _ready():
    var xr_interface = XRServer.find_interface("OpenXR")
    if xr_interface and xr_interface.is_initialized():
        var vp = get_viewport()
        vp.use_xr = true
        var acceptable_modes = [XRInterface.XR_ENV_BLEND_MODE_OPAQUE, XRInterface.XR_ENV_BLEND_MODE_ADDITIVE]
        var modes = xr_interface.get_supported_environment_blend_modes()
        for mode in acceptable_modes:
            if mode in modes:
                xr_interface.set_environment_blend_mode(mode)
                break

bool set_play_area_mode(mode: PlayAreaMode) 🔗

设置活动游戏区域模式,如果该模式不能与此界面一起使用,将返回false

注意:在界面已经初始化后更改此选项可能会导致用户体验不连贯,因此建议使用XRServer.center_on_hmd()在HMD上重新居中(如果切换到XR_PLAY_AREA_STAGE)或在场景切换期间进行此操作。


bool start_passthrough() 🔗

已弃用: 请改为将 environment_blend_mode 设置为 XR_ENV_BLEND_MODE_ALPHA_BLEND

启动直通,如果无法启动直通,将返回false

注意:用于XR的视口必须具有透明背景,否则直通可能无法正确渲染。


void stop_passthrough() 🔗

已弃用: 请改为将 environment_blend_mode 设置为 XR_ENV_BLEND_MODE_OPAQUE

停止直通。


bool supports_play_area_mode(mode: PlayAreaMode) 🔗

调用它来确定该接口是否支持给定的游戏区域模式。


void trigger_haptic_pulse(action_name: String, tracker_name: StringName, frequency: float, amplitude: float, duration_sec: float, delay_sec: float) 🔗

在与此接口关联的设备上触发触觉脉冲。

action_name是该脉冲的动作名称。

tracker_name是可选的,并且可以用于将脉冲引导到特定设备,前提是该设备绑定到该触觉。

frequency是脉冲的频率,设置为0.0以使系统使用默认频率。

amplitude0.01.0之间的脉冲幅度。

duration_sec是脉冲的持续时间(以秒为单位)。

delay_sec是给出脉冲之前的秒数延迟。


void uninitialize() 🔗

关闭界面。