XRSession: requestHitTestSourceForTransientInput() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

XRSession 接口的 requestHitTestSourceForTransientInput() 方法返回一个 Promise,该 Promise 解析为一个 XRTransientInputHitTestSource 对象,该对象可以传递给 XRFrame.getHitTestResultsForTransientInput()

语法

js
requestHitTestSourceForTransientInput(options)

参数

options

一个包含配置选项的对象,具体来说是

profile

一个字符串,指定将用于计算命中测试结果的瞬态输入源的 输入配置文件名称

entityTypes 可选

一个 Array,指定用于创建命中测试源的实体类型。如果未指定实体类型,则数组默认为一个包含 plane 类型的单个元素。可能的类型

  • point:基于检测到的特征点计算命中测试结果。
  • plane:基于检测到的真实世界平面计算命中测试结果。
  • mesh:基于检测到的网格计算命中测试结果。
offsetRay 可选

用于执行命中测试的 XRRay 对象。如果未提供 XRRay 对象,则会创建一个新的 XRRay 对象,而不带任何参数。

返回值

一个 Promise,该 Promise 解析为一个 XRTransientInputHitTestSource 对象。

异常

requestHitTestSourceForTransientInput() 不会抛出真正的异常,而是会使用 DOMException 来拒绝返回的 Promise,具体来说是以下之一

NotSupportedError DOMException

如果 hit-test 不是 XRSystem.requestSession() 中启用的功能,则会抛出此异常。

InvalidStateError DOMException

如果会话已结束,则会抛出此异常。

NotAllowedError DOMException

如果请求数量过多,则会抛出此异常。某些用户代理出于隐私原因可能会限制使用。

示例

请求瞬态命中测试源

要请求命中测试源,请使用启用了 hit-test 会话功能的 XRSession 启动一个会话。接下来,配置命中测试源并将其存储以供以后在帧循环中使用,然后调用 XRFrame.getHitTestResultsForTransientInput() 获取结果。

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

let transientHitTestSource = null;

xrSession
  .requestHitTestSourceForTransientInput({
    profile: "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
}

规范

规范
WebXR Hit Test 模块
# dom-xrsession-requesthittestsourcefortransientinput

浏览器兼容性

另见