У меня большая проблема, я разрабатываю программное обеспечение для расчета стоимости показа в 3d. Для этого мне нужно получить объем куска STL для расчета веса. С граммами я мог легко рассчитать цену.
Проблема в том, что я хочу получить объем стен и объем заполнения, у стенок примерно 1 мм, а заполнение - остальной объем. Стены сплошные, и у заполнения есть процент заполнения (например, 30%). Есть фигуры, у которых больше стен, которые заполняют и наоборот.
Объем обоих рассчитывается в Three.js. Теперь это то, что я пытаюсь. Я вычислил общий объем куска и объем куска, масштабированный по нижней шкале без стен (масштабирование по x, y и z, чтобы иметь минус 1 мм) и вычел оба.
//x, y and z are the size of mesh
//scale is the percentaje of scaling(uniform on all axes)
function calculateVolume(mesh,scale,x,y,z){
//Scale the mesh
x= x*scale;
y= y*scale;
z= z*scale;
var volume = 0;
var volume_wall = 0;
var volume_infill = 0;
var volume_reduced = 0;
//Calculate the proportion to be reduced with walls of 1mm of each side
var proportion_x = (x-10)/x;
var proportion_y = (y-10)/y;
var proportion_z = (z-10)/z;
//I travel array of mesh triangles
mesh.traverse(function (child){
if (child instance of THREE.Mesh){
//I get array of vector positions
var positions = child.geometry.getAttribute("position").array;
for(var i=0;i<positions.length; i+=9){
//I calculate volume total of triangle
volume += volumeOfVectors(positions,i,scale,scale,scale);
//I calculate volume of triangle minus the walls
volume_reduced += volumeOfVectors(positions,i,scale*proportion_x,
scale*proportion_y,scale*proportion_z);
}
}
});
//I convert volume in mm^3 to cm^3
volume = volume / 1000;
volume_reduced = volume_reduced / 1000;
//I calculate the wall volume
volume_wall = volume - volume_reduced;
//I set the fill volume as 30%
volume_infill = volume_reduced *0.30;
// 1.24 is the density
console.log("Volume 100% infill:"+volume*1.24);
console.log("Volume whitout wall:"+volume_reduced*1.24);
console.log("Volume wall:"+volume_wall*1.24);
console.log("Volume infill:"+volume_infill*1.24);
return [volume_wall,volume_infill];
}
//Calculating volume with the vectors of the triangle
function volumeOfVectors(positions,i,scale_x,scale_y,scale_z){
//Point 1
var t1 = {};
t1.x = positions[i+0]*scale_x;
t1.y = positions[i+1]*scale_y;
t1.z = positions[i+2]*scale_z;
//Point 2
var t2 = {};
t2.x = positions[i+3]*scale_x;
t2.y = positions[i+4]*scale_y;
t2.z = positions[i+5]*scale_z;
//Point 3
var t3 = {};
t3.x = positions[i+6]*scale_x;
t3.y = positions[i+7]*scale_y;
t3.z = positions[i+8]*scale_z;
//Volumen calcule
return signedVolumeOfTriangle(t1,t2,t3);
}
function signedVolumeOfTriangle(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;
}
Но этот путь не точен. Потому что объект масштабируется во всех направлениях, получая объем в качестве первого изображения. 3d красный объект был масштабирован для удаления стен, а прозрачный - это оригинальный 3d объект. Как вы видите, 3d-объект не адаптируется к границам.
проблема с изображением 1
проблема с изображением 2
Объем должен быть следующим. Таким образом держите 1 мм стены во всех направлениях.
изображение хорошее 1
изображение хорошее 2
Можете ли вы придумать идею или путь вперед?