在半边三角网格

时间:2015-05-16 18:11:41

标签: model 3d mesh edges triangular

我正在开发一个项目,该项目需要将三角形汤转换为实际的结构化网格,以便将操作应用于网格。网格对象是半边类型结构,具有以下项目:

Vertex { vec3 position, int edge /* any half edge leaving the vertex */}
HalfEdge {int vertex, int pair}
Triangle {int vertex[3], int normal[3]}
BoundaryEdge {int vertex, int pair, int next, int prev}

索引将所有内容引用到这些项的数组中。我已经到了连接所有内部边缘,并设置了所有边缘和边界边对的点,我遇到的问题是如何设置边界边循环的next和prev索引(即,如何找到这些从未连接的边界边列表中循环)。

如果循环都很简单,那将很容易;但是,我正在使用的网格可以有边界“交汇点”,即共享顶点的多个边界循环。这使得在创建边界循环时存在点,其中算法必须确定多个可能边中的哪一个是循环中的正确下一个边。如果选择了错误的边缘,则可能无法迭代入射到顶点的所有边。

到目前为止,每次遇到这样的连接时,代码基本上都会查看分别离开和进入顶点的半边的下一个和上一个索引的所有可能赋值,并找到第一个赋值这使得从任何半边开始离开顶点,通过使用edge.pair.next到达下一个这样的半边,可以访问每隔一个这样的半边(并且只有这些边)。目前,解决方案并不过分有效(我不认为),我甚至不知道它是否正确,并且添加与1个或更少三角形相邻的三角形也存在同样的问题。

我想知道是否,a。)是我的解决方案实际上会起作用,并且b。)是否还有另一种更常见/已使用的解决方案来找到我尚未找到的这些边缘循环?< / p>

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。我的情况是几个区域(表示为一组三角形)在顶点/顶点相交,它们是边界。目标是找到每个地区的边界。我发现使用单环邻域(即edge.pair.next)是困难且低效的。

我所做的是,对于每个区域,我会想到所有三角形并寻找边界边缘。每当我找到边界边缘时,我都会将starting_vertex和ending_vertex记录到一个hashmap中(map [starting_vertex] = ending_vertex,map [ending_vertex] = starting_vertex)。遍历此区域中的所有三角形后,您将从边界顶点开始并使用散列图构建边界。

如果三角测量边界上有一个孔,由于三角测量不是一个流形,上述方法将失败。解决方法: 1.如果原始表面上有孔,请尝试使用插值填充孔。 2.如果原始表面上没有孔,但产生的三角测量有一个孔,那么问题是由产生三角测量的不良代码引起的。因此,您可能希望更改生成三角测量的算法。