WebXR 是浏览器原生支持 VR/AR 的稳定 API,需 HTTPS/localhost、用户手势触发 requestSession,并通过 isSessionSupported 检测兼容性;渲染依赖 WebGL/Three.js,须正确配置 XRSession、renderState、referenceSpace 及控制器。
WebXR 是浏览器原生支持 VR/AR 应用的 API,不是第三方库,也不依赖插件;它已进入稳定阶段,Chrome、Edge、Firefox(部分支持)均可用,但必须通过 HTTPS 或 localhost 访问,否则 navigator.xr 为 undefined。
不能只靠 "xr" in navigator 判断——有些浏览器暴露 navigator.xr 但不支持任何 XRSessionMode。真实检测要发起一次 session 请求并监听拒绝原因。
navigator.xr 是否存在且为对象navigator.xr.isSessionSupported("immersive-vr")(返回 Promise),而不是直接 requestSession
SecurityError(非 HTTPS)、NotSupportedError(设备无 VR 硬件或浏览器未启用 WebXR)、NotAllowedError(用户未点击触发,如自动启动)if ("xr" in navigator) {
navigator.xr.isSessionSupported("immersive-
vr").then(supported => {
if (supported) {
// 可安全调用 requestSession
}
}).catch(err => console.error("XR 检测失败:", err.name));
}
WebXR 不负责 3D 渲染,它只提供姿态、视图、投影矩阵;你得自己接 WebGL 或 Three.js。核心是绑定 XRSession 的 render 循环,并在每一帧中调用 getViewerPose 获取头部位置。
requestSession("immersive-vr") 必须由用户手势(如 click、touchstart)触发session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }),否则 requestAnimationFrame 中无法获取有效视图session.requestAnimationFrame(不是 window.requestAnimationFrame),否则姿态更新会不同步button.addEventListener("click", async () => {
const session = await navigator.xr.requestSession("immersive-vr");
session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
function render(time, frame) {
const pose = frame.getViewerPose(referenceSpace);
if (pose) {
for (const view of pose.views) {
// 使用 view.transform、view.projectionMatrix 渲染左右眼
}
}
session.requestAnimationFrame(render);
}
session.requestAnimationFrame(render);
});
Three.js r125+ 内置 WebXR 支持,但默认不启用——必须手动开启渲染器的 xr.enabled 并添加 XRControllerModelFactory 才能有手柄模型。漏掉任一环节都会导致黑屏或无交互。
立即学习“Java免费学习笔记(深入)”;
renderer.xr.enabled = true
new THREE.XRController(0) 和 new THREE.XRController(1)(对应左右手),否则手柄输入不可用OrbitControls,需在进入 XR 时禁用,否则视角会被双重控制THREE.GLTFLoader 并启用 dracoLoader,否则复杂模型在 VR 中易卡顿const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.xr.enabled = true;
const controller1 = renderer.xr.getController(0);
const controller2 = renderer.xr.getController(1);
scene.add(controller1, controller2);
// 进入 VR 前
button.addEventListener("click", () => {
renderer.xr.setSession(session); // session 来自 requestSession
});
WebXR 的坑不在 API 复杂,而在环境链路太长:HTTPS → 浏览器标志位 → 设备驱动 → WebGL 上下文 → 三维引擎适配。任一环节断开,错误信息都极不明确,比如 getViewerPose 返回 null 可能是 reference space 未正确创建,也可能是 session 被意外 ended,调试时优先检查 session.visibilityState 和 console.log(frame) 的实际内容。
# javascript
# java
# js
# 浏览器
# edge
# session
# ai
# win
# 虚拟现实
# javascript开发
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Windows资源管理器总是卡顿或重启怎么办?(修复方法)
Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】
Windows电脑如何进入安全模式?(多种按键方法)
Mac如何整理桌面文件_Mac使用堆栈功能一键整理
Win10文件历史记录怎么用 Win10开启自动备份文件教程【防丢】
Win11怎么关闭开机声音_Win11系统启动提示音静音【教程】
LINUX的SELinux是什么_详解LINUX强制访问控制系统的入门与配置
Win11怎样安装网易云音乐_Win11安装网易云教程【步骤】
VSC怎么配置PHP的Xdebug_远程调试设置步骤【详解】
如何使用Golang配置安全开发环境_防止敏感信息泄露
Windows 11登录时提示“用户配置文件服务登录失败”怎么办_Windows 11修复损坏的用户配置文件
如何在 Go 中判断变量是否为函数类型
Win10怎么关闭自动更新错误弹窗_Win10策略屏蔽失败提示减少干扰【防护】
Win11怎么设置任务栏对齐方式_Windows11个性化任务栏行为
Win11怎么关闭防火墙通知_屏蔽Win11安全中心安全警告弹窗【技巧】
Win11任务栏怎么固定应用 Win11将软件图标固定到底部【步骤】
Win11怎么开启远程桌面连接_Windows11系统属性远程设置
Windows如何查看和管理已安装的字体?(字体文件夹)
Python面向对象实战讲解_类与设计模式深入理解
Win11怎么关闭任务栏小组件_Windows11隐藏任务栏天气图标
Win11怎么设置系统还原_Windows11系统属性保护设置
Windows10如何更改鼠标图标_Win10鼠标属性指针浏览
Windows蓝屏错误0x0000002C怎么解决_系统IO异常排查方法
Windows11如何设置专注助手_Windows11专注助手使用攻略【技巧】
Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】
Win11怎么设置开机问候语_自定义Win11锁屏提示信息【技巧】
Win10怎样安装Excel数据分析工具_Win10安装分析工具包步骤【教程】
Windows蓝屏错误0x00000018怎么处理_驱动初始化错误解决
php中::能访问全局变量吗_全局作用域与类作用域区分【操作】
php订单日志怎么记录发货_php记录订单发货操作日志指南【指南】
c++中如何进行二进制文件读写_c++ read与write函数用法
如何使用Golang处理静态文件缓存_提高页面加载速度
Go 中的 := 运算符:类型推导机制与使用边界详解
本地php环境出现502错误_nginx或apache502badgateway解决技巧【解答】
Linux如何挂载新硬盘_Linux磁盘分区格式化与开机自动挂载【指南】
如何从 Go 的 map[string]interface{} 中安全获取值
如何使用Golang实现容器健康检查_监控和自动重启
Win11时间格式怎么改成12小时制 Win11时间格式切换教程【步骤】
Python正则表达式实战_模式匹配说明【教程】
c++怎么设置线程优先级与cpu亲和性_c++ 多核处理器性能绑定【指南】
Python项目维护经验_长期演进说明【指导】
Python抽象类与接口设计_规范说明【指导】
如何使用Golang实现跨域请求支持_Golang CORS配置与处理方法
Windows10系统怎么查看CPU核心数_Win10逻辑处理器数量查看
php接口返回数据乱码怎么办_php接口调试编码问题解决【指南】
php订单日志怎么在swoole写_php协程swoole写订单日志教程【教程】
Linux如何安装Golang环境_Linux下Go语言开发包配置【方法】
PHP接收参数长度超限怎么办_修改postmaxsize设置教程【解答】
Win11怎么清理C盘系统错误报告_Win11清理系统错误报告技巧【教程】
如何使用Golang开发简单的聊天室消息存储_Golang WebSocket数据持久化方法
2026-01-03
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。