如何用NodeJS/Python将GLTF模型与Mixamo动画合并为单个文件?
无需Blender的服务器端GLTF+动画合并方案
下面提供几个纯脚本实现的方案,完全在服务器端运行,满足你合并GLTF模型与外部FBX动画、生成单个GLB/GLTF的需求:
一、Node.js 方案:使用 gltf-transform 工具
gltf-transform 是专门针对GLTF/GLB文件的编辑工具,支持动画导入与合并,非常适合自动化处理:
- 先把FBX动画转成GLTF格式(工具兼容GLTF动画更顺畅),用
fbx2gltf二进制工具(服务器端可直接安装):fbx2gltf input-animation.fbx animation.gltf - 安装依赖:
npm install @gltf-transform/core @gltf-transform/extensions @gltf-transform/cli - 编写合并脚本(比如命名为
merge-animations.js):import { NodeIO } from '@gltf-transform/core'; import { ALL_EXTENSIONS } from '@gltf-transform/extensions'; async function mergeAnimations() { const io = new NodeIO().registerExtensions(ALL_EXTENSIONS); // 加载模型和动画文件 const modelDoc = await io.read('model.gltf'); const animDoc = await io.read('animation.gltf'); // 复制动画到模型文件 const anims = animDoc.getRoot().listAnimations(); anims.forEach(anim => modelDoc.getRoot().createAnimation().copy(anim)); // 导出合并后的GLB(也可导出为GLTF,改后缀即可) await io.write('merged-model.glb', modelDoc); } mergeAnimations().catch(err => console.error(err)); - 运行脚本:
node merge-animations.js
注意:如果FBX动画的骨骼结构、名称和GLTF模型不完全匹配,需要在脚本里加骨骼名称映射逻辑,确保动画能正确绑定到模型骨骼。
二、Node.js 方案:使用 Three.js 核心库
既然你前端已经用Three.js,直接用它的Node.js版本来合并,逻辑和前端加载流程一致:
- 安装依赖:
npm install three - 编写合并脚本(
merge-with-three.js):const { GLTFLoader, FBXLoader, GLTFExporter } = require('three'); const { promisify } = require('util'); const fs = require('fs'); // 转成Promise风格的加载器 const loadGLTF = promisify(new GLTFLoader().load.bind(new GLTFLoader())); const loadFBX = promisify(new FBXLoader().load.bind(new FBXLoader())); const exportGLTF = promisify(new GLTFExporter().parse.bind(new GLTFExporter())); async function merge() { // 加载模型和FBX动画 const gltf = await loadGLTF('model.gltf'); const fbxAnim = await loadFBX('input-animation.fbx'); // 将FBX动画添加到模型的动画数组 gltf.animations.push(...fbxAnim.animations); // 导出为GLB(设置binary: true) const mergedGLB = await exportGLTF(gltf.scene, { binary: true, animations: gltf.animations }); // 写入文件 fs.writeFileSync('merged-model.glb', mergedGLB); } merge().catch(err => console.error(err)); - 运行脚本即可生成合并后的文件。
三、Python 方案:使用 pygltflib + fbx2gltf
如果偏好Python生态,同样可以先转FBX为GLTF动画,再用pygltflib合并:
- 安装依赖:
pip install pygltflib - 用
fbx2gltf把FBX动画转成GLTF(和第一个方案第一步一致)。 - 编写合并脚本(
merge_animations.py):from pygltflib import GLTF2 # 加载模型和动画文件 model = GLTF2().load('model.gltf') anim_gltf = GLTF2().load('animation.gltf') # 合并动画数据 model.animations.extend(anim_gltf.animations) # 若动画节点ID和模型不匹配,需手动映射骨骼索引(一般结构匹配的话无需操作) # 保存为GLB model.save('merged-model.glb') - 运行脚本完成合并。
关键注意事项
- 核心前提:FBX动画的骨骼层级、骨骼名称必须和GLTF模型完全对应,否则动画无法正常播放。如果有名称差异,要在脚本里添加映射逻辑,遍历动画通道替换骨骼名称。
- 复杂动画(比如变形目标动画)需要确保工具支持对应GLTF扩展,
gltf-transform和Three.js都支持常见的扩展类型。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

