在 PlayCanvas 中使用 WebXR
支持
浏览器尚未普遍支持 WebXR,可以这样检测:
if (app.xr.supported) {
// WebXR is supported
}
启动 XR 会话
可通过 Camera 组件方法或应用的 XrManager 启动。需要提供 CameraComponent、会话类型、参考空间,以及可选的额外参数对象:
app.xr.start(entity.camera, pc.XRTYPE_VR, pc.XRSPACE_LOCALFLOOR);
启动是异步操作,只能响应按钮点击、鼠标或触摸等用户交互:
button.on('click', () => {
// start XR session
});
可以订阅 start 了解启动完成:
app.xr.on('start', () => {
// XR session has started
});
特定平台可能不支持某类型或参考空间,启动失败时会向回调传错误,并触发 XrManager 的 error:
entity.camera.startXr(pc.XRTYPE_VR, pc.XRSPACE_UNBOUNDED, {
callback: (err) => {
if (err) {
// failed to start session
}
}
});
结束 XR 会话
可通过代码退出:
app.xr.end();
用户也可能通过浏览器返回等外部方式退出,XrManager 会触发 end:
app.xr.on('end', () => {
// XR session has ended
});
会话类型
各平台支持的类型不同:
- VR,虚拟现实:提供观察者追踪并独占 XR 设备,内容绘到设备帧缓冲,而非 HTML 画布。
- AR,增强现实:独占 XR 设备,虚拟内容与现实混合,此模式摄像机清屏颜色应透明。
设备连接或功能开关可能使会话类型可用性在运行中变化,检查方法如下:
if (app.xr.isAvailable(pc.XRTYPE_VR)) {
// VR is available
}
也可订阅可用性变化:
app.xr.on('available', (type, available) => {
console.log('XR session', type, 'type is now', available ? 'available' : 'unavailable');
});
// or specific session type
app.xr.on('available:' + pc.XRTYPE_VR, (available) => {
console.log('XR session VR type is now', available ? 'available' : 'unavailable');
});
摄像机位置与方向
XR 呈现期间,摄像机位置和旋转由会话覆盖。需要额外位移或转向时,为摄像机添加父实体,并操作父项。

输入源、网格、平面、图像等 XR 对象的位置、方向和射线均以世界空间提供。
为什么不能自动进入 XR?
浏览器要求由用户操作触发 WebXR,例如按键、点击或触摸,因此不能在页面刚加载时立即进入。