三维网格边缘检测/特征线计算算法

时间:2016-01-26 04:28:35

标签: algorithm graphics mesh

我有一个可视化三角形网格的程序,允许用户使用钢笔在网格上绘图。我希望在我的系统中有一个“捕捉”模式。捕捉模式在用户绘制的线条捕捉到网格的该部分的最近边缘(或轮廓)的意义上为用户执行绘制校正。

我正在寻找一种算法,从给定的角度计算网格上可见的边缘。通过边缘,我指的是形状的轮廓:角点和它们之间的线条(类似于计算机视觉/图像处理中边缘的定义 - 例如Canny边缘)。

到目前为止,我已经考虑过两种方法:

  1. 边缘检测:到目前为止,我只找到this paper。他们的方法是可以理解的,但实现并不是微不足道的(由于张量计算和解释中的一些模糊性)。这种方法的问题在于它产生“边缘强度值”,它是每个顶点的[0,1]范围内的值。值1表示具有高置信度的边缘顶点。这在系统中引入了额外的阈值参数,我宁愿不具备这些参数。它们的输出看起来像这样(范围[0,1]缩放为[0,65535]): enter image description here

  2. 渲染或非照片级真实方法,例如this questionthis paper中提到的方法。他们似乎能够创造出我所追求的轮廓,如下所示:enter image description here 我不是图形专家,但我不知道他们的方法是否可用于计算特征线而不是渲染。

  3. 我想知道是否有人对我想要做的好算法有任何想法。由于系统非常具有交互性,因此性能非常重要。捕捉功能不必一直启用(因此,如果方法计算量很大,则在算法计算边缘时,可以容忍在“捕捉启用”模式切换时的某些延迟。)另外,如果您知道任何实现(最好是开源),如果你能与我分享,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

您要检测两种类型的边缘:

  • 轮廓边缘取决于视点,它们对应于视线与曲面相切的位置。使用三角模型,它们很容易确定,因为它们由前向三角形和后向三角形共享。

  • “角”边缘与视点无关,并且由切面方向上的不连续性形成。由于三角模型本身具有这种不连续性,因此找不到它们的确切标准。只需在由两个三角形形成的角度上设置阈值即可。此阈值必须使平滑补丁不会触发。

通过这种方法,您将在3D中找到所需的边缘。

这还不够,因为其中一部分被其他表面隐藏了。您可以选择将它们作为边缘集成到3D模型中,让渲染引擎完成其工作,或者,如果您有勇气,可以实现hidden lines removal算法。 (维基百科的链接有点简洁。)

答案 1 :(得分:0)

自发布问题以来,其他一些事情进入了我的脑海。由于2D边缘检测是一个研究得很好的问题,解决问题的一种方法是对网格的投影图像进行2D边缘检测。

换句话说,给定网格的特定视图,可以生成2D图像。然后可以在2D图像上运行2D边缘检测算法(例如Canny边缘检测器),并且可以将结果反投影到3D以确定所讨论的网格的轮廓。这样做的一个可能的优点是简单!

编辑(2017):

即使我离开了这一点,我又为了不同的目的又回到了这个问题。对于其他任何研究这个问题的人来说:there is a paper讨论了值得阅读的网格中的各种轮廓(论文是DeCarlo等人的“传递形状的暗示轮廓”)。

本文讨论的方法的工作实施是available here