在3D网格中“维护拓扑”有什么意义?

时间:2017-09-01 00:32:14

标签: 3d geometry mesh modeling topology

我正在尝试用C ++创建一个非常简单的3D建模应用程序。在此过程中,我决定实现一个用于半边数据结构实体边界表示的类。

我正在阅读的一本书(计算几何学导论)详细介绍了Euler's Polyhedron Formula写成的V-E + F = 2以及它对于所有拓扑有效的凸多面体是如何实现的(忽略了一会儿的东西)像面孔和属。)

为了保持这个公式的真实性,本书描述了如何使用Euler Operators生成实体。例如,我可能会开始使用 mvfs 生成一个新的实体,这意味着“使顶点面实体”,这将创建一个具有顶点和面的新实体,使得V-E + F = 1-0 + 1 = 2。如果添加到V或F的每个其他操作也添加到E,或者如果它从V或F获取也从E等获取,因此该公式始终为真。正如维基百科页面所说:“欧拉算子修改网格图形,根据简单的规则创建或删除面,边和顶点,同时保留整体拓扑,从而保持有效边界(即不引入孔)。”

我的问题是双重的。

  1. 首先,我怎么可能说欧拉公式对于我的特定半边数据结构是正确的意味着我有一个有效的边界,当我可以有像悬挂面没有任何边或相邻顶点的东西时(记得mvfs创建一个顶点和一个面)。具有单个顶点和单个面的网格对我来说不像有效边界那样。

  2. 即使是具有单个顶点和单个边界的固体也是合理有效的边界,那么通过这样的努力来维持欧拉公式的真实性是什么意思呢?如果我希望它可以创建一个带有孔的半边数据结构网格怎么办? HEDS表示的要点似乎是它易于操作(这对我的小型建模者来说是完美的)但我似乎被阻止允许用户删除一个面,例如基于保持有效拓扑是如此重要这些有点尴尬的欧拉算子存在。运营商 这需要始终一次创建或删除两个矢量/边/面,而不是一次一个地创建或删除它们。

1 个答案:

答案 0 :(得分:0)

作为程序员,如果你需要,你可以确保你有明确的界限。你的工作也是选择“明确定义的边界”对你的目的意味着什么,以及你有责任以这种方式维护它们,只要你想保留它们。

对于问题1:您的维基百科引用并未说欧拉公式暗示有效边界。相反,它表明Euler 操作(不是公式,只是保留它的一组特定操作)将保留拓扑和边界。

对于问题2:如果你想要一个操作在你的对象上打个洞,那就提供一个!但是,打破事情比解决问题更容易。一些网格用法依赖于拓扑和有效边界等属性,因此您通常希望避免意外破坏它们!

因为这些属性可能很有用,并且保留它们可能很棘手,所以值得注意那些本身保留属性的操作。对于旨在在对象中打孔的网格算法,无法执行此操作的一组构建块操作可能很方便。