JavaScript 通过 WebXR API 调用设备传感器实现真 AR/VR,而非模拟;WebXR 是 W3C 标准,统一接口,支持平面检测、锚定、姿态追踪;需处理兼容性与降级策略。
JavaScript 本身不直接实现 AR/VR,而是通过 WebXR API(浏览器原生支持的接口)调用设备能力,在网页中构建沉浸式 3D 场景。它不是靠“模拟”,而是真正连接手机陀螺仪、VR 头显姿态、手柄输入、环境光照甚至平面检测(AR),让网页内容响应真实物理空间。
WebXR 是 W3C 标准,统一了以前分散的 WebVR/WebAR 接口。它不依赖插件或 App,只要浏览器支持(Chrome、Edge、Firefox on Android / Quest / Windows MR),就能用 JavaScript 启动会话:
navigator.xr.requestSession('immersive-ar') 或 'immersive-vr',获得设备追踪权限以 WebXR AR(如 Chrome for Android)为例,重点不在画模型,而在“粘得牢”:
{requiredFeatures: ['plane-detection']}
session.addEventListener('xrsessionupdate', e => { ... }) 获取新检测到的平面(e.planeAnchor),再用 session.addAnchor() 固定虚拟物体坐标frame.getPose(referenceSpace, xrReferenceSpace),拿到当前帧下物体相对于真实平面的姿态,更新 Three.js 或 Babylon.js 中 mesh 的 position/quaternionVR 不是把屏幕变大,而是切断视觉参
照、用双目视差+头部运动反馈欺骗前庭系统:
requestAnimationFrame 的 XR frame callback 内完*部逻辑+渲染,超时会丢帧、引发眩晕PannerNode,将音源 position/orientation 绑定到 XRFrame 中获取的玩家头部 pose,声音随转头自然变化inputSources(如 Oculus Touch、Quest 控制器),读取 gamepad.axes 和 gamepad.buttons,用射线(raycaster)判断是否“指向并点击”3D 物体,而非鼠标悬停WebXR 尚未全平台覆盖,实际项目必须考虑 fallback:
navigator.xr?.isSessionSupported(type) 预检支持度,AR 在 iOS Safari 仍需 WebKit 实验性开启,VR 在桌面 Chrome 需启用 chrome://flags/#webxr
screen.orientation 和 deviceMotion,用陀螺仪简易模拟 AR(虽无平面检测,但能实现“手机当窥镜”的基础效果)