WebXRInterface

AR/VR interface using WebXR.

WebXR is an open standard that allows creating VR and AR applications that run in the web browser. As such, this interface is only available when running in an HTML5 export. WebXR supports a wide range of devices, from the very capable (like Valve Index, HTC Vive, Oculus Rift and Quest) down to the much less capable (like Google Cardboard, Oculus Go, GearVR, or plain smartphones). Since WebXR is based on Javascript, it makes extensive use of callbacks, which means that WebXRInterface is forced to use signals, where other AR/VR interfaces would instead use functions that return a result immediately. This makes WebXRInterface quite a bit more complicated to initialize than other AR/VR interfaces. Here's the minimum code required to start an immersive VR session:

More...

Members

Aliases

BaseClasses
alias BaseClasses = AliasSeq!(typeof(_GODOT_base), typeof(_GODOT_base).BaseClasses)
Undocumented in source.

Functions

getBoundsGeometry
PoolVector3Array getBoundsGeometry()
getController
ARVRPositionalTracker getController(long controller_id)

Gets an ARVRPositionalTracker for the given controller_id. In the context of WebXR, a "controller" can be an advanced VR controller like the Oculus Touch or Index controllers, or even a tap on the screen, a spoken voice command or a button press on the device itself. When a non-traditional controller is used, interpret the position and orientation of the ARVRPositionalTracker as a ray pointing at the object the user wishes to interact with. Use this method to get information about the controller that triggered one of these signals: - selectstart - select - selectend - squeezestart - squeeze - squeezestart

getOptionalFeatures
String getOptionalFeatures()
getReferenceSpaceType
String getReferenceSpaceType()
getRequestedReferenceSpaceTypes
String getRequestedReferenceSpaceTypes()
getRequiredFeatures
String getRequiredFeatures()
getSessionMode
String getSessionMode()
getVisibilityState
String getVisibilityState()
isSessionSupported
void isSessionSupported(String session_mode)

Checks if the given session_mode is supported by the user's browser. Possible values come from url=https://developer.mozilla.org/en-US/docs/Web/API/XRSessionModeWebXR's XRSessionMode/url, including: "immersive-vr", "immersive-ar", and "inline". This method returns nothing, instead it emits the sessionSupported signal with the result.

opAssign
typeof(null) opAssign(typeof(null) n)
opEquals
bool opEquals(WebXRInterface other)
opEquals
bool opEquals(typeof(null) n)
setOptionalFeatures
void setOptionalFeatures(String optional_features)
setRequestedReferenceSpaceTypes
void setRequestedReferenceSpaceTypes(String requested_reference_space_types)
setRequiredFeatures
void setRequiredFeatures(String required_features)
setSessionMode
void setSessionMode(String session_mode)
toHash
size_t toHash()

Mixins

__anonymous
mixin baseCasts
Undocumented in source.

Properties

boundsGeometry
PoolVector3Array boundsGeometry [@property getter]

The vertices of a polygon which defines the boundaries of the user's play area. This will only be available if referenceSpaceType is "bounded-floor" and only on certain browsers and devices that support it. The referenceSpaceReset signal may indicate when this changes.

optionalFeatures
String optionalFeatures [@property getter]
String optionalFeatures [@property setter]

A comma-seperated list of optional features used by ARVRInterface.initialize when setting up the WebXR session. If a user's browser or device doesn't support one of the given features, initialization will continue, but you won't be able to use the requested feature. This doesn't have any effect on the interface when already initialized. Possible values come from url=https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpaceTypeWebXR's XRReferenceSpaceType/url. If you want to use a particular reference space type, it must be listed in either requiredFeatures or optionalFeatures.

referenceSpaceType
String referenceSpaceType [@property getter]

The reference space type (from the list of requested types set in the requestedReferenceSpaceTypes property), that was ultimately used by ARVRInterface.initialize when setting up the WebXR session. Possible values come from url=https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpaceTypeWebXR's XRReferenceSpaceType/url. If you want to use a particular reference space type, it must be listed in either requiredFeatures or optionalFeatures.

requestedReferenceSpaceTypes
String requestedReferenceSpaceTypes [@property getter]
String requestedReferenceSpaceTypes [@property setter]

A comma-seperated list of reference space types used by ARVRInterface.initialize when setting up the WebXR session. The reference space types are requested in order, and the first on supported by the users device or browser will be used. The referenceSpaceType property contains the reference space type that was ultimately used. This doesn't have any effect on the interface when already initialized. Possible values come from url=https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpaceTypeWebXR's XRReferenceSpaceType/url. If you want to use a particular reference space type, it must be listed in either requiredFeatures or optionalFeatures.

requiredFeatures
String requiredFeatures [@property getter]
String requiredFeatures [@property setter]

A comma-seperated list of required features used by ARVRInterface.initialize when setting up the WebXR session. If a user's browser or device doesn't support one of the given features, initialization will fail and sessionFailed will be emitted. This doesn't have any effect on the interface when already initialized. Possible values come from url=https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpaceTypeWebXR's XRReferenceSpaceType/url. If you want to use a particular reference space type, it must be listed in either requiredFeatures or optionalFeatures.

sessionMode
String sessionMode [@property getter]
String sessionMode [@property setter]

The session mode used by ARVRInterface.initialize when setting up the WebXR session. This doesn't have any effect on the interface when already initialized. Possible values come from url=https://developer.mozilla.org/en-US/docs/Web/API/XRSessionModeWebXR's XRSessionMode/url, including: "immersive-vr", "immersive-ar", and "inline".

visibilityState
String visibilityState [@property getter]

Indicates if the WebXR session's imagery is visible to the user. Possible values come from url=https://developer.mozilla.org/en-US/docs/Web/API/XRVisibilityStateWebXR's XRVisibilityState/url, including "hidden", "visible", and "visible-blurred".

Static functions

_new
WebXRInterface _new()

Construct a new instance of WebXRInterface. Note: use memnew!WebXRInterface instead.

Static variables

_classBindingInitialized
bool _classBindingInitialized;
Undocumented in source.

Structs

GDNativeClassBinding
struct GDNativeClassBinding
Undocumented in source.

Unions

__anonymous
union __anonymous
Undocumented in source.

Variables

_GODOT_internal_name
enum string _GODOT_internal_name;
Undocumented in source.

Mixed In Members

From mixin baseCasts

as
inout(To) as()
Undocumented in source. Be warned that the author may not have intended to support it.
as
inout(To) as()
Undocumented in source. Be warned that the author may not have intended to support it.
as
inout(ToRef) as()
Undocumented in source. Be warned that the author may not have intended to support it.
opCast
template opCast(To)
Undocumented in source.
opCast
template opCast(To)
Undocumented in source.
opCast
template opCast(ToRef)
Undocumented in source.
opCast
void* opCast()
Undocumented in source. Be warned that the author may not have intended to support it.
opCast
godot_object opCast()
Undocumented in source. Be warned that the author may not have intended to support it.
opCast
bool opCast()
Undocumented in source. Be warned that the author may not have intended to support it.

Detailed Description

extends Spatial

var webxr_interface var vr_supported = false

func _ready(): # We assume this node has a button as a child. # This button is for the user to consent to entering immersive VR mode. $Button.connect("pressed", self, "_on_Button_pressed")

webxr_interface = ARVRServer.find_interface("WebXR") if webxr_interface: # WebXR uses a lot of asynchronous callbacks, so we connect to various # signals in order to receive them. webxr_interface.connect("session_supported", self, "_webxr_session_supported") webxr_interface.connect("session_started", self, "_webxr_session_started") webxr_interface.connect("session_ended", self, "_webxr_session_ended") webxr_interface.connect("session_failed", self, "_webxr_session_failed")

# This returns immediately - our _webxr_session_supported() method # (which we connected to the "session_supported" signal above) will # be called sometime later to let us know if it's supported or not. 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

# We want an immersive VR session, as opposed to AR ('immersive-ar') or a # simple 3DoF viewer ('viewer'). webxr_interface.session_mode = 'immersive-vr' # 'bounded-floor' is room scale, 'local-floor' is a standing or sitting # experience (it puts you 1.6m above the ground if you have 3DoF headset), # whereas as 'local' puts you down at the ARVROrigin. # This list means it'll first try to request 'bounded-floor', then # fallback on 'local-floor' and ultimately 'local', if nothing else is # supported. webxr_interface.requested_reference_space_types = 'bounded-floor, local-floor, local' # In order to use 'local-floor' or 'bounded-floor' we must also # mark the features as required or optional. webxr_interface.required_features = 'local-floor' webxr_interface.optional_features = 'bounded-floor'

# This will return false if we're unable to even request the session, # however, it can still fail asynchronously later in the process, so we # only know if it's really succeeded or failed when our # _webxr_session_started() or _webxr_session_failed() methods are called. if not webxr_interface.initialize(): OS.alert("Failed to initialize") return

func _webxr_session_started(): $Button.visible = false # This tells Godot to start rendering to the headset. get_viewport().arvr = true # This will be the reference space type you ultimately got, out of the # types that you requested above. This is useful if you want the game to # work a little differently in 'bounded-floor' versus 'local-floor'. print ("Reference space type: " + webxr_interface.reference_space_type)

func _webxr_session_ended(): $Button.visible = true # If the user exits immersive mode, then we tell Godot to render to the web # page again. get_viewport().arvr = false

func _webxr_session_failed(message): OS.alert("Failed to initialize: " + message)

There are several ways to handle "controller" input: - Using ARVRController nodes and their ARVRController.buttonPressed and ARVRController.buttonRelease signals. This is how controllers are typically handled in AR/VR apps in Godot, however, this will only work with advanced VR controllers like the Oculus Touch or Index controllers, for example. The buttons codes are defined by url=https://immersive-web.github.io/webxr-gamepads-module/#xr-standard-gamepad-mappingSection 3.3 of the WebXR Gamepads Module/url. - Using Node._unhandledInput and InputEventJoypadButton or InputEventJoypadMotion. This works the same as normal joypads, except the InputEvent.device starts at 100, so the left controller is 100 and the right controller is 101, and the button codes are also defined by url=https://immersive-web.github.io/webxr-gamepads-module/#xr-standard-gamepad-mappingSection 3.3 of the WebXR Gamepads Module/url. - Using the select, squeeze and related signals. This method will work for both advanced VR controllers, and non-traditional "controllers" like a tap on the screen, a spoken voice command or a button press on the device itself. The controller_id passed to these signals is the same id as used in ARVRController.controllerId. You can use one or all of these methods to allow your game or app to support a wider or narrower set of devices and input methods, or to allow more advanced interations with more advanced devices.

Meta