visit
Draft
This page is not complete.
WebXR is a group of standards which are used together to support rendering 3D scenes to hardware designed for presenting virtual worlds (virtual reality, or VR), or for adding graphical imagery to the real world, (augmented reality, or AR). The WebXR Device API implements the core of the WebXR feature set, managing the selection of output devices, render the 3D scene to the chosen device at the appropriate frame rate, and manage motion vectors created using input controllers.
WebXR-compatible devices include fully-immersive 3D headsets with motion and orientation tracking, eyeglasses which overlay graphics atop
the real world scene passing through the frames, and handheld mobile
phones which augment reality by capturing the world with a camera and
augment that scene with computer-generated imagery.
At the most basic level, a scene is presented in 3D by computing the
perspective to apply to the scene in order to render it from the viewpoint of each of the user's eyes, taking into account the typical distance between the eyes, then rendering the scene twice, once for each eye. The resulting images (or image, if the scene is rendered twice onto a single frame, half per eye) are then displayed to the user.
Since is used for rendering the 3D world into the WebXR session, you should first be familiar with WebGL's general usage, and with the basics of 3D graphics in general. You most likely will not directly use the WebGL API, instead making use of one of the frameworks or libraries that are built atop WebGL to make it more convenient to use. Among the most
popular of these is .
WebXR: AR and VR
The equipment may also include an accelerometer, barometer, or other
sensors which are used to sense when the user moves through space,
rotates their head, or the like.
WebXR application lifecycle
Most applications using WebXR will follow a similar overall design pattern:
inline
, immersive-vr
, or immersive-ar
, in order to determine whether or not the type of session you wish to provide is available.This is done by calling , again specifying the string indicating the mode you want to enable:
inline
, immersive-vr
, or immersive-ar
.3. If the promise returned by
requestSession()
resolves, use the new to run the frame loop for the entire duration of the WebXR experience.requestAnimationFrame()
callback should use the information provided about the objects located in the 3D world to render the frame using WebGL.Permissions and security
The WebXR Device API is subject to a number of permission and security controls. While not onerous, they are worth being aware of. These mostly revolve around the fully-immersive
immersive-vr
session mode, but there are things to be aware of when setting up an AR session, as well.Immersive presentation of VR
First, any requests to activate the
immersive-vr
mode are rejected if the domain issuing the request does not have permission to enable an immersive session. This permission comes from the xr-spatial-tracking
.Once that check is passed, the request to enter
immersive-vr
mode is allowed if all of the following are true:The
requestSession()
call was issued by code executing within the handler for a user event, or the from the startup code for a user-launched .If all of that is true, the promise returned by
requestSession()
is resolved, and the new object is passed into the fulfillment handler. Otherwise, an appropriate exception is thrown, such as SecurityError
if the document doesn't have permission to enter immersive mode.Inline presentation
When you request an with the mode set to
inline
, and any features are required or requested, the browser will only allow the session to be created if the call to was made by code which is executing expressly due to user intent.Specifically:requestSession()
call isn't coming from within the handler executed in response to a user event, and is not being issued while launching a web application, the request is denied and false
is delivered to the promise's fulfillment handler.false
is returned through the promise's fulfillment routine. A trustworthy document is one which is both responsible and active, and which currently has focus.Note: Additional requirements may be put into effect due to the specific features requested by the options object when calling requestSession().
User intent
User intent is the concept of whether or not an action being performed by code is being performed because of something the user intends to do or not. There are two kinds of user intent: implicit and explicit.
Explicit user intent (explicit user consent) is granted when the user has specifically and expressly been asked for permission to perform an action.
Implicit user intent (implicit user consent) is assumed if either of the following scenarios is the case:
requestSession()
from the button's event handler will permitted.WebXR availability
As a new and still in development API, WebXR support is limited to specific devices and browsers; and even on those, it may not be enabled by default. There may be options available to allow you to experiment with WebXR even if you don't have a compatible system, however.WebXR polyfill
The team designing the WebXR specification has published a which you can use to simulate WebXR on browsers which don't have support for the WebXR APIs. If the browser supports the older , that is used. Otherwise, the polyfill falls back to an implementation which uses Google's Cardboard VR API.
WebXR API Emulator extension
The has created a browser
extension, compatible with both Firefox and Chrome, which emulates the
WebXR API, simulating a variety of compatible devices such as the HTC
Vive, the Oculus Go and Oculus Quest, Samsung Gear, and Google
Cardboard. With the extension in place, you can open up a developer
tools panel that lets you control the position and orientation of the headset and any hand controllers, as well as button presses on the
controllers.
While somewhat awkward compared to using an actual headset, this makes it possible to experiment with and developer WebXR code on a
desktop computer, where WebXR isn't normally available. It also lets you
perform some basic testing before taking your code to a real device. Be
aware, however, that the emulator does not yet completely emulate all
of the WebXR API, so you may run into problems you're not expecting.
Again, carefully read the readme file and make sure you're aware of the
limitations before you begin.
Important: You should always test your code on actual AR and/or VR hardware before releasing or shipping a product! Emulated, simulated, or polyfilled environments are not an adequate substitute for actual testing on physical devices.Download the WebXR API Emulator for your supported browser below:
This property, added to the interface, returns the object through which the WebXR API is exposed. If this property is missing or
null
, WebXR is not available.While presenting an XR session, the state of all tracked objects which make up the session are represented by an
XRFrame
. To get an XRFrame
, call the session's method, providing a callback which will be called with the XRFrame once available. Events which communicate tracking states will also use XRFrame to contain that information.Provides a set of configurable properties which change how the imagery output by an
XRSession
is composited.Provides the interface for interacting with XR hardware. Once an
XRSession
is obtained from , the session can be used to check the position and orientation of the viewer, query the device for environment information, and present the virtual or augmented world to the user.XRSpace
is an opaque base class on which all virtual coordinate system interfaces are based. Positions in WebXR are always expressed in relation to a particular XRSpace
at the time at which a particular A subclass of which is used to identify a spatial relationship in relation to the user's physical environment. The
XRReferenceSpace
coordinate system is expected to remain unchanged through the lifespan of the . The world has no boundaries and extends infinitely in every direction.XRBoundedReferenceSpace
extends the coordinate system to further include support for a finite world with set boundaries. Unlike XRReferenceSpace
, the origin must be located on the floor (that is, y = 0 at the floor). The x and z components of the origin are typically presumed to be located at or near the center of the room or surface.Represents a single view into the XR scene for a particular frame. Each
XRView
corresponds to the video display surface used to present the scene to the user. For example, a given XR device might have two views: one for the left eye and one for the right. Each view has an offset used to shift the position of the view relative to the camera, in order to allow for Based on ,
XRViewerPose
specifies the state of a viewer of the WebXR scene as indicated by the XR device. Included is an array of objects, each representing one perspective on the scene. For example, it takes two views to create the stereoscopic view as perceived by human vision—one for the left eye and a second for the right eye. One view is offset to the left slightly from the viewer's position, and the other view is offset to the right by the same distance. The view list can also be used to represent the perspectives of each of the spectators of a scene, in a multi-user environment.Represents any input device the user can use to perform targeted
actions within the same virtual space as the viewer. Input sources may
include devices such as hand controllers, optical tracking systems, and
other devices which are explicitly associated with the XR device. Other
input devices such as keyboards, mice, and gamepads are not presented
as
XRInputSource
instances.A layer which serves as a frame buffer into which a scene's view is rendered. Using WebGL to render the scene gains substantial performance benefits due to graphics acceleration.
Event interfaces
The WebGL API is extended by the WebXR specification to augment the
WebGL context to allow it to be used to render views for display by a
WebXR device.
WebGL (and therefore WebXR) doesn't really have a concept of a camera, which is the traditional concept used to represent a viewpoint in 3D graphics. In this article, we see how to simulate a camera and how to create the illusion of moving a viewer through a world in which the
viewer doesn't really move.