2017-02-09 18 views
1

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

Чтобы вычислить размер буфера я подсчет числа вершин в этой геометрии добавляется к числу лиц, умноженным на 3. Так как этот код говорит https://github.com/mrdoob/three.js/blob/master/src/core/DirectGeometry.js#L148, и как этот ответ предполагает Does converting a Geometry to a BufferGeometry in Three.js increase the number of vertices?

Но делать например, число вершин в геометрии буфера составляет 57600, что в моем вычислении составляет 67400. Я делаю что-то неправильно, но я не понимаю, что именно.

Это код, который я использую:

let tot_objects = 100; 
let material = new THREE.MeshStandardMaterial({color: 0x00ff00}); 
let geometry = new THREE.BoxGeometry(5, 5, 5, 4, 4, 4); 
let objs = populateGroup(geometry, material, tot_objects); 

//let's merge all the objects in one geometry 
let mergedGeometry = new THREE.Geometry(); 
for (let i = 0; i < objs.length; i++){ 
    let mesh = objs[i]; 
    mesh.updateMatrix(); 
    mergedGeometry.merge(mesh.geometry, mesh.matrix); 
} 

let bufGeometry = new THREE.BufferGeometry().fromGeometry(mergedGeometry); 

let totVerticesMergedGeometry = (mergedGeometry.vertices.length) + (mergedGeometry.faces.length * 3); 
console.log(bufGeometry.attributes.position.count); // 57600 
console.log(totVerticesMergedGeometry); // it returns 67400 !!! 
scene.add(new THREE.Mesh(bufGeometry, material)); 

function populateGroup(selected_geometry, selected_material, tot_objects) { 
    let objects = []; 
    for (var i = 0; i< tot_objects; i++) { 
     let coord = {x:i, y:i, z:i}; 
     let object = new THREE.Mesh(selected_geometry, selected_material); 
     object.position.set(coord.x, coord.y, coord.z); 
     object.rotateY((90 + 40 + i * 100/tot_objects) * -Math.PI/180.0); 
     objects.push(object); 
    } 
    return objects; 
} 
+0

Никто не знает, что я делаю неправильно? – edap

ответ

2

В Неиндексированные BufferGeometry длина атрибута массива position всегда numberOfFaces * 3 * 3 (3 вершины на лице, 3 значения в вершине). Это то, на что указывает код из DirectGeometry, на который вы указывали: он выполняет итерацию по граням и толкает три вершины на лицо в массив вершин.

Коробчатая геометрия с 4 сегментами во всех направлениях имеет 192 граней: 4 * 4 = 16 сегментов на стороне с 2 треугольников на сегмент составляет 16 * 2 = 32 лиц в каждой стороне. И 32 * 6 = 192. У вас есть 100 этих геометрий коробки, поэтому есть 19200 лиц. Временами 3 мы получаем 57600 вершин.

+0

Большое вам спасибо за разъяснение, это исправило мою проблему. – edap