HTML5本身不支持直接导入3D模型,需借助Three.js等JS库通过WebGL加载glTF(推荐.glb)、OBJ+MTL等格式,并注意跨域、路径、材质规范及导出设置。
HTML5 本身不提供直接导入 3D 模型的能力——它只是网页标准,真正干活的是 JavaScript 和 WebGL(或 WebGPU)库,比如 Three.js、Babylon.js 或原生 WebGL。所谓“HTML5建模导入”,实际是用 JS 库加载常见 3D 格式文件,并在 Canvas 上渲染。
glTF(尤其是 .glb 二进制格式)是目前 Web 端最稳定、压缩率高、支持动画/材质/骨骼的格式。Three.js 官方推荐且内置 GLTFLoader,但需单独引入:
GLTFLoader 不在 three.min.js 主包里,必须额外加载 examples/jsm/loaders/GLTFLoader.js
file:// 协议触发 CORS,需起本地服务)gltf.scene,需手动 add() 到场景;动画需调用 gltf.animations 配合 AnimationMixer
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
const loader = new GLTFLoader();
loader.load(
'model.glb',
(gltf) => {
scene.add(gltf.scene);
// 若有动画
mixer = new THREE.AnimationMixer(gltf.scene);
gltf.animations.fo
rEach(clip => mixer.clipAction(clip).play());
},
undefined,
(error) => console.error('加载失败:', error)
);
OBJ 是纯几何体文本格式,材质全靠配套的 MTL 文件描述,浏览器加载时默认并发请求,但 MTL 中引用的贴图路径(如 map_Kd texture.jpg)常为相对路径,极易 404;且 OBJLoader 不解析法线贴图、PBR 材质等现代特性。
MTL 文件和所有贴图与 HTML 同域,且路径可被正确解析(建议用完整相对路径,如 ./textures/rock.jpg)OBJLoader 和 MTLLoader 需按顺序使用:先加载 MTL,再传给 OBJLoader用户想直接拖一个 .glb 到网页里预览?得靠 FileReader + GLTFLoader.parse()(注意不是 load()):
parse() 接收 ArrayBuffer,需用 FileReader.readAsArrayBuffer(file)
File 对象,也不能用 URL.createObjectURL(file) 再走网络加载(会绕过 CORS 但触发同源策略限制)inputElement.addEventListener('change', (e) => {
const file = e.target.files[0];
if (!file || !file.name.endsWith('.glb')) return;
const reader = new FileReader();
reader.onload = (event) => {
const arrayBuffer = event.target.result;
loader.parse(arrayBuffer, '', (gltf) => {
scene.clear(); // 清旧模型
scene.add(gltf.scene);
});
};
reader.readAsArrayBuffer(file);
});
从 Blender / Maya 导出能被 Three.js 正确读取的 .glb,不是点“导出”就完事:
glTF 2.0 插件(2.8+ 默认启用),导出时勾选 Export as Binary (.glb)
Apply Modifiers 可能导致细分曲面丢失;启用 Include > Selected Objects 避免导出隐藏物体Principled BSDF 节点,贴图连到对应输入口(Base Color、Normal、Occlusion 等),否则导出后变灰或无纹理Export Animation 已勾选真正麻烦的从来不是“怎么写代码加载”,而是模型制作端的规范性——贴图路径错一位、法线没翻转、坐标系没统一,都会让前端白忙半小时。