Как рассчитать объем стены STL в Three.js - PullRequest
0 голосов
/ 16 ноября 2018

У меня большая проблема, я разрабатываю программное обеспечение для расчета стоимости показа в 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

Можете ли вы придумать идею или путь вперед?

...