Анимация Threejs FBX не будет работать после изменения материала объекта

#animation #model #three.js #fbx

#Анимация #Модель #three.js #fbx

Вопрос:

Я прочитал пример загрузчика FBX и заставил анимацию работать. Но, по-видимому, модель FBX импортирует модель с помощью PhongMaterials по умолчанию. Проблема в том, что мне нужно, чтобы это был базовый материал (такой же, как «неосвещенный» в unity). Когда я пытаюсь создать новый материал THREE.MeshBasicMaterial и использую функцию copy () для передачи данных из исходного материала в нужный, я получаю несколько ошибок, подобных этому скриншоту.

https://imgur.com/a/H5mp1Sh

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

Вот мой код:

 function load_init( object ) {
    mixer = new THREE.AnimationMixer( object );

    object.traverse( function ( child ) {
        if ( child.isMesh ) {

            const oldMat = child.material;
            var newMat = new THREE.MeshBasicMaterial();

            if(oldMat.length == undefined)//only one material in the mesh
            {
                console.log(newMat.copy(oldMat));//it copies succesfuly

                //child.material = newMat; // gives errors

                child.material = new THREE.MeshBasicMaterial( {  
                color: oldMat.color,
                } );//materials are changed, but the animation wont play
                    //anymore
            }
            else//multiple materials
            {
                for(var i = 0; i < oldMat.length; i  )
                {
                    console.log(newMat.copy(oldMat[i]));//it copies succesfuly

                    //child.material[i] = newMat; // gives errors

                    child.material[i] = new THREE.MeshBasicMaterial( {  
                    color: oldMat[i].color,
                    } );//materials are changed, but the animation wont play
                        //anymore
                }
            }
        }
    } );

    var action = mixer.clipAction( object.animations[ 0 ] );
    action.play();
    scene.add( object );
} 
  

Комментарии:

1. Попробуйте настроить skinning: true для новых материалов.

2. Ага. Это было все. Но почему копирование не будет работать? Автоматическое сохранение таких вещей, как ID и name, было бы довольно удобно.

3. Какие ошибки приводит к использованию скопированного нового материала?

4. Это в ссылке imgur в исходном сообщении