Могу ли я добавить лица из массива в 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;