Могу ли я добавить лица из массива в THREE.BufferGeometry

Я создам Mesh, который основан на BufferGeometry. На данный момент у меня есть работник, который отвечает за мою геометрию.

Работник: Прежде всего я создаю Three.Geometry. Затем я строю свой bufferGeometry и отправляю данные обратно в основной поток.

1.) Я конвертирую свою геометрию в THREE.BufferGeometry

var bufferGeometry = new THREE.BufferGeometry().fromGeometry ( geometry );

2.) Далее я получаю атрибуты Buffer

var attributePosition = bufferGeometry.getAttribute(name);//name = position, color, normal)

3.) Далее я создаю bufferArray

bufferArrayPosition.push(attributePosition);

4.) В конце я отправляю эти массивы обратно в основной поток

postMessage([bufferArrayColor, bufferArrayNormal, bufferArrayPosition]);

Основной поток : в основном потоке я перестраиваю свой bufferGeometry и преобразовываю его в THREE.Geometry

 //receive messages from web worker
    worker.onmessage = function (e) {
        alert(e.data);

        var bufferGeometry = new THREE.BufferGeometry();
        var geometry = new THREE.Geometry();

        for (var i = 0; i < e.data[0].length; i ++){
            bufferGeometry.addAttribute('color', e.data[0][i].array, 3); 
            bufferGeometry.addAttribute('normal', e.data[1][i].array, 3);
            bufferGeometry.addAttribute('position', e.data[2][i].array, 3);

            var t = new THREE.Geometry().fromBufferGeometry(bufferGeometry);
            material.side = THREE.DoubleSide;
            mesh.push(new THREE.Mesh(t, material));
            Scene.scene.add(mesh[i]);
        }

    };

В конце триангуляционные лица теряются!!! У меня есть только стандартные индексы лица (0,1,2) (3,4,5), ... На самом деле я делаю триангуляцию в рабочем потоке. Эти грани все еще существуют в THREE.Geometry до преобразования в bufferGeometry (шаг 1).

Как я могу добавить эти грани в bufferGeometry?

1 ответ

Решение

Существует два типа геометрии буфера:

  • индексируются:

    В индексированных геометриях буфера позиции сохраняются в position атрибут буфера и индексы хранятся в index атрибут буфера. Позиции могут быть повторно использованы в индексированной геометрии буфера.

  • не индексируется (также известный как суп из треугольников)

    В неиндексированном массиве отсутствует индексный атрибут, все позиции хранятся в атрибуте буфера позиции и каждые три последующие точки в position атрибут образует один треугольник.

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

Вы можете получить его из буфера геометрии, используя getIndex метод как это:

indexAttribute = bufferGeometry.getIndex();

ОБНОВИТЬ

Здесь скрипка, которая демонстрирует геометрию против геометрии буфера для простого квадрата.

// What you need to send to main thread from your worker:
positions = bufferGeometry.attributes['position'].array;
indices = bufferGeometry.index.array;
Другие вопросы по тегам