Skip to content

资源管线

资源管线涵盖了 3D 模型、纹理和场景数据的导入与导出系统。这包括各种文件格式(glTF、FBX、OBJ 等)的加载器、支持压缩的纹理加载,以及将场景序列化回标准格式的导出器。该管线提供了将外部资源加载到 Three.js 场景图和材质中的统一接口。

有关程序化几何体生成的信息,请参阅 程序化几何体。有关使用 ObjectLoader/toJSON 系统序列化完整场景的信息,请参阅 场景序列化

系统架构

资源管线构建在共享的基础类和工具之上,所有加载器都继承自此外。这为路径解析、进度跟踪、错误处理和资源缓存提供了一致的行为。

核心基础设施

SVG
100%

Loader 基类 (src/loaders/Loader.js) 为所有加载器提供通用属性:

属性类型用途
managerLoadingManager跨多个资源跟踪加载进度
crossOriginstring图像加载的 CORS 设置
withCredentialsboolean是否在请求中发送凭据
pathstring预置到所有 URL 的基础路径
resourcePathstring用于解析依赖资源的路径
requestHeaderObject自定义 HTTP 头

格式支持矩阵

Three.js 为多种 3D 文件格式提供加载器,每种格式具有不同的功能和使用场景:

格式加载器类支持的功能主要用途
glTF 2.0 (.gltf/.glb)GLTFLoaderMesh、材质(PBR)、纹理、动画、蒙皮、变形目标、灯光、相机、20+ 扩展现代资源交付、游戏引擎、AR/VR
FBX (.fbx)FBXLoaderMesh、材质(Phong/Lambert)、纹理、动画、蒙皮、变形目标、相机、灯光DCC 工具交换(Maya、3ds Max)
OBJ/MTL (.obj/.mtl)OBJLoader/MTLLoaderMesh、材质(Phong)、纹理简单模型交换、旧格式
STL (.stl)STLLoaderMesh、顶点颜色(二进制)、多实体(ASCII)CAD、3D 打印
PLY (.ply)PLYLoaderMesh、顶点颜色、法线、自定义属性点云、扫描数据
3MF (.3mf)ThreeMFLoaderMesh、材质(基础+PBR)、纹理、顶点颜色3D 打印、Microsoft 3D 生态系统
EXR (.exr)EXRLoaderHDR 纹理、多种压缩模式HDR 环境贴图、渲染通道
PCD (.pcd)PCDLoader点云、RGB、法线、强度激光雷达、机器人
NRRD (.nrrd)NRRDLoader体数据(医学成像)医学可视化

glTF 加载器系统

GLTFLoader 是 Three.js 中最复杂的加载器,实现了 glTF 2.0 规范并具备广泛的扩展支持。它使用插件架构来处理扩展和压缩。

GLTFLoader 架构

SVG
100%

扩展系统

GLTFLoader 在构造时注册扩展插件,并提供 register() 方法供第三方扩展使用。解析期间会查询扩展以处理特定的 glTF 扩展数据。

SVG
100%

扩展注册:

加载器支持 20+ 扩展,在构造函数中注册 examples/jsm/loaders/GLTFLoader.js141-248

  • 材质扩展: KHR_materials_clearcoatKHR_materials_transmissionKHR_materials_volumeKHR_materials_iorKHR_materials_specularKHR_materials_iridescenceKHR_materials_sheenKHR_materials_anisotropyKHR_materials_dispersionKHR_materials_emissive_strengthKHR_materials_unlitEXT_materials_bump
  • 纹理扩展: KHR_texture_basisuEXT_texture_webpEXT_texture_avifKHR_texture_transform
  • 压缩: KHR_draco_mesh_compressionKHR_meshopt_compressionEXT_meshopt_compression
  • 其他: KHR_lights_punctualKHR_mesh_quantizationEXT_mesh_gpu_instancing

配置压缩加载器

// 配置 DRACO 解码器用于网格压缩
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath( '/examples/jsm/libs/draco/' );
gltfLoader.setDRACOLoader( dracoLoader );

// 配置 KTX2 解码器用于纹理压缩
const ktx2Loader = new KTX2Loader();
ktx2Loader.setTranscoderPath( '/examples/jsm/libs/basis/' );
gltfLoader.setKTX2Loader( ktx2Loader );

// 配置 meshopt 解码器
gltfLoader.setMeshoptDecoder( MeshoptDecoder );

FBX 加载器

FBXLoader 处理 Autodesk FBX 格式,支持 ASCII(>= 7.0)和二进制(>= 6400)版本。它解析 FBX 树结构并将其转换为 Three.js 对象。

FBX 解析管线

SVG
100%

FBX 格式使用基于连接的系统,其中对象通过数字 ID 相互引用。解析器构建连接映射 examples/jsm/loaders/FBXLoader.js209-253,然后遍历它以构建最终场景图。

OBJ/MTL 加载器

Wavefront OBJ 格式是最古老和最简单的 3D 格式之一。OBJLoader 解析几何体,而 MTLLoader 解析配套材质文件。

OBJ 解析状态机

SVG
100%

OBJ 格式使用文本指令。面通过语法 f v1/vt1/vn1 v2/vt2/vn2 ... 按索引引用顶点。加载器维护一个 ParserState 对象 examples/jsm/loaders/OBJLoader.js38-201,累积几何数据并构建 Mesh 对象。

MTL 材质属性:

MTLLoader 解析材质属性并创建 MeshPhongMaterial 实例 examples/jsm/loaders/MTLLoader.js1-33

MTL 指令Three.js 属性描述
Kaambient环境色
Kdcolor漫反射色
Ksspecular镜面色
Nsshininess镜面指数
d / Tropacity透明度
map_Kdmap漫反射纹理
map_KsspecularMap镜面纹理
map_Bump / bumpbumpMap凹凸/法线贴图

纹理加载

纹理加载支持标准图像格式(JPEG、PNG 等)以及用于 HDR 和压缩纹理的专用格式。

纹理加载器层级

SVG
100%

EXR 加载器详情

EXRLoader 支持具有多种压缩方法的 OpenEXR 格式 examples/jsm/loaders/EXRLoader.js83-96

  • 未压缩: 原始像素数据
  • RLE: 游程编码
  • ZIP/ZIPS: Zlib 压缩(单/多扫描线)
  • PIZ: 小波压缩
  • DWA/DWAB: 有损 DCT 压缩

加载器使用 DataTextureLoader 作为基类,并支持输出为 HalfFloatTypeFloatType examples/jsm/loaders/EXRLoader.js97-124

const loader = new EXRLoader();
loader.type = THREE.HalfFloatType; // 或 FloatType
loader.outputFormat = THREE.RGBAFormat; // 或 RGFormat、RedFormat

导出系统

GLTFExporter 将 Three.js 场景转换回 glTF 格式,支持 JSON(.gltf)和二进制(.glb)输出。

GLTFExporter 架构

SVG
100%

导出选项

导出器支持多种选项 examples/jsm/exporters/GLTFExporter.js644-661

选项类型默认值描述
binarybooleanfalse导出为二进制 .glb 格式
trsbooleanfalse将变换导出为平移/旋转/缩放而非矩阵
onlyVisiblebooleantrue仅导出可见对象
maxTextureSizenumberInfinity下采样的最大纹理尺寸
animationsArray[]要导出的动画剪辑
includeCustomExtensionsbooleanfalse包含来自 userData.gltfExtensions 的自定义扩展

测试中的使用示例: examples/misc_exporter_gltf.html34-69

材质属性转换

导出器将 Three.js 材质转换为支持扩展的 glTF PBR 材质 examples/jsm/exporters/GLTFExporter.js120-203

  • 标准材质: 转换为 glTF PBR 金属粗糙度
  • 物理材质: 支持清漆、透射、体积、折射率等扩展
  • 基础材质: 使用 KHR_materials_unlit 扩展
  • 纹理合并: 独立的金属度/粗糙度贴图合并为单个纹理

压缩集成

Three.js 集成了多种压缩技术以减少文件大小和 GPU 内存占用。

压缩技术概览

SVG
100%

DRACO 网格压缩

DRACO 使用量化和熵编码压缩网格几何体。GLTFDracoMeshCompressionExtension examples/jsm/loaders/GLTFLoader.js1614-1734 处理解压缩:

  1. 检测 glTF 图元中的 KHR_draco_mesh_compression 扩展
  2. 加载压缩缓冲区数据
  3. 调用 DRACOLoader 解码为 Three.js BufferGeometry
  4. 恢复属性语义(位置、法线、纹理坐标等)

Meshopt 压缩

Meshopt 压缩优化网格数据以提高 GPU 缓存效率,并可选择性地压缩。加载器处理 KHR_meshopt_compressionEXT_meshopt_compression examples/jsm/loaders/GLTFLoader.js1890-1957

KTX2 纹理压缩

KTX2/Basis Universal 提供通用纹理压缩,在加载时转码为 GPU 原生格式。GLTFTextureBasisUExtension examples/jsm/loaders/GLTFLoader.js1443-1500 将其与 glTF 集成:

  • ETC1S 模式: 高压缩比,较低质量
  • UASTC 模式: 更高质量,较低压缩
  • 运行时转码: 根据 GPU 支持转换为 BC1-7、ETC2、ASTC 等

fflate 归档解压

fflate 库处理 ZIP、GZIP 和 ZLIB 解压,用于归档格式:

加载管理器与进度跟踪

LoadingManager 协调多个文件加载并跟踪整体进度。

加载管理器流程

SVG
100%

使用示例:

const manager = new THREE.LoadingManager();

manager.onStart = function ( url, itemsLoaded, itemsTotal ) {
    console.log( '开始加载: ' + url );
};

manager.onProgress = function ( url, itemsLoaded, itemsTotal ) {
    console.log( '加载中: ' + (100 * itemsLoaded / itemsTotal) + '%' );
};

manager.onLoad = function () {
    console.log( '加载完成!' );
};

const loader = new GLTFLoader( manager );

缓存系统

Cache 单例 src/loaders/Cache.js 存储已加载的资源以避免冗余网络请求:

  • 默认启用: Cache.enabled = true
  • 存储: 将 URL 字符串映射到已加载的数据
  • 跨加载器共享: 所有 FileLoader 实例使用同一缓存
  • 手动管理: Cache.add(key, file)Cache.get(key)Cache.remove(key)Cache.clear()

点云与体数据加载器

专用加载器处理点云和体积医学成像数据。

点云格式

PCDLoader examples/jsm/loaders/PCDLoader.js13-34 支持点云数据格式:

  • ASCII 和二进制编码(压缩和未压缩)
  • 字段:位置(x, y, z)、RGB 颜色、法线、强度、标签
  • 返回带 PointsMaterialPoints 对象

PLYLoader examples/jsm/loaders/PLYLoader.js12-27 支持 Stanford PLY 格式:

  • ASCII 和二进制编码
  • 通过 setPropertyNameMapping()setCustomPropertyNameMapping() 进行自定义属性映射
  • 顶点颜色、法线、自定义属性
  • 返回 BufferGeometry

体数据

NRRDLoader examples/jsm/loaders/NRRDLoader.js10-19 加载医学成像体数据:

Volumeexamples/jsm/misc/Volume.js8-13 提供:

  • 带 IJK 索引的 3D 数据存储
  • RAS(右-前-上)坐标系
  • 可视化的窗宽/窗位
  • 任意方向的切片提取

CAD 与 3D 打印格式

多个加载器面向 CAD 和 3D 打印工作流。

STL 加载器

STLLoader examples/jsm/loaders/STLLoader.js12-53 处理立体光刻格式:

  • 二进制 STL: 可包含颜色数据(Magics 格式)
  • ASCII STL: 支持多实体作为几何体组
  • 返回非索引 BufferGeometry
  • 颜色处理:geometry.hasColorsgeometry.alpha

3MF 加载器

ThreeMFLoader examples/jsm/loaders/3MFLoader.js26-52 支持 3D 制造格式:

  • 基于 ZIP 的归档格式
  • 核心规范:网格、组件、基础材质
  • 扩展:纹理 2D、颜色组、金属显示(PBR)
  • 返回带网格的 Group

加载器解析归档结构 examples/jsm/loaders/3MFLoader.js127-267

  1. 提取 ZIP 内容(使用 fflate)
  2. 解析 _rels/.rels 获取关系
  3. 解析 3D 模型 XML 文件
  4. 解析纹理资源
  5. 构建 Three.js 场景图

AMF 加载器

AMFLoader examples/jsm/loaders/AMFLoader.js13-28 支持增材制造格式:

  • 基于 XML 的格式
  • 材质、颜色、ZIP 压缩
  • 返回带彩色网格的 Group

VTK 科学可视化

VTKLoader examples/jsm/loaders/VTKLoader.js12-30 加载可视化工具包格式:

  • 仅 POLYDATA 数据集(不支持结构化点/网格)
  • ASCII 和二进制编码
  • 多边形、三角带、点数据、单元数据
  • 法线、颜色、标量
  • 返回 `BufferGeometry