【问题标题】:Can this mesh volume calculation algorithm handle imperfect meshes?这种网格体积计算算法可以处理不完美的网格吗?
【发布时间】:2018-01-05 11:07:41
【问题描述】:

根据this answer,我读到了this research paper (very brief)。引用答案:

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

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 体积形状,而是包裹成 3D 外观形状的空心 2D 网格,其中末端实际上不会相交以形成真正 3D 对象的完整表面。
  • 某些表面是完全平坦的 2D 形状。
  • 内部很乱。

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

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

【问题讨论】:

    标签: algorithm 3d


    【解决方案1】:

    您发现的方法通过遍历所有三角形来工作,对于每个三角形,它将其角与(0,0,0) 点连接起来,形成一个四面体。然后它计算它的体积并总结所有结果。此处使用的signed 一词表示某些四面体将具有负体积,基于三角形面。由于这个技巧,重叠的四面体将相互抵消。

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

    您缺少的三角形越多和/或它们获得的三角形越大,那么您在计算体积值时得到的误差就越大,但算法不会破坏或爆炸,只是精度会降低。

    这种方法还有另一个问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      相关资源
      最近更新 更多