Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 0个细分的体积计算不正确_Javascript_Three.js_Volume_Mesh - Fatal编程技术网

Javascript 0个细分的体积计算不正确

Javascript 0个细分的体积计算不正确,javascript,three.js,volume,mesh,Javascript,Three.js,Volume,Mesh,我最近提交了一个关于体积计算的问题,从那时起得到了很大的帮助,我开发了一个函数,可以在三个JS中计算封闭网格的体积。对于Face3网格,变量face4是将面划分为两个三角形的真/假。我的几何图形主要是自定义Face4构造 function volumeCalc(object, face4){ if (face4 == false) { for (var i=0; i<object.geometry.faces.length; i++) {

我最近提交了一个关于体积计算的问题,从那时起得到了很大的帮助,我开发了一个函数,可以在三个JS中计算封闭网格的体积。对于Face3网格,变量face4是将面划分为两个三角形的真/假。我的几何图形主要是自定义Face4构造

    function volumeCalc(object, face4){

        if (face4 == false) {

        for (var i=0; i<object.geometry.faces.length; i++) {

    var pA = (object.geometry.faces[i].a);
    var qA = (object.geometry.faces[i].b);
    var rA = (object.geometry.faces[i].c);

    var Px = object.geometry.vertices[pA].x;
    var Py = object.geometry.vertices[pA].y;
    var Pz = object.geometry.vertices[pA].z;

    Pxlist.push(Px);
    Pylist.push(Py);
    Pzlist.push(Pz);

    var Qx = object.geometry.vertices[qA].x;
    var Qy = object.geometry.vertices[qA].y;
    var Qz = object.geometry.vertices[qA].z;

    Qxlist.push(Qx);
    Qylist.push(Qy);
    Qzlist.push(Qz);

    var Rx = object.geometry.vertices[rA].x;
    var Ry = object.geometry.vertices[rA].y;
    var Rz = object.geometry.vertices[rA].z;

    Rxlist.push(Rx);
    Rxlist.push(Ry);
    Rzlist.push(Rz);
}
    }   else  {
        for (var i=0; i<object.geometry.faces.length; i++) {

    var pA = (object.geometry.faces[i].b);
    var qA = (object.geometry.faces[i].c);
    var rA = (object.geometry.faces[i].d);

    var Px = object.geometry.vertices[pA].x;
    var Py = object.geometry.vertices[pA].y;
    var Pz = object.geometry.vertices[pA].z;

    Pxlist.push(Px);
    Pylist.push(Py);
    Pzlist.push(Pz);

    var Qx = object.geometry.vertices[qA].x;
    var Qy = object.geometry.vertices[qA].y;
    var Qz = object.geometry.vertices[qA].z;

    Qxlist.push(Qx);
    Qylist.push(Qy);
    Qzlist.push(Qz);

    var Rx = object.geometry.vertices[rA].x;
    var Ry = object.geometry.vertices[rA].y;
    var Rz = object.geometry.vertices[rA].z;

    Rxlist.push(Rx);
    Rxlist.push(Ry);
    Rzlist.push(Rz);
     }
}
    for (i=0;i < Pxlist.length; i++){

    pv = Pxlist[i]*Qylist[i]*Rzlist[i]; + Pylist[i]*Qzlist[i]*Rxlist[i]; + Pzlist[i]*Qxlist[i]*Rylist[i]; - Pxlist[i]*Qzlist[i]*Rylist[i]; - Pylist[i]*Qxlist[i]*Rzlist[i]; -Pzlist[i]*Qylist[i]*Rxlist[i];
    pvlist.push(pv);

}

// calculate the total of these, I'm using _.js to add all values in the list.

addUp = (_.reduce(pvlist, function(memo, num){ return memo + num; }, 0))/6;
在创建网格之前,我对三个.几何体执行以下操作:

geom.mergeVertices();
geom.computeCentroids();
geom.computeFaceNormals();
geom.computeVertexNormals();

var modifier = new THREE.SubdivisionModifier( x );

modifier.modify( geom );
体积计算在x>0的所有细分情况下都是正确的。 当x=0或没有细分时,按数量级计算是不正确的

有什么想法吗?另外,如果您能就如何清理该函数以供他人使用提供建议,我将不胜感激,这是我第一次尝试开源贡献。谢谢。

x是用户定义的变量吗?如果为0,则不通过细分修改器传递几何体

geom.mergeVertices();
geom.computeCentroids();
geom.computeFaceNormals();
geom.computeVertexNormals();

var modifier = new THREE.SubdivisionModifier( x );

modifier.modify( geom );