如何计算三维网格物体的体积,三维网格物体的表面由三angular形组成

我想计算具有三angular形表面的三维网格物体的体积。

读这篇文章 ,其实是一个非常简单的计算。

诀窍是计算一个四面体的有符号体积 – 基于你的三angular形,并在原点顶部。 音量的标志来自您的三angular形是否指向原点的方向。 (三angular形的法线本身取决于顶点的顺序,这就是为什么你没有看到它在下面明确引用。

这一切归结到以下简单的function:

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()); } 

叶夫弗兰克·克鲁格斯(Jack Frank Kruegers)回答得很好。 如果你有vectorfunction,你也可以使用它:

  public static float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector p3) { return p1.Dot(p2.Cross(p3)) / 6.0f; } 

编辑..添加impl。 对于Dot()和Cross()如果你不确定。 大多数math库将会有这些。 如果您使用的是WPF,则它们将作为Vector3D类的静态方法实现。

  public class Vector { ... public float Dot(Vector a) { return this.X * aX + this.Y * aY + this.Z * aZ; } public Vector Cross(Vector a) { return new Vector( this.Y * aZ - this.Z * aY, this.Z * aX - this.X * aZ, this.X * aY - this.Y * aX ); } ... } 

GNU Triangulated Surface Library 可以为你做到这一点 。 请记住,表面必须closures。 对于不less3D模型来说,情况并非如此。

如果你想自己实现,你可以先看看他们的代码。

上面的方法对于“简单”对象(不相交/重叠三angular形)(如球体四面体等)是正确的。 对于更复杂的形状,一个好主意可能是分割网格(closures它)并分别计算每个分段的音量。 希望这可以帮助。

如果我正确地理解了你,你说你已经有一个三angular形的表面网格,并且你想从中生成一个三维实体网格。

三angular形意味着你将不得不使用三维内部的四面体元素。 您将需要search可以将曲面网格作为种子的八叉树自动网格划分algorithm 。

这是有限元自动网格划分文献中的一个常见问题。 我会看看那里。

Interesting Posts