首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有动画的Three.js克隆FBX

带有动画的Three.js克隆FBX
EN

Stack Overflow用户
提问于 2018-06-11 15:11:42
回答 1查看 1.7K关注 0票数 2

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

我尝试了许多方法,包括使用cloneFbx gist (包含在下面的示例中);所有这些都无济于事。即使将整个FBXLoader()函数放在一个循环中也不会像预期的那样工作,因为一次只有一个模型会有动画效果。

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

有谁能指出我哪里错了吗?

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

加载fbx模型并存储动画:

代码语言:javascript
复制
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);
    }
  });

根据存储的剪辑添加混音器和动作,将模型添加到场景中:

代码语言:javascript
复制
function createVehicle(model){
  model.mixer = new THREE.AnimationMixer( model );
  mixers.push( model.mixer );

  var action = model.mixer.clipAction( clip );
  action.play();

  model.traverse( function ( child ) {
    if ( child.isMesh ) {
      child.castShadow = true;
      child.receiveShadow = true;
    }
  });

  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 );
}

动画周期:

代码语言:javascript
复制
if ( mixers.length > 0 ) {
        for ( var i = 0; i < mixers.length; i ++ ) {
      mixers[ 0 ].update( clock.getDelta() );
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2018-06-12 14:01:20

找不到一个优雅的解决方案来解决这个问题。我能想到的最好的方法是创建一个包含加载序列的循环;这非常慢(因为每次都必须解析FBX )。

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

如果有人能想出更好的解决方案,我会非常想听的(也许可以正确地使用cloneFbx脚本)。

创建混合器,加载FBX:

代码语言:javascript
复制
  // 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);
    });
  }

创建类实例,添加到场景中:

代码语言:javascript
复制
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 );
}

绘制周期:

代码语言:javascript
复制
mixer.update( clock.getDelta() );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50792178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档