←返回博客

我的浏览器游戏如何在 Meta Quest 上运行 VR

2026年9月26日4 min read

我的游戏 Bannermarch 运行在浏览器中,而且现在是 3D 的,我想看看我是否可以在 VR 中玩它。你可以。我戴上 Meta Quest,在头显的浏览器中打开游戏,然后按了一个写着“进入 VR”的按钮。然后我就站在我的城堡里,主塔(主要建筑)就在我面前的山丘上。我没有安装任何东西。这和你用笔记本电脑打开的同一个网页。

这之所以可行,是因为两件事。浏览器有一个内置的 VR 头显 API,称为 WebXR,而游戏已经使用了 Babylon.js,这是一个知道如何使用它的 3D 引擎。

浏览器如何实现 VR

WebXR 允许网页与 VR 头显进行通信。Quest 浏览器支持它,带有 PC VR 头显的电脑上的 Chrome 和 Edge 也支持。iPhone 上的 Safari 不支持。

首先,页面会询问浏览器 VR 是否可用。如果可用,页面会显示一个“进入 VR”按钮。你必须点击某个东西才能启动 VR,因为浏览器不允许页面自行启动(这和阻止视频自动播放并带声音的规则一样)。

点击后,浏览器将接管头显的屏幕。每秒很多次,它会告诉页面你的头部和手的位置。然后页面会为每个眼睛绘制两次游戏画面,每次从略微不同的位置绘制。这种微小的差异就是让头显中的物体看起来具有 3D 效果的原因。

// 普通 WebXR,无引擎
if (await navigator.xr?.isSessionSupported("immersive-vr")) {
  button.onclick = async () => {
    const session = await navigator.xr.requestSession("immersive-vr");
    const space = await session.requestReferenceSpace("local-floor");
    session.requestAnimationFrame(function frame(time, xrFrame) {
      const pose = xrFrame.getViewerPose(space);
      for (const view of pose.views) {
        // 使用 view.transform 和 view.projectionMatrix 绘制场景
      }
      session.requestAnimationFrame(frame);
    });
  };
}

local-floor 部分告诉浏览器将游戏的地面放置在你真实的地面位置,这样你就能从自己的高度看到世界。

浏览器负责处理复杂的部分,例如头部追踪和图像适配镜片。游戏只需绘制摄像机所看到的内容。

Babylon.js 如何提供帮助

我没有自己编写那段代码。Babylon.js 有一个名为 WebXRDefaultExperience 的辅助工具,可以为你完成这些工作。它会启动 VR 会话并在你移动头部时移动摄像机。它还会在控制器上提供激光指针,并允许你进行瞬移。这大致就是我需要的全部设置。

const xr = await WebXRDefaultExperience.CreateAsync(scene, {
  disableDefaultUI: true,
  floorMeshes: [ground],
  disableHandTracking: true,
  inputOptions: {
    doNotLoadControllerMeshes: true,
    disableOnlineControllerRepository: true,
  },
  teleportationOptions: { forceHandedness: "right" },
});

// 稍后,从“进入 VR”按钮触发
await xr.baseExperience.enterXRAsync("immersive-vr", "local-floor");

我无需更改游戏本身。它和你用笔记本电脑看到的 3D 世界是相同的,拥有相同的建筑、人物和船只。如果你指向一栋建筑并按下扳机,它的名字就会显示在上面。再次按下扳机,游戏就会带你退出 VR,并打开该建筑的菜单。管理你的城堡在普通屏幕上仍然更容易。

手机和笔记本电脑上的用户不会下载任何 VR 代码。它只会在能够使用的设备上加载。

出了什么问题

第一次尝试并不顺利。控制器上的拇指摇杆起初毫无反应。Babylon 会为每个控制器下载一个文件,说明它有哪些按钮,但我的网站的安全设置阻止了该下载。没有这个文件,Babylon 会将控制器视为只有一个扳机。我通过将这些文件放在游戏内部来解决这个问题,这样它就不需要下载它们了。

当我添加左摇杆行走功能时,“进入 VR”按钮消失了。Babylon 内置的行走功能无法与瞬移同时开启,因此 VR 设置崩溃了。我用大约 30 行代码编写了自己的行走功能。左摇杆会让你朝着你注视的方向行走,右摇杆则会让你瞬移或分步旋转。我省略了平滑转向,因为它会让很多人感到头晕。

头显中的颜色看起来不对。游戏在普通摄像机的最后一步调整其颜色,而这一步在 VR 摄像机上不起作用,所以我必须以另一种方式在 VR 中应用它。

当我进入 VR 时,游戏也冻结了。为了省电,当你切换到另一个标签页时,它会停止绘制。当我处于 VR 状态时,Quest 浏览器会告诉游戏它的标签页被隐藏了,所以游戏停止了。现在它在 VR 开启时会继续绘制。

Quest 的图形芯片的强度大约相当于手机的,而且它必须绘制两次所有内容,因此它只能运行游戏的低图形设置。一些手机也声称支持 VR(用于纸板查看器),所以我只在头显和电脑上显示该按钮。

登录是另一个问题,因为在浮动键盘上输入密码很痛苦。我在 如何像电视一样为 VR 头显配对 中写了我是如何解决这个问题的。

保持更新

将最新文章和见解发送到您的收件箱。

不发送垃圾邮件,可随时退订。