工具
TopMod 一个研究拓扑模型的社群开发的小工具,可以用来快速生成正六边形和正五边形拼接成的球体模型。
有言在先
本文基本上全部基于 HexPlanet 这个开源项目。
项目源码附带有一份文档,如果觉得本文有任何说的不够清楚明白的地方,可以再参照一下原文档。
本文不包含具体的论证过程,有兴趣可自行 Google。
原理
最接近球的正多面体
-
正十二面体 : 十二个正五边形构成
正十二面体 -
正二十面体 : 二十个正分角形构成
正二十面体
-
还有一种很常见的球——足球,其表面图案由正五边形和六边形构成。
足球
几个有趣的关系
-
将正十二面体每个面的中心连起来就是正二十面体
-
将正二十面体每个面的中心连起来就是正十二面体
-
以正二十面体为原型,将每条棱的中点拉到与原来的顶点一样的高度再与原来的顶点连起来,可以生成更多的正三角形
- 这时再把每个面的中点连起来,便是一个足球了
最终
如果不断重复上面的第 3 步,直到三角形足够多,再进行第 4 步:
正三角形 正五边形和正六边形便可以按我们想要的用正五边形和正六边形拼成一个球面了。
实践
上面的原理听起来简单,但真正操作起来还是要写好多代码的。感谢开篇提到的工具——TopMod,已经有人做好了。
生成三角球面模型
打开软件,选择那个现成的球——这已经重复了好几步
基础模型点击 Window,确保勾选如图两项,以打开重构 Mesh 的两个工具箱
工具箱选择 Root-3 模式后根据需要点击 Perform Remeshing 按钮,就可以继续生成更多的正三角形(三角形越多,此步耗时越长,可能界面会卡)
重复细分选择 Dual 模式再点击 Create Dual 可以预览效果
预览恢复到正三角形状态(三角形面是最受支持的)点击 File -> Save As... 即可保存模型文件
烘焙六边形网格
由于导出的是三角形面,需要我们自己烘焙正六边形和正五边形数据,具体如下:
-
每个三角形顶点就是一个正六边形的或正五边形的中心点
-
与此点相连的点即是邻接的多边形中心点,据此可以生成邻接数据
-
针对每个多边形中心点应用物理碰撞检测,可以标记障碍物或水、沼泽等地形数据
-
将所有中心点放入 KdTree(C# Unity 可用,需要稍做修改),可以快速检索球面某点所在的格子
-
邻接数据可适用一般的 A* 算法
其它
-
Unity 导入模型会为每个三角形重新生成独立的顶点坐标和索引,所以用的时候要先去重
-
A* 算法的启发函数,可以用格子坐标与目标点的向量夹角,效果不错
-
原文还有六边形纹理贴图的方法,有兴趣的请参见原文档
网友评论