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

标签 algorithm graphics mesh

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

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

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

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

  2. 渲染或非真实感方法,例如 this question 中提出的方法或 this paper .他们似乎能够创造出我想要的轮廓,如下所示:enter image description here 我不是图形专家,到目前为止我还不知道他们的方法是否可以用于计算特征线而不是渲染。

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

最佳答案

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

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

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

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

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

关于algorithm - 3D网格边缘检测/特征线计算算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35007072/

相关文章:

algorithm - 如何生成与现有边界框至少按给定比例重叠的边界框?

java - 如何删除 Graphics 对象?

python - 从文件的一部分快速读取格式化数据(Gmsh 网格格式)

matlab - 如何使用 MATLAB 的 'isosurface' 函数创建三角球体

c++ - 当我传递纹理坐标 (OpenGL) 时没有任何显示

algorithm - 统一成本搜索与深度优先搜索

c - 找到一个超过第 80 个百分位数的值?

algorithm - 为什么 O(n log n) 大于 O(n)?

java - 在 Processing 中获取默认的(屏幕上的)PGraphics 上下文

html - source-over alpha 混合效果不佳(HTML5 Canvas )