Three.js 资源加载指南:模型、纹理与异步加载优化

解决 3D 场景资源导入痛点:通过配置 GLTFLoader、TextureLoader 等加载器,实现模型、贴图及 HDR 环境图的快速导入,并构建完善的异步加载进度管理机制。

为什么需要这个技能

在构建 Three.js 场景时,绝大部分视觉内容都依赖外部资源文件。如果简单的使用回调函数,在面对大量模型和高分辨率纹理时,容易出现回调地狱,且无法给用户提供直观的加载进度条。

此外,3D 模型文件(如 GLB)往往较大,直接加载会导致严重的掉帧或加载缓慢。掌握 Draco 压缩、KTX2 纹理加载以及 LoadingManager 的协调机制,能显著提升 Web 3D 应用的启动速度和运行性能。

适用场景

  • 需要将 Blender 或 Maya 制作的 GLTF/GLB 模型导入网页。
  • 需要为场景添加 PBR 材质贴图、环境光照贴图(HDR/EXR)。
  • 构建游戏或大型 3D 演示时,需要实现一个加载进度界面(Loading Screen)。
  • 优化资源体积,使用 Draco 或 Meshopt 压缩技术减少带宽占用。

核心工作流

1. 资源协调管理

使用 THREE.LoadingManager 统一监控所有加载器的状态,在所有资源就绪后一次性启动场景。

const manager = new THREE.LoadingManager();

manager.onProgress = (url, loaded, total) => {
  const progress = (loaded / total) * 100;
  console.log(`加载进度: ${progress.toFixed(1)}%`);
};

manager.onLoad = () => {
  console.log("所有资源加载完成!");
  startGame();
};

const gltfLoader = new GLTFLoader(manager);
const textureLoader = new THREE.TextureLoader(manager);

2. 核心模型加载 (GLTF/GLB)

GLTF 是 Web 端的标准格式。对于大型模型,建议配置 DRACOLoader 进行解压。

import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
import { DRACOLoader } from "three/addons/loaders/DRACOLoader.js";

const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.6/");

const gltfLoader = new GLTFLoader();
gltfLoader.setDRACOLoader(dracoLoader);

gltfLoader.load("model.glb", (gltf) => {
  scene.add(gltf.scene);
});

3. 纹理与环境映射

除了基础的 TextureLoader,对于高动态范围环境图,推荐使用 RGBELoader 结合 PMREMGenerator 来实现真实的 PBR 反射效果。

import { RGBELoader } from "three/addons/loaders/RGBELoader.js";

const rgbeLoader = new RGBELoader();
rgbeLoader.load("environment.hdr", (texture) => {
  texture.mapping = THREE.EquirectangularReflectionMapping;
  scene.environment = texture;
  scene.background = texture;
});

4. 异步 Promise 封装

为了避免回调嵌套,将加载器封装为 Promise,配合 async/awaitPromise.all 实现并行加载。

function loadModel(url) {
  return new Promise((resolve, reject) => {
    new GLTFLoader().load(url, resolve, undefined, reject);
  });
}

async function initScene() {
  try {
    const [model, env] = await Promise.all([
      loadModel("robot.glb"),
      loadHDR("studio.hdr")
    ]);
    scene.add(model.scene);
    scene.environment = env;
  } catch (e) {
    console.error("资源加载失败", e);
  }
}

下载和安装

下载 threejs-loaders 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md

你可能还需要

暂无推荐