Объединять анимации вместо смешивания?

Я импортирую анимацию на меше со скелетом из glTF, созданного в Blender, в THREE.js. У меня есть две одновременные анимации, которые влияют на трансляцию кости. В Blender эти переводы суммируются, но в THREE.js они усредняются по весу.

Например, анимациями являются translate (2, 0, 0) и translate (4, 0, 0). Как мне заставить AnimationMixer выдать (6, 0, 0) вместо (3, 0, 0)?


person Kit Callen    schedule 26.03.2018    source источник
comment
Не могли бы вы рассказать подробнее о том, что вы пытаетесь делать с суммированными анимациями? Я не уверен, что three.js это точно поддерживает, но, возможно, есть несколько вариантов.   -  person Don McCurdy    schedule 26.03.2018
comment
Я пытаюсь создать персонажа с настраиваемым размером. Если его грудь шире, мне нужно, чтобы его руки были подальше друг от друга; если его ноги длиннее, мне понадобятся его руки повыше и т. д. Проблема в том, что если они оба активны, то они только наполовину дальше друг от друга и наполовину ниже. Я могу создавать переводы в three.js вместо анимации, но я надеялся, что смогу использовать то, что я уже сделал в Blender.   -  person Kit Callen    schedule 26.03.2018


Ответы (1)


Для моих конкретных нужд мне действительно были нужны только значения из первого и последнего кадров (все они 3-кадровые анимации, а второй - значения по умолчанию). Поэтому я беру значения из дорожек ключевых кадров и вообще не буду использовать систему анимации. // конвертирует анимацию в значения fuction convertAnim (clips) {

    var anims = [];

      for ( i = 0; i < clips.length; i ++ ){

      anims[i] = {name: "name", bone: []};
      anims[i].name = clips[i].name;

        for ( j = 0; j < clips[i].tracks.length; j++ ){

            var val = clips[i].tracks[j].values

            if ( clips[i].tracks[j].name.indexOf( 'position' ) > -1 ) {
                anims[i].bone[j] = { name: "name", minTranslate: "min", maxTranslate: "max"};
                anims[i].bone[j].name = clips[i].tracks[j].name;

                anims[i].bone[j].minTranslate = new THREE.Vector3( val[0], val[1], val[3] );
                anims[i].bone[j].maxTranslate = new THREE.Vector3( val[val.length - 3], val[val.length - 2], val[val.length - 1] );
            }

            else if ( clips[i].tracks[j].name.indexOf( 'scale' ) > -1 ) {
                anims[i].bone[j] = { name: "name", minSize: "min", maxSize: "max"};
                anims[i].bone[j].name = clips[i].tracks[j].name;

                anims[i].bone[j].minSize = new THREE.Vector3( val[0], val[1], val[2] );
                anims[i].bone[j].maxSize = new THREE.Vector3( val[val.length - 3], val[val.length - 2], val[val.length - 1] );
            }

            else if ( clips[i].tracks[j].name.indexOf( 'scale' ) > -1 ) {
                anims[i].bone[j] = { name: "name", minRotation: "min", maxRotation: "max"};
                anims[i].bone[j].name = clips[i].tracks[j].name;

                anims[i].bone[j].minRotation = new THREE.Quaternion( val[0], val[1], val[2], val[3] );
                anims[i].bone[j].maxRotation = new THREE.Quaternion( val[val.length -4], val[val.length - 3], val[val.length - 2], val[val.length - 1] );
            }           
        }
      }

    return anims;

  }
person Kit Callen    schedule 28.03.2018