Three.js / 3D модели - расчет нескольких объемов объекта
Я работаю над одним проектом в Three.js и должен решить одну проблему как можно быстрее. Мне нужно рассчитать несколько объемов трехмерного объекта.
Первое, что мне нужно, это точно так же, как здесь:Как рассчитать объем трехмерного сетчатого объекта, поверхность которого состоит из треугольников
И я рассчитываю это таким же образом. Это весь объем объекта.
Этого достаточно, если объект не нуждается в дополнительном материале, когда он идет в 3D-печать. Например, если это будет стакан (открытый цилиндр), мне нужно рассчитать объем дополнительного материала, который будет использоваться при печати этой модели. Этот материал будет «внутри» стекла и предотвратит падение пола стекла внутри модели.
Я не знаю, как рассчитать это, слишком мало математических знаний, я думаю. Есть ли способ рассчитать это? Или, может быть, есть способ рассчитать «объем с закрытыми ячейками», даже если он открытый (например, стекло)?
РЕДАКТИРОВАТЬ: у меня нет модели стекла, но у меня есть модель коробки. Коробка будет напечатана открытой стороной внизу. Мне нужно знать внутренний объем.
Извините за мой английский, надеюсь, это понятно.
Вот как я вычисляю объем объекта (точно так же, как в ссылке в первом посте):
function volumeOfT(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.0;
}
function calculateVolume(object){
var volumes = 0.0;
for(var i = 0; i < object.geometry.faces.length; i++){
var Pi = object.geometry.faces[i].a;
var Qi = object.geometry.faces[i].b;
var Ri = object.geometry.faces[i].c;
var P = new THREE.Vector3(object.geometry.vertices[Pi].x, object.geometry.vertices[Pi].y, object.geometry.vertices[Pi].z);
var Q = new THREE.Vector3(object.geometry.vertices[Qi].x, object.geometry.vertices[Qi].y, object.geometry.vertices[Qi].z);
var R = new THREE.Vector3(object.geometry.vertices[Ri].x, object.geometry.vertices[Ri].y, object.geometry.vertices[Ri].z);
volumes += volumeOfT(P, Q, R);
}
loadedObjectVolume = Math.abs(volumes);
}
Я проверил в другом программном обеспечении и объем объекта является правильным.
Вот как я пытался создать ConvexGeometry:
var geometry = new THREE.STLLoader().parse( contents );
geometry.sourceType = "stl";
geometry.sourceFile = file.name;
geometry.computeFaceNormals();
geometry.computeVertexNormals();
var convexGeometry = THREE.ConvexGeometry(geometry.vertices);
var material = new THREE.MeshLambertMaterial({
color: 0xff0000,
emissive: 0x000000,
shading: THREE.FlatShading
});
var mesh = new THREE.Mesh( geometry, material );
Онлайнvar convexGeometry = THREE.ConvexGeometry(geometry.vertices);
браузер зависает. Только модели с низкими вершинами могут пройти через это (например, куб).