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;
}
Спецификации
Совместимость браузеров
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | Нет |
См. также
© 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