VRDisplay: phương thức requestAnimationFrame()

Deprecated: This feature is no longer recommended. Though some browsers might still support it, it may have already been removed from the relevant web standards, may be in the process of being dropped, or may only be kept for compatibility purposes. Avoid using it, and update existing code if possible; see the compatibility table at the bottom of this page to guide your decision. Be aware that this feature may cease to work at any time.

Non-standard: This feature is not standardized. We do not recommend using non-standard features in production, as they have limited browser support, and may change or be removed. However, they can be a suitable alternative in specific cases where no standard option exists.

Phương thức requestAnimationFrame() của giao diện VRDisplay là một triển khai đặc biệt của Window.requestAnimationFrame chứa một hàm callback sẽ được gọi mỗi khi một khung hình mới của bản trình chiếu VRDisplay được kết xuất:

Note: Phương thức này là một phần của WebVR API cũ. Nó đã được thay thế bởi WebXR Device API.

  • Khi VRDisplay không đang trình chiếu cảnh, phương thức này tương đương về mặt chức năng với Window.requestAnimationFrame.
  • Khi VRDisplay đang trình chiếu, callback được gọi theo tần số làm mới gốc của nó.

Cú pháp

js
requestAnimationFrame(callback)

Tham số

callback

Một hàm callback sẽ được gọi mỗi khi một khung hình mới của bản trình chiếu VRDisplay được kết xuất.

Giá trị trả về

Một số nguyên long đại diện cho handle của lần gọi requestAnimationFrame(). Handle này có thể được truyền vào lời gọi VRDisplay.cancelAnimationFrame() để hủy đăng ký callback.

Ví dụ

js
const frameData = new VRFrameData();
let vrDisplay;

navigator.getVRDisplays().then((displays) => {
  vrDisplay = displays[0];
  console.log("Display found");
  // Starting the presentation when the button is clicked: It can only be called in response to a user gesture
  btn.addEventListener("click", () => {
    vrDisplay.requestPresent([{ source: canvas }]).then(() => {
      drawVRScene();
    });
  });
});

// WebVR: Draw the scene for the WebVR display.
function drawVRScene() {
  // WebVR: Request the next frame of the animation
  vrSceneFrame = vrDisplay.requestAnimationFrame(drawVRScene);

  // Populate frameData with the data of the next frame to display
  vrDisplay.getFrameData(frameData);

  // You can get the position, orientation, etc. of the display from the current frame's pose
  const curFramePose = frameData.pose;
  const curPos = curFramePose.position;
  const curOrient = curFramePose.orientation;

  // Clear the canvas before we start drawing on it.

  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

  // WebVR: Create the required projection and view matrix locations needed
  // for passing into the uniformMatrix4fv methods below

  const projectionMatrixLocation = gl.getUniformLocation(
    shaderProgram,
    "projMatrix",
  );
  const viewMatrixLocation = gl.getUniformLocation(shaderProgram, "viewMatrix");

  // WebVR: Render the left eye's view to the left half of the canvas
  gl.viewport(0, 0, canvas.width * 0.5, canvas.height);
  gl.uniformMatrix4fv(
    projectionMatrixLocation,
    false,
    frameData.leftProjectionMatrix,
  );
  gl.uniformMatrix4fv(viewMatrixLocation, false, frameData.leftViewMatrix);
  drawGeometry();

  // WebVR: Render the right eye's view to the right half of the canvas
  gl.viewport(canvas.width * 0.5, 0, canvas.width * 0.5, canvas.height);
  gl.uniformMatrix4fv(
    projectionMatrixLocation,
    false,
    frameData.rightProjectionMatrix,
  );
  gl.uniformMatrix4fv(viewMatrixLocation, false, frameData.rightViewMatrix);
  drawGeometry();

  function drawGeometry() {
    // draw the view for each eye
  }

  // …

  // WebVR: Indicate that we are ready to present the rendered frame to the VR display
  vrDisplay.submitFrame();
}

Note: Bạn có thể xem toàn bộ mã này tại raw-webgl-example.

Thông số kỹ thuật

Phương thức này là một phần của WebVR API cũ đã được thay thế bởi WebXR Device API. Nó không còn trên đường trở thành tiêu chuẩn nữa.

Cho đến khi tất cả các trình duyệt đã triển khai WebXR API mới, khuyến nghị sử dụng các framework như A-Frame, Babylon.js, hoặc Three.js, hay một polyfill, để phát triển ứng dụng WebXR hoạt động trên tất cả các trình duyệt. Đọc hướng dẫn Porting from WebVR to WebXR của Meta để biết thêm thông tin.

Tương thích trình duyệt

Xem thêm