二十面体细分三角球面网格转Goldberg六边形球面的算法问询
三角球面网格转Goldberg六边形球面网格实现方案
Goldberg多面体本身就基于正二十面体生成,受欧拉公式约束,完整球面网格必然包含12个五边形(对应正二十面体的12个顶点位置),其余面均为六边形,完全符合六边形瓦片需求。以下是两种可行的实现算法:
方法1:三角网格对偶变换法(最适配现有二十面体三角网格的方案)
之前删除顶点的方案破坏了网格拓扑一致性,才会出现三角化错误,而对偶变换完全基于现有三角网格的拓扑关系生成,天然保证结构正确:
- 预处理二十面体细分三角网格:统计每个顶点的邻接三角形列表,同时对每个三角形计算球面中心(不要直接用平面重心,要将重心坐标投影到球面半径上,保证对偶顶点都在球面上避免变形)
- 生成对偶网格顶点:遍历所有原三角面,每个面的球面中心对应一个对偶顶点,记录顶点的索引和坐标
- 生成对偶网格面:遍历原网格的每个顶点,将该顶点邻接的所有三角形对应的对偶顶点按统一的顺时针/逆时针顺序排序,依次连接形成一个闭合面:原网格中最初的12个二十面体顶点对应的面是五边形,其余所有顶点对应的面都是六边形
- 六边形三角化:如果需要将六边形拆分为三角形用于渲染,直接将六边形的6个顶点分别与六边形的面中心连接,拆分为6个等腰球面三角形即可,不会出现扭曲问题
方法2:直接生成Goldberg网格法
如果不需要基于现有三角网格转换,可以直接按Goldberg多面体规则生成目标网格,流程更简洁:
- 先确定Goldberg多面体的参数
(m,n):两个正整数决定网格的细分精度,通常取n=0即可得到均匀等分的六边形网格,数值越大瓦片密度越高 - 按参数在正二十面体的每个原始三角面上划分平面网格,将所有划分得到的顶点投影到球面,再按拓扑规则连接顶点,直接得到由12个五边形和对应数量六边形组成的目标网格
内容的提问来源于stack exchange,提问作者Goner243
相关产品推荐
相关产品推荐

