3D网格边缘检测/特征线计算算法

3D mesh edge detection / feature line computation algorithm

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

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

到目前为止,我想到了两种方法:

  1. 边缘检测:到目前为止我只发现了this paper。他们的方法是可以理解的,但实现起来并不简单(由于张量计算和他们解释中的一些歧义)。这种方法的问题在于它会产生 "edge strength values" ,这是每个顶点的 [0, 1] 范围内的值。值为 1 表示具有高置信度的边缘顶点。这在系统中引入了额外的阈值参数,我宁愿没有。他们的输出看起来像这样(范围 [0, 1] 缩放到 [0, 65535]):

  2. 渲染或非真实感方法,例如 this question or this paper. They seem to be able to create the silhouette that I'm after as can be seen below: 中提出的方法 我不是图形专家,到目前为止我还不知道他们的方法是否可以用于计算特征线而不是渲染。

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

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

  • 轮廓边缘与视点相关,它们对应于视线与表面相切的位置。使用三角模型,它们很容易确定,因为它们由 front-facing 三角形和 back-facing 三角形共享。

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

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

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

自从发布问题后,我的脑海里又浮现出一些别的东西。由于 2D 边缘检测是一个研究得非常透彻的问题,因此解决该问题的一种方法是对网格的投影图像执行 2D 边缘检测。

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

编辑 (2017):

尽管我离开了这个问题,但出于不同的目的,我又回到了这个问题上。对于任何其他研究这个问题的人:there is a paper 讨论了值得一读的网格的各种轮廓 (这篇论文是 DeCarlo 等人的 "Suggestive Contours for Conveying Shape")。

论文中讨论的方法的工作实现是available here