2

私は最近、ボリューム計算に関する質問を提出し、このスレッドで大きな支援を受けました。それ以来、Three JS で閉じたメッシュのボリュームを計算する関数を開発しました。変数 face4 は、Face3 メッシュの場合、面を 2 つの三角形に分割する true/false です。私のジオメトリは、ほとんどカスタム 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;

これは、式に基づいています。

pv =  Px*Qy*Rz + Py*Qz*Rx + Pz*Qx*Ry - Px*Qz*Ry - Py*Qx*Rz - Pz*Qy*Rx;

メッシュを作成する前に、THREE.Geometry で次を実行します。

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

var modifier = new THREE.SubdivisionModifier( x );

modifier.modify( geom );

体積の計算は、 x > 0 の細分割のすべてのケースで正しく行われます。x = 0 の場合、またはサブディビジョンがない場合は、桁違いに正しくありません。

何か案は?また、他のユーザーが使用できるように関数をクリーンアップする方法についてアドバイスをいただければ幸いです。これは、オープンソースへの貢献に対する私の最初の試みです。ありがとうございました。

4

1 に答える 1

0

「x」はユーザー定義変数ですか?0の場合、ジオメトリをサブディビジョンモディファイヤに渡しません。

于 2013-02-17T19:04:46.157 に答える