Загрузчик Threejs fbx добавляет объекты в сцену, но их нет в дочернем массиве

#three.js #camera #loader #fbx

#javascript #three.js #камера #загрузчик #fbx

Вопрос:

Следуя threejs.org Загрузчик FBX, например, я загрузил свою модель с помощью этой функции:

 this.obj = null;

var loader = new THREE.FBXLoader();
var objs = []

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

    console.log("pushing to objs...");
    objs.push(object);
    console.log(objs[0]);

    object.traverse( function ( child ) {
        if ( child.isMesh ) {
        //console.log(child)

        //console.log(child.material.length)

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

        // if(oldMat.length == undefined)
        // {
        //     console.log(newMat.copy(oldMat));

        //     child.material = newMat;

        //     child.material = new THREE.MeshBasicMaterial( {  
        //     color: oldMat.color,
        //     } );
        // }
        // else
        // {
        //     for(var i = 0; i < oldMat.length; i  )
        //     {
        //         child.material[i] = new THREE.MeshBasicMaterial( {  
        //         color: oldMat[i].color,
        //         } );
        //     }
            // }
        }
    } );

    object.position.z -= 200;
    object.position.y -= 250;
    var action = mixer.clipAction( object.animations[ 0 ] );
    action.play();
    scene.add( object );
} 

var true_load = load_init.bind(this);
console.log("printing objects...");
loader.load( 'Anims/Capoeira.fbx', true_load);

console.log(objs);//seems to have things there
console.log(objs[0]);//prints undefined
  

Это успешно добавляет объект, и я вижу воспроизведение анимации.
Проблема в том, что мне нужно получить доступ к объекту, загруженному в сцену, и поработать с его переменными (в основном с затенением материала и цветом).
Когда я это делаю console.log(scene.children) , я вижу, что он выводит все дочерние элементы. Всего их 4 (источник света, основание, вспомогательная сетка и загруженный объект). Однако, когда я печатаю длину, будет указано только 3 объекта, и если я попытаюсь получить доступ к загруженному объекту напрямую через дочерний массив или путем получения объекта по идентификатору или имени, я получу undefined . Я также пытался изменить функцию, чтобы возвращать загруженный объект, и даже установить переменную с именем loaded_object, но я также оставлю функцию необработанной.

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

1. Возможно, вы захотите рассмотреть возможность добавления object к другой переменной, объявленной вне load_init функции.

2. Я пытался сделать это с помощью массива. Объект, похоже, находится внутри него, но то же самое, что происходит со сценой, похоже, происходит и с этим массивом. Объект, кажется, есть, но я не могу получить к нему доступ. При печати массива я получаю объект в списке, но когда я пытаюсь получить к нему доступ в той позиции, в которой он должен быть, «там ничего нет».

3. Как именно вы пытаетесь получить к нему доступ? Можете ли вы добавить этот код к своему ответу?

4. Просто отредактировал его (снова).

Ответ №1:

Подумайте об использовании THREE.LoadingManager . Эти проблемы, скорее всего, связаны с асинхронной природой loader.load метода.

В THREE.LoadingManager.onLoad методе вы должны иметь возможность корректно обращаться ко всему.

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

1. Да. теперь все в порядке.