【发布时间】: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 模型?
【问题讨论】: