本文详解如何基于 a-frame 1.5.0 与 ar.js 构建轻量级 webar 应用,解决 gltf 模型自动加载阻塞页面、vr 模式黑屏、模型不可见等常见问题,并提供可直接运行的移动端适配代码。
本文详解如何基于 a-frame 1.5.0 与 ar.js 构建轻量级 webar 应用,解决 gltf 模型自动加载阻塞页面、vr 模式黑屏、模型不可见等常见问题,并提供可直接运行的移动端适配代码。
在移动端通过浏览器调用摄像头展示 3D 模型(如 GLTF)是 WebAR 的典型场景,但直接使用基础 A-Frame 存在明显局限:<a-scene> 默认启用 WebGL 渲染上下文,导致页面加载时即触发模型预加载与渲染初始化,造成主线程阻塞、滚动卡顿;同时,纯 VR 模式下缺失真实世界背景(如摄像头画面),因此呈现为黑色天空盒——这并非 bug,而是设计使然:A-Frame 的 <a-sky> 或默认背景仅适用于虚拟环境,而非增强现实。
要真正实现「摄像头+3D模型」叠加效果,必须引入 AR.js ——一个专为 WebAR 优化的轻量级库,它通过 location-based 或 marker-based 方式将 A-Frame 场景锚定至现实空间,并自动接管 <a-scene> 的渲染逻辑,将摄像头流作为背景层,再将 3D 内容以 WebGL 叠加其上。
注意:AR.js 官方推荐搭配 A-Frame ≤1.4.x 使用,但经实测,AR.js v3.4.0+ 已全面支持 A-Frame 1.5.0。关键在于引入顺序与属性配置:
<head> <!-- 必须先加载 A-Frame --> <script src="https://aframe.io/releases/1.5.0/aframe.min.js"></script> <!-- 再加载 AR.js(需含 location/marker 支持) --> <script src="https://raw.githack.com/AR-js-org/AR.js/master/aframe/build/aframe-ar.js"></script> <!-- 可选:GLTF 加载增强(非必需,A-Frame 1.5+ 原生支持 gltf-model) --> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/aframe-extras.loaders.min.js"></script></head><body style="margin: 0; overflow: hidden;"> <!-- 启用 WebAR 模式:需添加 arjs 属性 --> <a-scene arjs="sourceType: webcam; debugUIEnabled: false;" renderer="antialias: true; colorManagement: true;" vr-mode-ui="enabled: false" > <!-- 摄像头流自动作为背景,无需 a-sky --> <!-- 模型应置于 camera 子节点中(确保相对坐标系稳定) --> <a-entity camera="userHeight: 1.6" look-controls="enabled: false" wasd-controls="enabled: false"> <a-entity gltf-model="url(path/gltf/model.gltf);" scale="0.5 0.5 0.5" position="0 0 -1" rotation="0 180 0" ></a-entity> </a-entity> <!-- 可选:添加平面检测(Markerless AR) --> <!-- <a-plane position="0 0 -2" rotation="-90 0 0" width="4" height="4" color="#7BC8A8" shadow></a-plane> --> </a-scene></body>
通过以上配置,你将获得一个零阻塞、低延迟、真 AR 效果的移动端 GLTF 展示方案——模型自然叠加于实时摄像头画面上,支持 iOS Safari 与 Android Chrome 全面兼容。