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 】
相关推荐:
MySQL 中使用 IF 和 CASE 实现查询字段的条件转换
php删除数据怎么清空表_truncate与delete区别及用法【汇总】
How to Properly Use NumPy in VS Code
PythonPandas数据分析教程_数据清洗与处理技巧
Win11怎么设置屏保时间_调整Win11屏幕保护等待时间【详解】
Win11任务栏怎么固定应用 Win11将软件图标固定到底部【步骤】
Win10系统怎么查看端口状态_Windows10 CMD查看网络连接
c++ nullptr与NULL区别_c++11空指针规范
Python对象生命周期管理_创建销毁说明【指导】
Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值
如何在Golang中捕获JSON序列化错误_Golangjson.Marshal错误处理示例
Win10怎样安装PPT模板_Win10安装PPT模板教程【步骤】
Mac如何备份到iCloud_Mac桌面与文稿文件夹云同步【设置】
php修改数据怎么改富文本_update更新html内容注意事项【说明】
如何在 Go 中正确初始化结构体中的 map 字段
Windows11怎样开启游戏模式_Windows11游戏模式开启攻略【方法】
C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】
Windows怎样关闭桌面弹窗广告_Windows关闭桌面弹窗设置【教程】
如何在Golang中使用log包输出不同级别日志_Golang log日志管理与分类
如何解决同一段404代码在不同主机上表现不一致的问题
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
如何高效识别并拦截拼接式恶意域名 spam
Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】
c++如何使用std::bitset进行位图算法_c++ 快速查找与大规模数据排重【方法】
Win11怎么设置快速访问_Windows11文件资源管理器主页
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
PHP中require语句后直接调用返回对象方法的语法解析
php怎么下载安装后设置错误日志_phpini log配置教程【汇总】
如何在 Go 中可靠地测试含 time.Time 字段的结构体
Win11怎么关闭键盘按键音_Win11禁用打字声音反馈【教程】
ACF 教程:正确更新嵌套在多层 Group 字段内的子字段
Windows 11怎么设置默认解压软件_Windows 11为ZIP/RAR文件指定默认打开程序
Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】
VSC怎么配置PHP的Xdebug_远程调试设置步骤【详解】
Windows 11如何开启文件夹加密(EFS)_Windows 11文件属性中加密内容以保护数据
Python异步编程高级项目教程_asyncio协程任务管理实战
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
Windows如何拦截腾讯视频广告_Windows拦截腾讯视频广告方法【方法】
电脑的“网络和共享中心”去哪了_Windows 11新版网络设置指南【新手】
Python面向对象实战讲解_类与设计模式深入理解
Windows如何使用BitLocker To Go加密U盘?(移动驱动器加密)
Win11输入法切换快捷键怎么改_Windows 11自定义语言切换键位【教程】
Python网页解析流程_html结构说明【指导】
c++协程和线程的区别 c++异步编程模型对比【核心】
Win11怎样安装网易云音乐_Win11安装网易云教程【步骤】
如何使用Golang处理静态文件缓存_提高页面加载速度
如何使用Golang benchmark测量函数延迟_统计执行耗时
Go 语言标准库为何不提供泛型 Contains 方法:设计哲学与类型系统约束
如何使用正则表达式提取以编号开头、后跟多个注解的完整代码块
如何使用Golang匿名函数_快速定义临时函数逻辑
2026-01-03
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。