我目前正在试验 openGL,我画了很多圆圈,我必须将它们分解成三角形(三角化一个圆圈)。
我一直在通过增加一个角度来计算三角形的顶点,并使用
cos()
和 sin()
来获取一个顶点的 x 和 y 值。
我在互联网上搜索了一些有关执行此操作的最佳和最有效方法的信息,尽管没有太多可用信息,但我意识到细长三角形(我的方法)并不是很好。更好的方法是从等边三角形开始,然后重复添加三角形以覆盖尚未覆盖的尽可能大的区域。
左 - 我的方法;对 - 新方法
我想知道这是否是 the 最有效的方法,如果是,那将如何在实际代码中实现。
找到方法的网址:link
两种三角测量各有利弊
Triangle FAN 具有相等大小的三角形,有时使用纹理(和其他插值的东西)看起来更好,生成的代码很简单,用于参数圆方程的循环。
增加的细节网格具有更少的三角形并且可以轻松支持可能更快的LOD。但是点数不是任意的(3、6、12、24、48,...)。代码稍微复杂一点你可以:
从记住圆周边的等边三角形开始
所以添加三角形
(p0,p1,p2)
到网格和边缘(p0,p1),(p1,p2),(p2,p0)
到圆周。
圆周的每条边
(p0,p1)
计算:
p2 = 0.5*(p0+p1); // mid point
p2 = r*p2/|p2|; // normalize it to circle circumference assuming (0,0) is center
添加三角形
(p0,p1,p2)
到网格并用 p0,p1
边替换 (p0,p2),(p2,p1)
边
请注意,
r/|p2|
对于当前细节级别的所有边都是相同的,因此无需一遍又一遍地计算昂贵的|p2|
。
goto #2 直到你有足够密集的三角测量
所以 2 个 for 循环和一些动态列表(点、三角形、circumference_edges 和一些临时工,如果不这样做的话)。此外,此方法根本不需要测角(也可以修改以生成三角形扇形)。
这里有类似的东西: