You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:45:14