这个网格体积计算算法可以处理不完美的网格吗?

时间:2018-01-05 11:07:41

标签: algorithm 3d

根据https://jsfiddle.net/beaver71/zm8wt4pj/,我读了this answer。引用答案:

  

这一切归结为以下简单功能:

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

这似乎比基于体素的方法更好地确定高级3D对象的体积,但是,在我目前可用的模型中:

  • 许多表面不是完整的3D体积形状,而是中空的2D网格包裹成三维外观形状,其中两端实际上不会相遇形成真正3D物体的完整表面。
  • 有些表面是完全平坦的2D形状。
  • 内心只是一片混乱。

this research paper (very brief)

enter image description here

我不确定该算法将如何处理不完美的3D模型。

我是否需要生成仅由真实,完整,大量3D对象组成的模型才能使用此方法,或者它是否适用于常见的3D模型,如上所示?

1 个答案:

答案 0 :(得分:3)

您找到的方法通过迭代所有三角形来工作,对于每个三角形,它连接其角点(0,0,0)点形成四面体。然后它计算其体积并总结所有结果。这里使用的signed字意味着一些四面体将具有负面体积,基于面向三角形。由于这个技巧,重叠的四面体将相互抵消。

如果你有correct网格它只是有效,但你的imperfect网格基本上是一个perfect网格,但缺少几个三角形,所以你会错过你的一些四面体最后的总和。统计上有些是正数,有些是负数,所以这也会在一定程度上抵消。

你缺少的三角形越多和/或它们越大,你得到的计算体积值就越多,但算法不会破坏或爆炸,只是松散的精度。

此方法还存在另一个问题:

当你有两个完全闭合的立方体网格相互重叠时,这个算法将计算它们的体积之和,而不是它们创建的形状的体积。我们对你的模型了解不多,但我认为它比非闭合网格更大。 要解决此问题,您需要执行CSG Union操作,但它仅适用于关闭的网格:/。