Animation 带动画的Three.js克隆FBX

Animation 带动画的Three.js克隆FBX,animation,three.js,fbx,Animation,Three.js,Fbx,我似乎无法在保留动画关键帧的同时克隆FBX模型(从下载的FBX) 尝试了多种方法,包括使用gist(包括在下面的示例中);都没有用。即使将整个FBXLoader()函数放置在循环中,也不会像预期的那样工作,因为一次只有一个模型会设置动画 这个问题已经得到了部分解决,但我似乎不能像答案所说的那样“复制”动画序列 有人能指出我哪里出了问题吗 下面是我的一个测试的粗略示例: 加载fbx模型并存储动画: var loader = new THREE.FBXLoader(); loader.load(

我似乎无法在保留动画关键帧的同时克隆FBX模型(从下载的FBX)

尝试了多种方法,包括使用gist(包括在下面的示例中);都没有用。即使将整个FBXLoader()函数放置在循环中,也不会像预期的那样工作,因为一次只有一个模型会设置动画

这个问题已经得到了部分解决,但我似乎不能像答案所说的那样“复制”动画序列

有人能指出我哪里出了问题吗

下面是我的一个测试的粗略示例:

加载fbx模型并存储动画:

var loader = new THREE.FBXLoader();
  loader.load( 'models/Walking.fbx', function ( fbx ) {
    clip = fbx.animations[ 0 ];

    // createVehicle(fbx); // Works! Creates one animated model via FBX

    // cloneFbx via: https://gist.github.com/kevincharm/bf12a2c673b43a3988f0f171a05794c1
    for (var i = 0; i < 2; i++) {
      const model = cloneFbx(fbx);
      createVehicle(model);
    }
  });
动画周期:

if ( mixers.length > 0 ) {
        for ( var i = 0; i < mixers.length; i ++ ) {
      mixers[ 0 ].update( clock.getDelta() );
        }
    }
if(mixers.length>0){
对于(变量i=0;i
无法找到一个优雅的解决方案。我能想到的最好办法是创建一个循环,其中包含加载序列;这非常慢(因为每次都必须解析FBX)

这里的关键是有一个动画混合器控制作为一个组的动画对象,而不是为每个动画对象创建一个混合器

如果有人能想出一个更好的解决方案,我会非常渴望听到它(也许正确地使用脚本)

创建混音器,加载FBX:

  // Create mixer to run animations
  mixer = new THREE.AnimationMixer( scene );

  // Load fbx
  var loader = new THREE.FBXLoader();
  for (var i = 0; i < 5; i++) {
    loader.load( 'models/Walking.fbx', function ( fbx ) {
      mixer.clipAction( fbx.animations[ 0 ], fbx )
          .startAt( - Math.random() )
          .play();

      createVehicle(fbx);
    });
  }
绘制周期:

mixer.update( clock.getDelta() );

执行似乎在
var action=model.mixer.clipAction(clip)处停止。我不知道这是为什么,因为动画剪辑似乎包含了适当的信息:
{name:“mixamo.com”,曲目:Array(53),持续时间:2.46666984558105,uuid:“5380AF34-4DB3-4BA1-AB0C-7BF2CE95EB7B”}
function createVehicle(model){

  const x = Math.random() * groundSize - groundSize/2;
  const z = Math.random() * groundSize - groundSize/2;
  model.position.set(x, 0, z);

  const vehicle = new Vehicle(model, x, z);
  vehicles.push(vehicle);

  scene.add( model );
}
mixer.update( clock.getDelta() );