【问题标题】:How to simplify a marching squares mesh?如何简化行进方块网格?
【发布时间】:2013-07-27 14:44:48
【问题描述】:

我在 iso 平面上运行 marching squares(相对于行进立方体)算法,然后将数据转换为三角形网格。

这可行,但会创建非常复杂的网格数据。我想将其简化为所需的最小三角形,如下图所示:

我尝试过围绕轮廓循环(点 -> 段 -> 点 -> ...),但如果一个点的连接段超过 2 个,则轮廓可能会倒转。

理想情况下,解决方案应该相当快,以便可以在运行时完成。我使用的语言是 C#,但可能可以从大多数其他类似 C 的语言中移植过来。

【问题讨论】:

  • 所以你已经运行了你链接的 wiki 页面上描述的等值线算法,它为你提供了一个网格,你想把它转换成最小的三角形表示吗?
  • 您尝试翻译的数据是如何表示的?
  • 为什么必须是“最小”三角形?你不能只把内部的正方形切出来吗?
  • @JSQuareD,正确我有一个 IsoCells 的二维数组,这会导致许多冗余多边形(如提供的图像中所示)。所以目标是尽可能减少多边形的数量来优化网格。
  • @NicolBolas 它不一定是完美的最小值,但理想情况下非常简化。我将生成的三角剖分用于刚体碰撞网格,用复杂的网格实例化非常慢。

标签: c# opengl mesh triangulation marching-cubes


【解决方案1】:

这是 3D 计算机图形中非常常见的问题。解决这个问题的算法称为网格简化算法。 然而,这个问题在 2D 情况下解决起来要简单得多,因为不需要考虑表面法线。

首先重要的是要有一个可靠的网格数据结构,它提供了修改网格的操作。可以生成和修改任何网格的一组操作例如是“欧拉算子”集。

要简化 2D 网格,请提供 2D 网格的密集版本。 您可以简单地将四边形网格转换为三角形网格 在对角线上分割每个四边形。

密集三角形网格

然后迭代折叠不在边界处的最短边。 “Edge collapse”是一个典型的网格操作,如下图所示:

经过一些步骤后,您的网格将如下所示:

【讨论】:

  • 据我所知,答案很好。我想知道为什么没有人得到任何选票
【解决方案2】:

简化由行进方块生成的网格(如上面答案中所建议的那样)效率非常低。要从标量场(例如位图)中获取多边形,您应该首先运行仅生成多边形轮廓的行进正方形的修改版本(即在 16 个行进正方形的情况下您不生成几何图形,您只需添加点到多边形),然后运行三角测量算法(例如 Delaunay 或 Ear Clipping)。

【讨论】:

  • OP 还可以查看 Triangle.Net 的统一性(在 github 中可用)进行三角测量。非常适合轮廓上的 2D 点。
【解决方案3】:

立即执行,从您的体积表示转到网格表示。

之后,您可以将具有案例 3、6、9、12 的区域分组为更大/更长的版本。

您也可以尝试将正方形分组为更大的正方形,但这是一个 NP 问题,因此理想的优化可能需要很长时间。

然后就可以转换成多边形版本了。

将其转换为多边形后,您可以融合边缘。

【讨论】:

    【解决方案4】:

    【讨论】:

    • 剪耳是一种三角测量算法。它并不意味着从标量场生成轮廓。
    • 剪耳可以用最少的三角形填充多边形。
    • 当然,但这本身并不能回答 OP 的问题。他需要一种有效的方法来生成轮廓和三角剖分,而不仅仅是三角剖分。
    猜你喜欢
    • 2020-11-30
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多