我最近提交了一个关于体积计算的问题,在this thread得到了一些很好的帮助,并且自从开发了一个函数来计算三个JS中闭合网格的体积。变量face4是一个true / false,它将Face3分成两个三角形,用于Face3网格。我的几何主要是自定义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> 1。 0。 当x = 0或没有细分时,它是不正确的,按数量级。
有什么想法吗?也很欣赏有关如何清理其他人使用的功能的建议,这是我第一次尝试开源贡献。谢谢。
答案 0 :(得分:0)
是“x”是用户定义的变量吗?如果为0,则不通过细分修改器传递几何体。