基于 ThreeJS 的 DTE 库使用 - 使用 loader 加载 3D 格式文件

三葉Leaves Author

本文是我在某中厂任职时的学习笔记,用到 DTE 库是基于 ThreeJS 实现的闭源的公司内部库,替代方案和说明可见 DTE 库的开源替代方案(ThreeJS 等)

复杂的模型通常是由专业的三维建模软件(如 Blender, 3ds Max, Maya)创建,并导出为标准格式的文件,比如 GLTF, GLB, OBJ, FBX 等。

DTE 封装了针对不同文件格式的加载器,使得可以把这些建模软件导出的东西加载到 web 前端,一听就很有意思!

关于 GLTF、GLB 格式

  • GLTF (GL Transmission Format) 被称为 “三维领域的JPEG”。它就是为了在网络上高效传输和加载3D场景和模型而生的标准。
  • GLB 是 GLTF 的二进制格式,通常把所有信息(模型、贴图)都打包在一个文件里,更方便传输。在Web 3D领域,它们是首选格式。

我从 KhronosGroup/glTF-Sample-Models: glTF Sample Models 上找了一个开源的 .glb 格式的模型,这是一只可爱的小黄鸭,我们本节课就用它:

https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Binary/Duck.glb

加载模型资源是一个异步操作,加载器的 load 方法通常不会立即返回模型,而是返回一个 Promise,后面 .then 回调函数接收到的参数才是模型啦。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// --- 之前的代码 ---
const containerDiv = document.getElementById('my-3d-container');
const container3D = new CommonContainer({ domId: containerDiv });
const { scene, camera, renderer } = container3D;
camera.position.z = 10; // 调整相机位置,具体数值取决于模型大小

// --- 本课新代码 ---

// 1. 创建一个模型加载器实例
const modelLoader = new ModelLoader();
console.log("模型加载器已准备就绪。");

// 2. 定义你要加载的模型的URL
// 注意:你需要替换成一个真实可访问的模型URL
// 如果你没有现成的模型,可以搜索 "free gltf model" 找一些来测试
// 这里我从 https://github.com/KhronosGroup/glTF-Sample-Models 那里拿来一个试试
const modelUrl =
'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Binary/Duck.glb';

// 3. 调用 loadGLTF 方法开始加载
console.log(`开始从 ${modelUrl} 加载模型...`);
modelLoader.loadGLTF(modelUrl).then((model) => {

// 当Promise成功解析后,这里的代码就会执行
// 'model' 就是加载并解析好的三维物体!
console.log("模型加载成功!", model);

// 4. 和之前一样,把它添加到场景里
scene.add(model);
// 有时候加载进来的模型可能太大或太小,或者位置不对
model.scale.set(100, 100, 100); // 放大到原来的 100 倍
// model.position.y = -2; // 往下移动一点
// 旋转它
model.rotation.y = - Math.PI / 16; // 绕Y轴旋转
// 下面我来尝试变个色
// 遍历它的子物体,改变所有子物体的材质
model.traverse((child: { isMesh: any; material: any }) => {
if (child.isMesh) {
// 如果这个子节点是一个Mesh
child.material = new core.MeshBasicMaterial({ color: 0xff00ff }); // 把它变成骚气的品红色
}
});

}).catch((error) => {
// 如果加载过程中出错了,这里的代码会执行
console.error("加载模型时发生错误:", error);
});

console.log("我这行代码会先执行,因为加载是异步的。");

本课小结

  • 我们理解了为什么需要加载器(Loader):用于加载外部复杂的模型文件。

  • 我们知道了加载是一个异步过程,并学会了使用 Promise 的 .then() 语法来处理加载完成后的逻辑。

  • 我们掌握了使用DTE的 ModelLoader 来加载 gltf/glb 格式的模型。

  • 我们明白了加载回来的模型对象本质上也是一个普通的 Object3D (比如 Mesh 或 Group),可以对它进行移动、旋转、缩放,甚至修改材质。

  • 标题: 基于 ThreeJS 的 DTE 库使用 - 使用 loader 加载 3D 格式文件
  • 作者: 三葉Leaves
  • 创建于 : 2025-07-31 00:00:00
  • 更新于 : 2026-03-16 12:05:06
  • 链接: https://blog.oksanye.com/f015a4c68852/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
基于 ThreeJS 的 DTE 库使用 - 使用 loader 加载 3D 格式文件