【问题标题】:Half-Edge Collapse半边折叠
【发布时间】:2014-11-11 17:48:51
【问题描述】:

我目前正在尝试实现半边折叠以执行增量网格划分。我正在处理一个流形网格。考虑以下简单的网格:

目标是将 a 折叠成 b。

但是,在这种情况下,这会导致非流形网格

我想阻止。我的问题是:

如何提前做,即在折叠前检查折叠操作是否安全?

我已经尝试了 Hoppe 的标准(链接条件),但看起来都满足了。此外,a 和 b 的单环的唯一交点是 c,因此只有一个点,因为它是边界边。

一般来说,我还需要执行哪些其他检查以避免非法倒塌?

目前,我有以下标准:

  • 如果 a 和 b 是边界顶点,则边 ab 必须是边界边
  • a、b 和与边 ab 相邻的三角形的第三个顶点必须是有效的三角形(链接条件)
  • 如果与边 ab 相邻的三角形是边界三角形,如果 a 在边界边上,则不要折叠
  • 如果 a-1-ring 和 b-1-ring 的交集不等于两个(或边界边不等于一个),则不要折叠

【问题讨论】:

  • 我投票结束这个问题,因为它似乎是关于一般数学/几何,而不是关于 help center 定义的编程。

标签: criteria mesh


【解决方案1】:

你可能想看看这篇论文:

Tamal Dey, Herbert Edelsbrunner, Sumanta Guha, and Dmitry Nekhayev. Topology preserving edge contraction.

我不确定您指的是哪篇 Hoppe 的论文(渐进式网格?),但 Tamal Dey 的链接条件与您所说的不同。直观地说,如果

,则边缘 ab 是可折叠的
one-ring(a) intersected with one-ring(b) == one-ring(ab).

对于一条边 ab,单环是共享 ab 的面的其他顶点的集合。同样在 Tamal Dey 的链接条件下,您需要考虑嵌入空间的维度。 (即,2d 和 3d 中的边的链接条件不同)。许多其他工作使用此链接条件来折叠边缘而不会产生拓扑错误。

从您的示例中令人困惑的是,我无法真正判断它是 3d 还是 2d 中的网格边界,或者它是多么“平面”。这些因素决定了生成的网格是否具有“折叠”,例如三角形 bcd 在 2d 中被认为是折叠的,但如果网格不是平面的,则在 3d 中可能很好。

【讨论】:

  • 感谢您的回答,我已经有一段时间没有发布这个问题了。这个例子是简单的 2d,除了c 之外的所有顶点都是边界顶点。只是快速通过条件:one-ring(a) = {b,c,d}, one-ring(b)={a,c,e}, one-ring(ab)={c},这意味着one-ring(a) intersected one-ring(b) = {c} = one-ring(ab),所以即使 bcd 折叠,条件也会满足,对吧?
  • 是的,在这种情况下,即使存在几何折叠,仍应满足链接条件。问题是,条件只是为了保持拓扑不变,而不是避免几何伪影。为了防止三角形折叠,我认为您需要轻推受影响的顶点,例如将顶点 c 重新计算为其一环的加权和,或者真正延迟折叠那些会导致大变形的边缘
  • (这也是边缘折叠或网格抽取框架的工作方式,使用几何误差为每个边缘收缩提供优先级)。我也在做类似的事情,但几何变形不是我关心的问题,因为我只是折叠长度为 0 的边缘。希望这个讨论会有所帮助。
  • 再次感谢您帮助我。那么有没有办法提前检查折叠操作是否会导致折叠呢?我见过几个库这样做,但大多数库在操作后执行检查并在折叠的情况下将其反转。一年前,我在 Matlab 中增量重新网格化的背景下完成了这项工作,为此我编写了一个 OpenMesh 包装器,以防它对github.com/christopherhelf/isotropicremeshing 的任何人有所帮助。
  • @danielyan86129,我的建议只是几何变形,对于非流形面,还有其他检查需要
猜你喜欢
  • 1970-01-01
  • 2012-10-14
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2011-02-09
  • 2021-03-22
  • 1970-01-01
相关资源
最近更新 更多