XRSession:squeeze 事件

可用性有限

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

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

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

当会话的一个输入源完成了主要挤压操作时,WebXR squeeze 事件会被发送到 XRSession。常见的初级操作的例子包括用户按下扳机或按钮、触摸触控板、说出命令,或者在使用带有加速计的视频追踪系统或手持控制器时执行可识别的手势。

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

语法

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

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

onsqueeze = (event) => { }

事件类型

一个 XRInputSourceEvent。继承自 Event

Event XRInputSourceEvent

事件属性

除了下面列出的属性之外,父接口 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 Device API
# eventdef-xrsession-squeeze
WebXR Device API
# dom-xrsession-onsqueeze

浏览器兼容性

另见