
gltf-transform - 3D Model Optimization Tool
npx gltf-transform 详细使用说明
gltf-transform 是一个专为处理 glTF 2.0 格式3D模型的 JavaScript/TypeScript SDK,支持在 Web 和 Node.js 环境中使用。它提供了命令行界面(CLI),可以快速对 GLB/GLTF 文件进行压缩、优化和检查。

1. 安装
使用 npx 可以无需全局安装直接运行:
npx gltf-transform <命令> [参数...] [选项...]
如果需要频繁使用,可以全局安装:
npm install --global @gltf-transform/cli
安装后直接使用:
gltf-transform <命令> [参数...] [选项...]
国内用户注意:如果安装过程中遇到 Sharp 相关错误,可以配置国内镜像源:
npm config set sharp_binary_host "https://npmmirror.com/mirrors/sharp"
npm config set sharp_libvips_binary_host "https://npmmirror.com/mirrors/sharp-libvips"
npm install --global @gltf-transform/cli
2. 查看帮助
# 查看所有命令
npx gltf-transform --help
# 查看特定命令的帮助
npx gltf-transform optimize --help
npx gltf-transform draco --help
3. 核心功能分类
gltf-transform 提供了丰富的命令,按功能可分为以下几大类:
🔍 检查与验证
| 命令 | 用途 |
|---|---|
| inspect | 查看模型内容,识别性能瓶颈(几何密集还是纹理密集、绘制调用次数等) |
| validate | 验证模型是否符合 glTF 规范 |
使用示例:
npx gltf-transform inspect input.glb
📦 整体优化
| 命令 | 用途 |
|---|---|
| optimize | 一键综合优化,组合多种优化方法 |
| prune | 移除未引用的节点、材质、纹理等冗余数据 |
| dedup | 去重访问器和纹理 |
| merge | 合并多个模型为一个 |
使用示例:
# 一键综合优化(最常用)
npx gltf-transform optimize input.glb output.glb --compress draco --texture-compress webp
🧊 几何压缩
| 命令 | 用途 | 特点 |
|---|---|---|
| draco | Google Draco 算法压缩几何数据 | 压缩率极高,需解码器 |
| meshopt | Meshoptimizer 算法压缩几何、变形目标和动画 | 解压速度快,无需额外解码器 |
| quantize | 量化几何数据,降低精度(如32位→16位) | 有损但高效,兼容性好 |
| simplify | 简化网格,减少顶点/面数 | 有损操作,直接改变模型细节 |
| weld | 索引几何体,合并相似顶点 | 无损 |
使用示例:
# Draco 压缩
npx gltf-transform draco input.glb output.glb
# Meshopt 压缩(推荐,无需解码器)
npx gltf-transform meshopt input.glb output.glb --level medium
# 量化几何(先量化再 Draco 可获得更小体积)
npx gltf-transform quantize input.glb output.glb --qp 14 --qn 10
# 简化几何(减面50%)
npx gltf-transform simplify input.glb output.glb --ratio 0.5
重要提示:如果同时使用 quantize 和 draco,应先执行 quantize 再执行 draco,这样 Draco 可以基于量化后的低精度数据进行更高效的压缩。
🎨 纹理压缩
纹理通常是 GLB 文件中占用空间最大的部分。
| 命令 | 用途 |
|---|---|
| webp | 转换为 WebP 格式(兼容性好) |
| avif | 转换为 AVIF 格式(压缩率更高) |
| resize | 调整纹理尺寸(如 2048→1024) |
| uastc | KTX2 + UASTC 压缩(GPU 原生格式,提升性能) |
| etc1s | KTX2 + ETC1S 压缩(体积更小) |
使用示例:
# 压缩纹理为 WebP
npx gltf-transform webp input.glb output.glb
# 调整纹理尺寸
npx gltf-transform resize input.glb output.glb --width 1024 --height 1024
# KTX2 压缩(UASTC 格式,GPU 友好)
npx gltf-transform uastc input.glb output.glb --level 4
⏯️ 动画优化
| 命令 | 用途 |
|---|---|
| resample | 重采样动画,无损去重关键帧 |
4. 典型工作流程
方案一:一键优化(快速上手)
npx gltf-transform optimize input.glb output.glb \
--compress meshopt \
--texture-compress webp
方案二:分步精细控制(推荐)
每次优化生成一个新文件,便于调试和回滚:
# 第1步:压缩纹理
npx gltf-transform webp input.glb step1.glb
# 第2步:清理冗余数据
npx gltf-transform prune step1.glb step2.glb
# 第3步:几何压缩(Meshopt 不需要解码器)
npx gltf-transform meshopt step2.glb step3.glb
# 第4步(可选):合并网格减少绘制调用
npx gltf-transform merge step3.glb final.glb
# 查看最终效果
ls -lh input.glb final.glb
方案三:针对几何密集模型的极致压缩
如果模型没有纹理或主要瓶颈在几何体,可以使用量化和 Draco 组合压缩:
# 先量化
npx gltf-transform quantize input.glb step1.glb --qp 14 --qn 10
# 再 Draco 压缩
npx gltf-transform draco step1.glb final.glb
注意:使用 Draco 压缩的文件需要在加载端配置 DRACOLoader 解码器,而 meshopt 压缩在 Babylon.js 5.0+ 和 Three.js r136+ 中已原生支持。
5. 针对节点控制的特殊处理
如果你的模型包含需要通过代码控制的节点(如车轮 wheel_FL、wheel_FR 等),需要注意:
optimize 命令可能会改变节点结构或合并节点,导致代码中通过 getNodeByName() 获取不到对应节点。
推荐分步执行:只运行 webp(纹理压缩)和 draco/meshopt(几何压缩),不执行 optimize,这样可以最大程度保留原始节点结构。
# 只压缩纹理和几何,不改变节点结构
npx gltf-transform webp input.glb step1.glb
npx gltf-transform meshopt step1.glb final.glb
6. 常见问题
6.1 simplify 命令没有效果
如果 simplify 命令执行后顶点数没有变化,通常是因为模型使用了硬法线(hard normals),导致顶点无法共享。可以在简化前移除法线属性:
# 在 gltf.report 的 Script 标签中执行
for (const mesh of document.getRoot().listMeshes()) {
for (const prim of mesh.listPrimitives()) {
prim.getAttribute('NORMAL')?.dispose();
}
}
await document.transform(weld(), simplify({ ratio: 0.5 }));
6.2 使用 Draco 压缩后加载报错
报错 No DRACOLoader instance provided 表示加载端没有配置 Draco 解码器。解决方法:
- 改用 meshopt 压缩(不需要解码器)
- 或在加载端配置 Draco 解码器
6.3 纹理压缩失败
如果 webp 命令报错,可能与 Sharp 库有关。可以尝试使用 resize 调整纹理尺寸作为替代,或检查 Node.js 版本是否兼容。
7. 命令速查表
| 需求 | 命令 |
|---|---|
| 查看模型信息 | npx gltf-transform inspect input.glb |
| 一键综合优化 | npx gltf-transform optimize input.glb output.glb --compress meshopt --texture-compress webp |
| Draco 几何压缩 | npx gltf-transform draco input.glb output.glb |
| Meshopt 几何压缩 | npx gltf-transform meshopt input.glb output.glb |
| 量化几何 | npx gltf-transform quantize input.glb output.glb --qp 14 --qn 10 |
| WebP 纹理压缩 | npx gltf-transform webp input.glb output.glb |
| 调整纹理尺寸 | npx gltf-transform resize input.glb output.glb --width 1024 --height 1024 |
| 清理冗余数据 | npx gltf-transform prune input.glb output.glb |
| 合并网格 | npx gltf-transform merge input.glb output.glb |
| 简化几何 | npx gltf-transform simplify input.glb output.glb --ratio 0.5 |