XRSession: событие squeezestart
Ограниченная доступность
Эта функция не относится к Baseline, так как она не работает во всех наиболее широко используемых браузерах.
Экспериментально: Это экспериментальная технология.
Перед использованием в продакшене внимательно проверьте таблицу совместимости с браузерами.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах.
Событие WebXR squeezestart отправляется в XRSession, когда пользователь начинает основное действие сжатия на одном из источников ввода.
Основные действия сжатия — это действия, предназначенные для имитации сжатия или схватывания руками, и их можно смоделировать с помощью триггеров на контроллерах.
Синтаксис
Используйте имя события в методах, таких как addEventListener(), или установите свойство обработчика событий.
addEventListener("squeezestart", (event) => {});
onsqueezestart = (event) => {};
Тип события
An XRInputSourceEvent. Наследуется от Event.
Свойства события
Помимо перечисленных ниже свойств, доступны свойства родительского интерфейса Event.
-
frameТолько для чтения -
Объект
XRFrame, предоставляющий необходимую информацию о кадре события во время его возникновения. Этот кадр мог быть рендерен ранее, а не в текущий момент. Поскольку это кадр события, а не кадр анимации, вы не можете вызватьXRFrame.getViewerPose()на нём; вместо этого используйтеgetPose(). -
inputSourceТолько для чтения -
Объект
XRInputSource, указывающий, какой источник ввода сгенерировал событие ввода.
Описание
Триггер
Срабатывает, когда пользователь начинает сжимать контроллер, выполняя жест рукой, имитирующий захват объекта, или нажимая (сжимая) триггер.
Сценарии использования
Событие squeezestart отправляется, чтобы указать, что пользователь начал действие сжатия.
Если основное действие сжатия завершается успешно, сессия отправляет событие squeeze.
Событие squeezeend отправляется, чтобы указать, что действие сжатия больше не выполняется. Это отправляется независимо от того, было ли действие сжатия успешным или нет.
Примеры
В следующем примере используется addEventListener() для создания обработчиков событий сжатия: squeezestart, squeezeend и squeeze. Этот фрагмент кода является ядром обработчика событий, позволяющего пользователю захватывать объекты в сцене и перемещать их.
В этом случае используется одна функция для обработки всех трех событий, что позволяет им использовать общие участки кода, не зависящие от типа события. Только после выполнения этих задач функция onSqueezeEvent() ниже вызывает специальную функцию для обработки действий.
После проверки, является ли полученное событие событием tracked-pointer (единственным типом, обрабатываемым здесь), позиция целевого луча получается с помощью getPose().
Если позиция целевого луча была успешно получена, код использует значение свойства Event type для перенаправления управления в соответствующую функцию обработки события:
- Для событий
squeezestartвызывается функцияmyBeginTracking()с матрицейmatrixпозиции целевого луча. ФункцияmyBeginTracking(), предположительно, запускает процесс захвата объекта, используя преобразование для выполнения проверки попадания, определяя, какой объект подхватить.myBeginTracking()возвращает объект, представляющий объект, который пользователь начал перетаскивать. - При получении события
squeezeвызывается функцияmyDropObject()с объектом как входом. Это помещает объект в его новое положение в мире и запускает любые эффекты, которые могут возникнуть, такие как планирование анимации всплеска при падении в воду и т. д. - Событие
squeezeendприводит к вызову функцииmyStopTracking()с перетаскиваемым объектом и преобразованием окончательной позиции целевого луча.
xrSession.addEventListener("squeezestart", onSqueezeEvent);
xrSession.addEventListener("squeeze", onSqueezeEvent);
xrSession.addEventListener("squeezeend", onSqueezeEvent);
function onSqueezeEvent(event) {
let source = event.inputSource;
let targetObj = null;
if (source.targetRayMode !== "tracked-pointer") {
return;
}
let targetRayPose = event.frame.getPose(source.targetRaySpace, myRefSpace);
if (!targetRayPose) {
return;
}
switch (event.type) {
case "squeezestart":
targetObj = myBeginTracking(targetRayPose.matrix);
break;
case "squeeze":
myDropObject(targetObj, targetRayPose.matrix);
break;
case "squeezeend":
myStopTracking(targetObj, targetRayPose.matrix);
break;
}
}
Также можно настроить обработчик этих событий, установив свойства обработчиков событий объекта XRSession в функцию, которая обрабатывает событие:
xrSession.onsqueezestart = onSqueezeEvent; xrSession.onsqueeze = onSqueezeEvent; xrSession.onsqueezeend = onSqueezeEvent;
Спецификации
| Спецификация |
|---|
| WebXR Device API # eventdef-xrsession-squeezestart |
| WebXR Device API # dom-xrsession-onsqueezestart |
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
squeezestart_event |
83 | 83 | Нет | 69 | Нет | 83 | Нет | 59 | Нет | 13.0 | Нет |
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/XRSession/squeezestart_event