2015-06-16 2 views
0

Проблема:Вычисление объема сетки в ThreeJS больше, чем ограничивающий объем коробки

Ограничительная Объем коробки меньше объема, рассчитанного из сетки.

Что я пробовал:

Сначала я вычислить объем ограничивающего прямоугольника со следующим кодом:

//loaded .obj mesh object: 
var sizer = new THREE.Box3().setFromObject(obj); 
console.log(sizer.size().x*sizer.size().z*sizer.size().y); 

журнал вывода: 197112,65382983384

Затем рассчитать объем сетки с использованием this solution с this solution с унаследованным геометрическим объектом в методе «расчетный объем», который приведен ниже:

console.log(scope.calculateVolume(child)); 

calculateVolume является частью класса. Мои методы класса являются следующие:

threeDeeAsset.prototype.signedVolumeOfTriangle = function(p1, p2, p3) { 
    var v321 = p3.x*p2.y*p1.z; 
    var v231 = p2.x*p3.y*p1.z; 
    var v312 = p3.x*p1.y*p2.z; 
    var v132 = p1.x*p3.y*p2.z; 
    var v213 = p2.x*p1.y*p3.z; 
    var v123 = p1.x*p2.y*p3.z; 
    return (-v321 + v231 + v312 - v132 - v213 + v123)/6; 
} 

threeDeeAsset.prototype.calculateVolume = function(object){ 
    var volumes = 0; 

    object.legacy_geometry = new THREE.Geometry().fromBufferGeometry(object.geometry); 

    for(var i = 0; i < object.legacy_geometry.faces.length; i++){ 
     var Pi = object.legacy_geometry.faces[i].a; 
     var Qi = object.legacy_geometry.faces[i].b; 
     var Ri = object.legacy_geometry.faces[i].c; 

     var P = new THREE.Vector3(object.legacy_geometry.vertices[Pi].x, object.legacy_geometry.vertices[Pi].y, object.legacy_geometry.vertices[Pi].z); 
     var Q = new THREE.Vector3(object.legacy_geometry.vertices[Qi].x, object.legacy_geometry.vertices[Qi].y, object.legacy_geometry.vertices[Qi].z); 
     var R = new THREE.Vector3(object.legacy_geometry.vertices[Ri].x, object.legacy_geometry.vertices[Ri].y, object.legacy_geometry.vertices[Ri].z); 
     volumes += this.signedVolumeOfTriangle(P, Q, R); 
    } 

    return Math.abs(volumes); 
} 

выхода журнала: 336896.1562770668

Проверка источника вершин:

Я также попытался buffergeometry и, конечно, это действительно тот же массив, но типизированная Float32Array и предсказуемо дал тот же результат:

var vol = 0; 
scope.mesh.traverse(function (child) { 
    if (child instanceof THREE.Mesh) { 
     var positions = child.geometry.getAttribute("position").array; 
     for(var i=0;i<positions.length; i+=9){ 

      var t1 = {}; 
      t1.x = positions[i+0]; 
      t1.y = positions[i+1]; 
      t1.z = positions[i+2]; 

      var t2 = {}; 
      t2.x = positions[i+3]; 
      t2.y = positions[i+4]; 
      t2.z = positions[i+5]; 

      var t3 = {}; 
      t3.x = positions[i+6]; 
      t3.y = positions[i+7]; 
      t3.z = positions[i+8]; 
      //console.log(t3); 

      vol += scope.signedVolumeOfTriangle(t1,t2,t3); 
     } 
    } 
}); 
console.log(vol); 

выход журнала: +336896,1562770668

Вопрос: Почему объем ограничительной коробки меньше расчетного объема замкнутой сетки?

Возможно, я пропустил что-то вроде положения смещения или, возможно, неправильно вычислил объем рамки. Я выполнил несколько поисков в google и stack, вот как я пришел, чтобы найти подписанную функцию VolumeOfTriangle выше. это, по-видимому, самый распространенный подход.

ответ

1

Может быть проблемой с намоткой, вы можете попытаться отрицать результат из подписанного тома или переупорядочить аргументы.

Обмотка заказ будет по часовой стрелке или против часовой стрелки и определяет облицовку (нормальный) многоугольника,

volumes += this.signedVolumeOfTriangle(P, Q, R); 

Перестановка P и R инвертирует нормальный,

volumes += this.signedVolumeOfTriangle(R, Q, P); 

Это может быть осложнена методы хранения, такие как triangle strips, где вершины разделяются смежными треугольниками, что приводит к чередованию порядка намотки.

Другая проблема может возникнуть - особенно если она правильно работает для простых сеток - это вырожденные вершины. Если вы получаете свои сетки из редактора, и сетка была изменена и изменена в миллион раз (как правило, это так), она почти гарантированно дегенерирует.

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

+0

Только в замкнутой сетке нулевых вогнутых функций? – Radio

+0

Извините за мое невежество в этом: порядок намотки. Как я могу найти плохой порядок намотки, чтобы изменить порядок аргументов в этом случае? – Radio

+0

Возможно, это также объяснит, почему некоторые из моих более простых сеток выглядят просто отлично ... – Radio

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