XRSession:squeeze 事件

实验性: 这是一个 实验性技术
在生产环境中使用此功能之前,请仔细查看 浏览器兼容性表

安全上下文: 此功能仅在 安全上下文(HTTPS)中可用,某些或所有 支持的浏览器 中均可使用。

当会话的某个输入源完成 主要挤压操作 时,WebXR squeeze 事件将发送到 XRSession。常见主要操作的示例包括用户按下触发器或按钮、点击触控板、说出命令或在使用视频跟踪系统或带有加速度计的手持控制器时执行可识别的姿势。

有关 squeezestartsqueezesqueezeend 事件的工作原理以及您应该如何响应它们的详细信息,请参阅 输入和输入源

语法

在诸如 addEventListener() 的方法中使用事件名称,或设置事件处理程序属性。

js
addEventListener("squeeze", (event) => {});

onsqueeze = (event) => {};

事件类型

事件属性

除了下面列出的属性外,父接口 Event 中的属性也可使用。

frame 只读

一个 XRFrame 对象,提供有关事件发生期间的事件帧所需的信息。此帧可能已在过去呈现,而不是当前帧。因为这是一个事件帧,而不是动画帧,所以您不能在它上面调用 XRFrame.getViewerPose();而应使用 getPose()

inputSource 只读

指示哪个输入源生成了输入事件的 XRInputSource 对象。

描述

触发器

当用户挤压控制器、做出模仿抓取物体的姿势或使用(挤压)触发器时触发。

用例

squeezestart 事件表示用户已开始挤压操作。

如果主要的挤压操作成功结束,则会话会发送 squeeze 事件。

发送 squeezeend 事件以指示挤压操作不再进行。无论挤压操作是否成功,都会发送此事件。

示例

以下示例使用 addEventListener()squeeze 事件设置处理程序。该处理程序获取表示 tracked-pointer 输入的目标射线的姿势,并将姿势的变换发送到名为 myHandleSqueezeWithRay() 的函数。

此代码将挤压视为一个瞬时操作,不涉及跟踪正在进行的活动。如果您需要跟踪非瞬时挤压操作,请侦听 squeezestartsqueezeend 事件以感知挤压操作的开始和结束时间。

js
xrSession.addEventListener("squeeze", (event) => {
  if (event.inputSource.targetRayMode === "tracked-pointer") {
    let targetRayPose = event.frame.getPose(
      event.inputSource.targetRaySpace,
      myRefSpace,
    );
    if (targetRayPose) {
      myHandleSqueezeWithRay(targetRayPose.transform);
    }
  }
});

您还可以通过将 XRSession 对象的 onsqueeze 事件处理程序属性设置为处理该事件的函数来为 squeeze 事件设置处理程序。

js
xrSession.onsqueeze = (event) => {
  if (event.inputSource.targetRayMode === "tracked-pointer") {
    let targetRayPose = event.frame.getPose(
      event.inputSource.targetRaySpace,
      myRefSpace,
    );
    if (targetRayPose) {
      myHandleSqueezeWithRay(targetRayPose.transform);
    }
  }
};

规范

规范
WebXR 设备 API
# eventdef-xrsession-squeeze
WebXR 设备 API
# dom-xrsession-onsqueeze

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅