3 回答
TA贡献1810条经验 获得超5个赞
实际上是一个非常简单的计算。
诀窍是计算四面体的有符号体积 -根据您的三角形并以原点为起点。体积的符号来自于三角形是否指向原点方向。(三角形的法线本身取决于顶点的顺序,这就是为什么您看不到下面明确引用的三角形的原因。)
这全部归结为以下简单功能:
public float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector 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 (1.0f/6.0f)*(-v321 + v231 + v312 - v132 - v213 + v123);
}
然后是一个驱动程序来计算网格的体积:
public float VolumeOfMesh(Mesh mesh) {
var vols = from t in mesh.Triangles
select SignedVolumeOfTriangle(t.P1, t.P2, t.P3);
return Math.Abs(vols.Sum());
}
TA贡献1848条经验 获得超6个赞
上面的方法适用于像球形四面体等“简单”对象(没有相交/重叠的三角形)。对于更复杂的形状,一个好主意是分割网格(将其关闭)并分别计算每个分段的体积。希望这可以帮助。
添加回答
举报