Проблема:Вычисление объема сетки в 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 выше. это, по-видимому, самый распространенный подход.
Только в замкнутой сетке нулевых вогнутых функций? – Radio
Извините за мое невежество в этом: порядок намотки. Как я могу найти плохой порядок намотки, чтобы изменить порядок аргументов в этом случае? – Radio
Возможно, это также объяснит, почему некоторые из моих более простых сеток выглядят просто отлично ... – Radio