【问题标题】:Triangulation between polygons on different planes不同平面上的多边形之间的三角剖分
【发布时间】:2015-02-06 17:44:21
【问题描述】:

我想在两组多边形之间进行三角测量。一个集合总是在另一个集合中,实际上,外部多边形是作为与原始集合的偏移量创建的。如果它们在同一平面上,三角剖分会很容易,但我想通过将外部多边形移动到平行但不同的平面来增加深度。我使用的常用三角测量方法(glu tesselator)不起作用。有没有替代方案?

【问题讨论】:

  • 我不明白你想要达到什么目的。你能解释得更清楚吗?有插图吗?你的源数据是什么?你想以什么结束?你能添加例子吗?谢谢:)
  • 我有一系列从字体创建的轮廓(或多边形)。我还从第一组创建了另一系列轮廓,作为其在指定偏移处的轮廓。我想从这些创建 3d 模型并将轮廓用作斜边。但是,如果所有轮廓不在同一平面上,我通常使用的 glu tesselator 会失败。
  • 事实上,如果我可以通过强制 tesselator 不创建任何三个顶点都在同一个多边形上的三角形来对我的多边形进行三角剖分,我会有一个解决方案。
  • 如果您对网格而不是方法感兴趣,您可以使用 Blender 等工具。你看过openmesh.orgmeshlab.sourceforge.netgithub.com/vladimir-ch/umeshu吗?

标签: c++ opengl triangulation


【解决方案1】:

IMO 当您移动外部多边形时,您可以尝试 3d 中的 delaunay 三角剖分,例如使用外接球。 Cgal可以做3d三角剖分。

【讨论】:

  • 你知道更小更简单的吗?我宁愿避免为单一任务使用大型库。
  • @aronsatie:不,但您可以尝试一种算法,例如带有外球面的 bowyer-watson。实际上它是 cgal 算法。
  • 谢谢,我去看看。我希望有一个更简单的解决方案,因为我的轮廓不是随机的一系列点。我想在原始多边形和作为偏移量计算的修改版本之间进行三角测量。问题只是 3D,因为我将偏移量移动到另一个平行于原始平面的平面。
【解决方案2】:

如果我正确理解您的问题,听起来您正在尝试执行有时称为挤压的操作,例如

有许多字体库可以为 OpenGL 做你想做的事情。虽然page 上的信息有些过时,但我听说过有关GLTT 的好消息。

如果你想自己做,你可能只需要一个简单的三角形带连接两个轮廓(假设它们是连接的 [在数学图形意义上]),并且可能不需要镶嵌器(除了创建第一个轮廓)。

假设“内部”轮廓是从 tessellator 发出的轮廓,您记录它的周边顶点。然后正如您所说,通过在同一平面上将每个内部顶点平移一些偏移量(可能在顶点处使用法线[与切线正交]或其他)来创建“外部”轮廓(您想要偏移的轮廓) ,然后添加拉伸深度。如果您保持相同的一般拓扑结构(即,相同数量的顶点和每个顶点的相同连接信息),那么您可以将该组轮廓“缝合”成单个三角形条带。根据您要寻找的效果,您可能需要向外部轮廓添加额外的顶点,以使其更美观。这不是真正的问题,只是它使连接轮廓的三角形带更复杂一些。

【讨论】:

  • 我已经有了原始和偏移的顶点。偏移量比这复杂一点,所以点的数量不同。将它们缝合在一起也并非易事,尽管目前这就是我想要做的。我在急转弯时仍然遇到问题。
【解决方案3】:

您是说您有一种适用于 2D 的三角测量方法。美好的。将两个轮廓放在同一平面上z = 0,进行二维三角剖分,然后将外轮廓顶点的z 坐标设置为您需要的值。正如你所说,将外轮廓移动到平行平面。

为什么这种方法不适合您?

是的,您最终可能会得到一些水平三角形,它们的三个顶点都具有相同的z 坐标。如果您使用“真正的”3D 三角剖分,您也可能会得到相同的水平三角形。这完全取决于轮廓的形状和算法。

如果不能接受这样的水平三角形,您可以添加第二遍以尝试消除它们:

找到一个水平三角形。它的两个边缘将属于原始内部轮廓或原始外部轮廓。第三条边会“短路”原始轮廓的顶点。找到另一个与上述“第三”边具有相同边的三角形。这对三角形形成一个菱形。对菱形进行三角测量只有两种方法。你得到的那个是不可接受的,所以只需以不同的方式重新对菱形进行三角测量。

没有图纸很难解释。

【讨论】:

  • 我想我完全理解你。我想过纠正“错误”的三角形,但我没有想出你刚才的建议。我一定会考虑的,因为这看起来是一个非常好的解决方案!
  • 看起来比这复杂一点。我得到的不仅仅是一个“假”三角形,因此清理需要的不仅仅是从菱形创建替代三角形。我仍然认为这是要走的路,所以除非有人有更好的主意,否则我认为赏金应该是你的。
  • 嗯,是的,在初始三角剖分之后,您最终可能会得到许多彼此相邻的假/平/水平三角形。这只是意味着您的第二遍应该运行几次。每次运行“修复”过程时,它都会修复一个扁平三角形。如果找不到要修复的三角形,请停止循环。此外,您不仅需要寻找一个平面三角形,还需要寻找这样的平面三角形,它至少有一个顶点属于外轮廓,至少一个顶点属于内轮廓。如果一个平面三角形的所有顶点都属于同一轮廓,则无法修复它(但,在此阶段)。
  • 我按照你的建议做了,我所有的三角形都是正确的。唯一的问题是,由于 glu tesselator 不努力避免长边和窄角的三角形,我最终得到了一些硬边而不是光滑的表面。这些边通常是在相当多的三角形 (>3) 共享相同的顶点时创建的。你有办法摆脱这些吗?
  • 不知道有没有办法让表面看起来光滑。如果您的原始轮廓具有锐角,则您可能在 3D 中具有锐利的边缘。您可以尝试各种启发式方法,但这是反复试验。例如,您可以有一个预处理阶段。在初始三角剖分之后,仍然在 2D 中,查看生成的三角形。找到最长和最窄的(例如比较周长与面积,或三角形的最小角度),尝试使用相同的菱形方法更改它并检查结果是否“更好”。重复,直到没有任何改进。
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 2012-09-28
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2011-10-05
  • 1970-01-01
相关资源
最近更新 更多