Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add WebXR Hit Test reference docs - pt 1 #8042

Merged
merged 3 commits into from
Aug 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions files/en-us/web/api/xrsession/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ _`XRSession` provides the following methods in addition to those inherited from
- : Ends the WebXR session. Returns a {{jsxref("promise")}} which resolves when the session has been shut down.
- {{DOMxRef("XRSession.requestAnimationFrame", "requestAnimationFrame()")}}
- : Schedules the specified method to be called the next time the {{glossary("user agent")}} is working on rendering an animation frame for the WebXR device. Returns an integer value which can be used to identify the request for the purposes of canceling the callback using `cancelAnimationFrame()`. This method is comparable to the {{domxref("Window.requestAnimationFrame()")}} method.
- {{DOMxRef("XRSession.requestHitTestSource", "requestHitTestSource()")}}
- : Requests an {{domxref("XRHitTestSource")}} object that handles hit test subscription.
- {{DOMxRef("XRSession.requestHitTestSourceForTransientInput", "requestHitTestSourceForTransientInput()")}}
- : Requests an {{domxref("XRTransientInputHitTestSource")}} object that handles hit test subscription for a transient input source.
- {{DOMxRef("XRSession.requestLightProbe", "requestLightProbe()")}}
- : Requests an {{domxref("XRLightProbe")}} that estimates lighting information at a given point in the user's environment.
- {{DOMxRef("XRSession.requestReferenceSpace", "requestReferenceSpace()")}}
Expand Down
96 changes: 96 additions & 0 deletions files/en-us/web/api/xrsession/requesthittestsource/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
---
title: XRSession.requestHitTestSource()
slug: Web/API/XRSession/requestHitTestSource
tags:
- API
- AR
- Augmented Reality
- Experimental
- Method
- Reference
- VR
- Virtual Reality
- WebXR
- WebXR Device API
- XR
- XRSession
browser-compat: api.XRSession.requestHitTestSource
---
{{APIRef("WebXR Device API")}}

The **`requestHitTestSource()`** method of the
{{domxref("XRSession")}} interface returns a {{jsxref("Promise")}} that resolves with an {{domxref("XRHitTestSource")}} object that can be passed to {{domxref("XRFrame.getHitTestResults()")}}.

## Syntax

```js
requestHitTestSource(options);
```

### Parameters

- `options`
- : An object containing configuration options, specifically:
- `space`: The {{domxref("XRSpace")}} that will be tracked by the hit test source.
- `entityTypes`: {{optional_inline}} An {{jsxref("Array")}} specifying the types of entities to be used for hit test source creation. If no no entity type is specified, the array defaults to a single element with the `plane` type. Possible types:
- `point`: Compute hit test results based on characteristic points detected.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are characteristic points?

The subtext of this question is, if I were a developer who didin't know what this is, would this provide me with enough information find out.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hm, yeah, I think this is rather vague and "characteristic points" is what the spec says. Not sure what else to say, though. I believe plane detection and detection using meshes are known concepts to XR/3D developers. For points, this issue argues that point detection could be subsumed into mesh detection: immersive-web/hit-test#66
I'm not expert enough to clarify "points" further. Does it refer to some new detection technique? LIDAR points? Something else? I guess this could be very device-specific also, so maybe that's why the spec left it as such?

Also, the whole entityTypes thing is rather unstable still. See immersive-web/hit-test#67 where some people also recognized that this API is rather hard to grok.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At least I've removed entityTypes from the code example now (it is optional anyway).

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've requested a definition. I'm fine with resolving this for now.

- `plane`: Compute hit test results based on real-world planes detected.
- `mesh`: Compute hit test results based on meshes detected.
Elchi3 marked this conversation as resolved.
Show resolved Hide resolved
- `offsetRay`: {{optional_inline}} The {{domxref("XRRay")}} object that will be used to perform hit test. If no `XRRay` object has been provided, a new `XRRay` object is constructed without any parameters.

### Return value

A {{jsxref("Promise")}} that resolves with an {{domxref("XRHitTestSource")}} object.

### Exceptions

Rather than throwing true exceptions, `requestHitTestSource()` rejects the
returned promise with a {{domxref("DOMException")}}, specifically, one of the following:

- `NotSupportedError`
- : If `hit-test` is not an enabled feature in {{domxref("XRSystem.requestSession()")}}.
Elchi3 marked this conversation as resolved.
Show resolved Hide resolved
- `InvalidStateError`
- : If the session has already ended.
- `NotAllowedError`
- : If there is an unreasonable amount of requests. Some user agents might limit usage for privacy reasons.

## Examples

### Requesting a hit test source

To request a hit test source, start an {{domxref("XRSession")}} with the `hit-test` session feature enabled. Next, configure the hit test source and store it for later use in the frame loop and call {{domxref("XRFrame.getHitTestResults()")}} to obtain the result.

```js

const xrSession = navigator.xr.requestSession("immersive-ar", {
requiredFeatures: ["local", "hit-test"]
});

let hitTestSource = null;

xrSession.requestHitTestSource({
space : viewerSpace, // obtained from xrSession.requestReferenceSpace("viewer");
offsetRay : new XRRay({y: 0.5})
}).then((viewerHitTestSource) => {
hitTestSource = viewerHitTestSource;
});

// frame loop
function onXRFrame(time, xrFrame) {
let hitTestResults = xrFrame.getHitTestResults(hitTestSource);

// do things with the hit test results
}
```

## Specifications

{{Specifications}}

## Browser compatibility

{{Compat}}

## See also

- {{domxref("XRSession.requestHitTestSourceForTransientInput()")}}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
---
title: XRSession.requestHitTestSourceForTransientInput()
slug: Web/API/XRSession/requestHitTestSourceForTransientInput
tags:
- API
- AR
- Augmented Reality
- Experimental
- Method
- Reference
- VR
- Virtual Reality
- WebXR
- WebXR Device API
- XR
- XRSession
browser-compat: api.XRSession.requestHitTestSourceForTransientInput
---
{{APIRef("WebXR Device API")}}

The **`requestHitTestSourceForTransientInput()`** method of the
{{domxref("XRSession")}} interface returns a {{jsxref("Promise")}} that resolves with an {{domxref("XRTransientInputHitTestSource")}} object that can be passed to {{domxref("XRFrame.getHitTestResultsForTransientInput()")}}.

## Syntax

```js
requestHitTestSourceForTransientInput(options);
```

### Parameters

- `options`
- : An object containing configuration options, specifically:
- `profile`: A string specifying the [input profile name](/en-US/docs/Web/API/XRInputSource) of the transient input source that will be used to compute hit test results.
- `entityTypes`: {{optional_inline}} An {{jsxref("Array")}} specifying the types of entities to be used for hit test source creation. If no no entity type is specified, the array defaults to a single element with the `plane` type. Possible types:
- `point`: Compute hit test results based on characteristic points detected.
- `plane`: Compute hit test results based on real-world planes detected.
- `mesh`: Compute hit test results based on meshes detected.
- `offsetRay`: {{optional_inline}} The {{domxref("XRRay")}} object that will be used to perform hit test. If no `XRRay` object has been provided, a new `XRRay` object is constructed without any parameters.

### Return value

A {{jsxref("Promise")}} that resolves with an {{domxref("XRTransientInputHitTestSource")}} object.

### Exceptions

Rather than throwing true exceptions, `requestHitTestSourceForTransientInput()` rejects the
returned promise with a {{domxref("DOMException")}}, specifically, one of the following:

- `NotSupportedError`
- : If `hit-test` is not an enabled feature in {{domxref("XRSystem.requestSession()")}}.
- `InvalidStateError`
- : If the session has already ended.
- `NotAllowedError`
- : If there is an unreasonable amount of requests. Some user agents might limit usage for privacy reasons.

## Examples

### Requesting a transient hit test source

To request a hit test source, start an {{domxref("XRSession")}} with the `hit-test` session feature enabled. Next, configure the hit test source and store it for later use in the frame loop and call {{domxref("XRFrame.getHitTestResultsForTransientInput()")}} to obtain the result.

```js

const xrSession = navigator.xr.requestSession("immersive-ar", {
requiredFeatures: ["local", "hit-test"]
});

let transientHitTestSource = null;

xrSession.requestHitTestSourceForTransientInput({
space : "generic-touchscreen",
offsetRay : new XRRay()
}).then((touchScreenHitTestSource) => {
transientHitTestSource = touchScreenHitTestSource;
});

// frame loop
function onXRFrame(time, xrFrame) {
let hitTestResults = xrFrame.getHitTestResultsForTransientInput(transientHitTestSource);

// do things with the transient hit test results
}
```

## Specifications

{{Specifications}}

## Browser compatibility

{{Compat}}

## See also

- {{domxref("XRSession.requestHitTestSource()")}}
3 changes: 3 additions & 0 deletions files/en-us/web/api/xrsystem/requestsession/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ following:
- : Enable the ability to obtain depth information using {{domxref("XRDepthInformation")}} objects.
- `dom-overlay`
- : Enable allowing to specify a DOM overlay element that will be displayed to the user.
- `hit-test`
- : Enable hit testing features for performing hit tests against real world geometry.
- `light-estimation`
- : Enable the ability to estimate environmental lighting conditions using {{domxref("XRLightEstimate")}} objects.
- `local`
Expand All @@ -120,6 +122,7 @@ Each reference space or feature type has minimum safety requirements. By session
| --------------- | ----------------------------------- | -------------------------- |
| `bounded-floor` | Always required | `xr-spatial-tracking` |
| `depth-sensing` | — | `xr-spatial-tracking` |
| `hit-test` | — | `xr-spatial-tracking` |
| `local` | Always required for inline sessions | `xr-spatial-tracking` |
| `local-floor` | Always required | `xr-spatial-tracking` |
| `unbounded` | Always required | `xr-spatial-tracking` |
Expand Down