根据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对象的体积,但是,在我目前可用的模型中:
this research paper (very brief)
我不确定该算法将如何处理不完美的3D模型。
我是否需要生成仅由真实,完整,大量3D对象组成的模型才能使用此方法,或者它是否适用于常见的3D模型,如上所示?
答案 0 :(得分:3)
您找到的方法通过迭代所有三角形来工作,对于每个三角形,它连接其角点(0,0,0)
点形成四面体。然后它计算其体积并总结所有结果。这里使用的signed
字意味着一些四面体将具有负面体积,基于面向三角形。由于这个技巧,重叠的四面体将相互抵消。
如果你有correct
网格它只是有效,但你的imperfect
网格基本上是一个perfect
网格,但缺少几个三角形,所以你会错过你的一些四面体最后的总和。统计上有些是正数,有些是负数,所以这也会在一定程度上抵消。
你缺少的三角形越多和/或它们越大,你得到的计算体积值就越多,但算法不会破坏或爆炸,只是松散的精度。
此方法还存在另一个问题:
当你有两个完全闭合的立方体网格相互重叠时,这个算法将计算它们的体积之和,而不是它们创建的形状的体积。我们对你的模型了解不多,但我认为它比非闭合网格更大。
要解决此问题,您需要执行CSG Union
操作,但它仅适用于关闭的网格:/。