【问题标题】:Separating Mesh分离网
【发布时间】:2014-07-04 09:58:07
【问题描述】:

我在分离网格时遇到了问题。有一个组合网格,它有 1 个顶点缓冲区和 1 个三角形索引缓冲区。但网格至少有 2 个单独的对象。例如,有 2 个四边形没有共享顶点(当然也没有共享索引),它们的几何图形位于 1 个单个网格中(1 个顶点缓冲区,1 个索引缓冲区)。那么如何从它们创建 2 个网格。有什么算法吗?

我尝试在新网格中添加第一个顶点,然后查找指向该顶点的索引,然后将此索引及其相关的三角形的 2 个索引(和顶点)添加到新网格,但必须更改索引。

很抱歉错过了有关我的问题的信息。我认为逻辑上的分离。例如在编程中。如果下面的单个网格具有如图中所示的未共享子网格。我希望它分成 2 个网格类。我想要一个算法,一个数学解决方案,而不是一个为我做这件事的工具。

【问题讨论】:

  • 如果是这种情况,您使用的是什么 3D 应用程序。
  • 我正在使用 Unity,但这对我来说并不重要
  • 例如,在 Maya 中这将是一项简单的任务,从未使用过统一。我不确定你是否可以编辑网格或者它是否是程序生成的(?)
  • 你打算用网格做什么?如果你想绘制它们,我建议不要触及顶点缓冲区,只创建两个单独的索引缓冲区。如果您无论如何都需要 GPU 上的顶点数据,则没有理由将其放在两个单独的缓冲区中。可以使用联合查找数据结构进行拆分。
  • 一定要做,不能只画图。

标签: algorithm 3d geometry


【解决方案1】:

首先,用顶点数初始化一个并集查找数据结构。然后找到所有连通分量如下:

for each triangle index i1, i2, i3 in indices
    union-find.union(i1, i2)
    union-find.union(i1, i3)

然后初始化一个空映射(或字典),它将旧顶点索引映射到新顶点:

Dictionary<int, int> indexMap;

此外,我们需要新的顶点列表:

Dictionary<int, List<Vertex>> vertices;
Dictionary<int, List<int>> indices;

然后将顶点分配到正确的列表中,如下所示:

for i from 0 to vertex count -1
    componentRepresentative := union-find.find(i)
    if(!vertices.ContainsKey(componentRepresentative))
        vertices.Add(new List<Vertex>());
        indices.Add(new List<int>());
    var list = vertices[componentRepresentative];
    list.Add(vertexBuffer[i]);
    indexMap.Add(i, list.Count - 1)

此时我们已经分离了顶点缓冲区。我们仍然需要类似地分离索引缓冲区。

for i from 0 to index count - 1
    componentRepresentative := union-find.find(indexbuffer[i])
    var list = indices[componentRepresentative]
    list.Add(indexMap[indexBuffer[i]])

总体时间复杂度接近 O(n)(对于理想的联合查找结构)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多