Three.js клон FBX с анимацией - PullRequest
0 голосов
/ 11 июня 2018

Кажется, я не могу клонировать модель FBX (FBX, загруженную с Mixamo ), сохраняя ключевые кадры анимации.

Попытка использовать несколько подходов, включая использование cloneFbx gist (включен в приведенный ниже пример);все безрезультатно.Даже размещение всей функции FBXLoader () внутри цикла не работает должным образом, поскольку анимация может выполняться только одной из моделей за один раз.

Эта проблема была частично решена здесь , но яне может «скопировать» последовательность анимации, как подсказывает ответ.

Кто-нибудь может указать, где я ошибаюсь?

Вот грубый пример одного из моих тестов:

Загрузка модели FXB и сохранение анимации:

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

Добавление микшеров и действий на основе сохраненного клипа, добавление модели в сцену:

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

Цикл анимации:

if ( mixers.length > 0 ) {
        for ( var i = 0; i < mixers.length; i ++ ) {
      mixers[ 0 ].update( clock.getDelta() );
        }
    }

1 Ответ

0 голосов
/ 12 июня 2018

Не могу найти элегантное решение для этого.Лучшее, что я мог придумать, это создать цикл с последовательностью загрузки внутри него;это очень медленно (так как FBX нужно анализировать каждый раз).

Ключом здесь был микшер анимации, управляющий анимированными объектами как группой, в отличие от создания микшера для анимированного объекта.

Если кто-нибудь может найти лучшее решение, я бы очень хотел его услышать (возможно, правильно используя скрипт cloneFbx ).

Создать микшер, загрузить 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);
    });
  }

Создание экземпляров классов, добавление к сцене:

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() );
...