Преобразование BufferGeometry в Geometry с помощью FBXLoader в Three.js

Вот мой код для загрузки объекта .fbx, который по умолчанию загружает объект как BufferGeometry:

var loader = new THREE.FBXLoader();

async function loadFiles(scene,props) {

  const {files, path, childName, fn} = props;

  if (index > files.length - 1) return;
  loader.load(path+files[index], object => {
    // apply functions / transformations to obj
    let sceneObj = fn.call(null,object,props);
    if (sceneObj) { scene.add(sceneObj) }

    // add obj to scene and push to array
    scene.add(object);
    objects.push(object);

    // if there is another object to load, load it
    index++;
    loadFiles(scene,props);
  });
}

Я хотел использовать var geometry = new THREE.Geometry().fromBufferGeometry( bufferGeometry );, чтобы исправить это, но, похоже, я не создаю mesh в своей функции загрузчика, поэтому я не вижу, как я мог бы реализовать этот код.

Я хочу получить доступ к вершинам объекта в удобочитаемом виде, поэтому я не хочу, чтобы он загружался как BufferGeometry.


person qbuffer    schedule 06.01.2019    source источник


Ответы (1)


Загрузчик возвращает объект, который будет содержать сетки с геометрией. Вы захотите пройтись по объекту и его дочерним элементам и преобразовать BufferGeometry по мере того, как сталкиваетесь с ним. Вот идея, как этого добиться:

loader.load(path+files[index], object => {

    // iterate over all objects and children
    object.traverse(child => {

        // convert the buffer geometry
        if (child.isMesh && child.geometry.isBufferGeometry) {

            const bg = child.geometry;
            child.geometry = (new THREE.Geometry()).fromBufferGeometry(bg);

        }

    });

    // ... do something with the loaded model...

});

Надеюсь, это поможет!

person Garrett Johnson    schedule 06.01.2019
comment
Кажется, это работает, однако после просмотра обновленных вершин все еще кажется, что мой объект имеет 1848 вершин, хотя должно быть только 310. Обновляет ли этот метод также массив вершин? Спасибо. - person qbuffer; 07.01.2019
comment
Трудно сказать, не видя геометрию, с которой вы работаете. Как считать вершины? В документации по fromBufferGeometry упоминается, что вы можете столкнуться с повторяющимися вершинами и можете вызвать mergeVertices для их удаления: threejs.org/docs/#api/en/core/Geometry.fromBufferGeometry - person Garrett Johnson; 07.01.2019