我正在使用 Unity,但解决方案应该是通用的。我将通过鼠标点击获得用户输入,它定义了一个封闭的不规则多边形的顶点列表。这些顶点将定义平面 3D 网格的外边缘。
要在 Unity 中以程序方式生成网格,我必须指定所有顶点以及它们如何连接以形成三角形。
因此,对于凸多边形来说,这很简单,我只需制作具有顶点 1、2、3 和 1、3、4 等的三角形,形成类似孔雀尾巴的东西。
但是对于凹多边形来说,它并不是那么简单。有没有找到内部三角形的有效算法?
我正在使用 Unity,但解决方案应该是通用的。我将通过鼠标点击获得用户输入,它定义了一个封闭的不规则多边形的顶点列表。这些顶点将定义平面 3D 网格的外边缘。
要在 Unity 中以程序方式生成网格,我必须指定所有顶点以及它们如何连接以形成三角形。
因此,对于凸多边形来说,这很简单,我只需制作具有顶点 1、2、3 和 1、3、4 等的三角形,形成类似孔雀尾巴的东西。
但是对于凹多边形来说,它并不是那么简单。有没有找到内部三角形的有效算法?
您可以使用受约束的Delaunay 三角剖分(实现起来并非易事!)。Triangle和CGAL中提供了良好的库实现,提供了高效的O(n*log(n))
实现。
如果顶点集很小,剪耳算法也是一种可能,尽管它不一定会给你一个 Delaunay 三角剖分(它通常会产生次优三角形)并在O(n^2)
. 不过,实现自己很容易。
由于输入顶点存在于 3d 空间中的平面上,因此您可以通过投影到平面上,计算 2d 中的三角剖分,然后将相同的网格拓扑应用于 3d 顶点集来获得 2d 问题。
我已经实现了如下的剪耳算法:
笔记: