Spec-Zone.ru › Web APIs

XRSession: метод requestAnimationFrame()

Ограниченная доступность

Эта функция не является Baseline, так как она не работает в некоторых из наиболее широко используемых браузеров.

  • Узнать больше
  • Полная совместимость
  • Отправить отзыв

Экспериментально: Это экспериментальная технология
Перед использованием в производстве внимательно ознакомьтесь с таблицей совместимости браузеров.

Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах.

Метод XRSession requestAnimationFrame(), подобно методу Window с таким же названием, планирует выполнение обратного вызова в следующий момент, когда браузер готов отобразить виртуальную среду сеанса на XR-дисплей. Указанный обратный вызов выполняется один раз перед следующей перерисовкой; если вы хотите, чтобы он выполнялся для следующей перерисовки, вы должны вызвать requestAnimationFrame() снова. Это можно сделать непосредственно в самом обратном вызове.

Обратный вызов принимает два параметра: XRFrame, описывающий состояние всех отслеживаемых объектов для сеанса, и отметку времени, которую вы можете использовать для расчёта любых анимационных обновлений.

Вы можете отменить ранее запланированную анимацию, вызвав cancelAnimationFrame().

Примечание: Несмотря на очевидные сходства между этими методами и глобальной функцией requestAnimationFrame(), предоставляемой интерфейсом Window, не следует считать их взаимозаменяемыми. Нет никакой гарантии, что последний будет работать вообще во время выполнения интерактивного XR-сеанса.

Синтаксис

requestAnimationFrame(animationFrameCallback)

Параметры

animationFrameCallback

Функция, которая вызывается перед следующей перерисовкой, чтобы позволить обновить и отобразить XR-сцену на основе прошедшего времени, анимации, изменений ввода пользователя и т. д. Обратный вызов получает два параметра в качестве входных данных:

time

DOMHighResTimeStamp, указывающий смещение времени, в котором обновленное состояние зрителя было получено от устройства WebXR.

xrFrame

Объект XRFrame, описывающий состояние отслеживаемых объектов сеансом. Это можно использовать для получения поз зрителя и самой сцены, а также другой информации, необходимой для отображения кадра AR или VR-сцены.

Возвращаемое значение

Целочисленное значение, которое служит уникальным, ненулевым идентификатором или дескриптором, который вы можете передать в cancelAnimationFrame(), если вам нужно удалить запрос на кадр анимации.

Примеры

В следующем примере запрашивается XRSession с режимом «встроенный», чтобы он мог отображаться в элементе HTML (без необходимости в отдельном устройстве AR или VR).

Примечание: В реальном приложении необходимо проверить, поддерживает ли устройство и пользовательский агент API WebXR вообще, а затем, поддерживает ли устройство и пользовательский агент необходимый тип сеанса с помощью XRSystem.isSessionSupported().

// Obtain XR object
const XR = navigator.xr;

// Request a new XRSession
XR.requestSession("inline").then((xrSession) => {
  xrSession.requestAnimationFrame((time, xrFrame) => {
    const viewer = xrFrame.getViewerPose(xrReferenceSpace);

    gl.bindFramebuffer(xrWebGLLayer.framebuffer);
    for (const xrView of viewer.views) {
      const xrViewport = xrWebGLLayer.getViewport(xrView);
      gl.viewport(
        xrViewport.x,
        xrViewport.y,
        xrViewport.width,
        xrViewport.height,
      );

      // WebGL draw calls will now be rendered into the appropriate viewport.
    }
  });
});

Следующий пример взят непосредственно из черновика спецификации. Этот пример демонстрирует шаблон проектирования, который обеспечивает бесшовный переход между неинтерактивными анимациями, созданными с помощью Window.requestAnimationFrame, и интерактивными XR-анимациями.

let xrSession = null;

function onWindowAnimationFrame(time) {
  window.requestAnimationFrame(onWindowAnimationFrame);

  // This may be called while an immersive session is running on some devices,
  // such as a desktop with a tethered headset. To prevent two loops from
  // rendering in parallel, skip drawing in this one until the session ends.
  if (!xrSession) {
    renderFrame(time, null);
  }
}

// The window animation loop can be started immediately upon the page loading.
window.requestAnimationFrame(onWindowAnimationFrame);

function onXRAnimationFrame(time, xrFrame) {
  xrSession.requestAnimationFrame(onXRAnimationFrame);
  renderFrame(time, xrFrame);
}

function renderFrame(time, xrFrame) {
  // Shared rendering logic.
}

// Assumed to be called by a user gesture event elsewhere in code.
function startXRSession() {
  navigator.xr.requestSession("immersive-vr").then((session) => {
    xrSession = session;
    xrSession.addEventListener("end", onXRSessionEnded);
    // Do necessary session setup here.
    // Begin the session's animation loop.
    xrSession.requestAnimationFrame(onXRAnimationFrame);
  });
}

function onXRSessionEnded() {
  xrSession = null;
}

Спецификации

Спецификация
API устройства WebXR
# dom-xrsession-requestanimationframe

Совместимость браузеров

Рабочий стол Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android
requestAnimationFrame 79 79 Нет 66 Нет 79 Нет 57 Нет 11.2 Нет

См. также

  • Window.requestAnimationFrame()
  • XRSession.cancelAnimationFrame()

© 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/requestAnimationFrame

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API