2016-04-06 4 views
0

Как объединить две геометрии буфера в одном THREE.BufferGeometry в ThreeJS?Как объединить две буферические геометрии в одной буферной геометрии в Three.JS?

var modelGeometry = null; 

geometry = new THREE.CylinderGeometry(10, 10, 10); 

if (modelGeometry == null) 
{ 
    modelGeometry = new THREE.BufferGeometry().fromGeometry(geometry); 
    console.log(modelGeometry); 
} 

bufGeometry = new THREE.SphereBufferGeometry(20 , 20, 20); 

var mesh = new THREE.Mesh(bufGeometry, material); 

modelGeometry.merge(mesh.geometry, mesh.matrix); 

ли ничего не делать с modelGeometry. Как слить эти геометрии?

+0

Я не думаю, что слияние геометрии буфера работает правильно. Попробуйте объединить регулярные геометрии: «THREE.CylinderGeometry» и «THREE.SphereGeometry». – WestLangley

+0

Похоже, что есть ошибка в функции merge of BufferGeometry. – Evgy

+0

'BufferGeometry.merge()' в настоящее время не поддерживает индексированную-BufferGeometry, что и используется в вашем примере. (three.js r.75) – WestLangley

ответ

0

Я буду танцевать всю ночь напролет. Сделал это!

sumPosArr = new Float32Array(poslen); 
sumNormArr = new Float32Array(normlen); 
sumUvArr = new Float32Array(uvlen); 

var postotalarr = new Array(); 

sumPosCursor = 0; 
sumNormCursor = 0; 
sumUvCursor = 0; 

for (a = 0; a < objects.length; a++) 
{ 
    var posAttArr = objects[a].geometry.getAttribute('position').array; 

    for (b = 0; b < posAttArr.length; b++) 
    { 
     sumPosArr[b + sumPosCursor] = posAttArr[b]; 
    } 

    sumPosCursor += posAttArr.length; 


    var numAttArr = objects[a].geometry.getAttribute('normal').array; 

    for (b = 0; b < numAttArr.length; b++) 
    { 
     sumNormArr[b + sumNormCursor] = numAttArr[b]; 
    } 

    sumNormCursor += numAttArr.length; 


    var uvAttArr = objects[a].geometry.getAttribute('uv').array; 

    for (b = 0; b < uvAttArr.length; b++) 
    { 
     sumUvArr[b + sumUvCursor] = uvAttArr[b]; 
    } 

    sumUvCursor += uvAttArr.length; 

} 

modelGeometry.addAttribute('position', new THREE.BufferAttribute(sumPosArr, 3)); 
modelGeometry.addAttribute('normal', new THREE.BufferAttribute(sumNormArr, 3)); 
modelGeometry.addAttribute('uv', new THREE.BufferAttribute(sumUvArr, 2)); 
+0

THREE.BufferGeometry can not merge проиндексированные геометрии. – Evgy

1

странно вызывающее слияние() на BufferGeometry дала мне некоторые ошибки, но есть обходной путь:

  1. Объединение два геометрических объектов;
  2. Convert to BufferGeometry;
  3. Добавить в Mesh

Вот что работает для меня:

var modelGeometry = new THREE.Geometry(); 

    cylGeometry = new THREE.CylinderGeometry(10, 10, 10); 

    // if (modelGeometry == null) 
    // { 
    //  modelGeometry = new THREE.BufferGeometry().fromGeometry(geometry); 
    //  console.log(modelGeometry); 
    // } 

    modelGeometry.merge(cylGeometry); 

    sphereGeometry = new THREE.SphereGeometry(20 , 20, 20); 

    modelGeometry.merge(sphereGeometry); 

    bufGeometry = new THREE.BufferGeometry().fromGeometry(modelGeometry); 

    var mesh = new THREE.Mesh(bufGeometry, material); 

    scene.add(mesh); 
+0

Это была моя первая попытка. Но с гораздо большим количеством геометрии, чтобы слить этот трюк, не работает - браузеры разбились при загрузке скрипта ... Мне нужно только слияние BufferGeometry. – Evgy

+0

@Evgy Зачем вам нужно объединить эти геометрии? Если это просто для того, чтобы иметь их в одной группе, вы могли бы добавить их в Object3D, иначе я не знаю. – leota

+0

Мне нужно загрузить в GL-буфер очень большую модель, созданную из небольших примитивов. С геометриями объекты браузеров разбиваются с небольшим количеством предметов. Загрузка модели в сцену, расщепляемую на многих сетках со многими отдельными BufferGeometries, показывает больше скорости и меньше использования памяти, но мне по-прежнему нужно оптимизировать код, один сетка, объединенная с Geometries, показывает хорошую скорость, но недостаточно ... Моя надежда только на сетку с помощью только одна буферическая геометрия в конце. – Evgy

Смежные вопросы