【魔方超新星】30天独立开发PCG Minigame《盖亚计划》作品展示,尚有不足,大佬轻喷
目录
游戏实机录屏
一、简介
二、设计思路
2.1 Disco Ball
2.2 Fibonacci Sphere
2.3 Goldberg Polyhedron
2.3.1 细分+对偶(最终方案)
2.3.2 对偶+截角(更优)
三、参考文献
在制作Minigame初期,游戏风格想模仿《文明6》与《Polygonal Planet Project》by Oskar Stålberg(PCG巨佬,一人做出震惊业界的《Townscaper》),结合WFC算法程序化生成一些风格不同的星球。
球形建模主要包含Disco Ball、Fibonacci Sphere与Goldberg Polyhedron三种,速览移步最终方案2.3.1。
面片分布不均匀,南北两极过密,放弃该方案。
立方体投影在球面形成的“斐波那契球体”表面网格分布较为规则,但立方体顶点处面结构也比较特殊,不易存储面片邻接关系,放弃该方案。
相比之下,戈德堡多面体面片分布显得十分均匀,但由于六边形无法平铺在球体表面,会出现少量的五边形,类比足球。下面借助Procedural Mesh Component管理Vertice与Triangles数据,进行绘制。
1.首先根据二十面体的点面信息,将其绘制出来;
2.在每条边的中点添加顶点,更新面片信息重新绘制,达成细分的目的;
3.细分后计算球体半径,将所有顶点位置移动到球面上;
//Icosahedron Info const float phi = (1 + sqrt(5)) / 2.0; const float radius = sqrt(1 * 1 + phi * phi); const float X = 1.f; const float Z = phi; const float N = 0.f; static const TArray<FVector> constVertices = { {-X,N,Z}, {X,N,Z}, {-X,N,-Z}, {X,N,-Z}, {N,Z,X}, {N,Z,-X}, {N,-Z,X}, {N,-Z,-X}, {Z,X,N}, {-Z,X, N}, {Z,-X,N}, {-Z,-X, N} }; static const TArray<FVector> constTriangles = { {0,4,1},{0,9,4},{9,5,4},{4,5,8},{4,8,1}, {8,10,1},{8,3,10},{5,3,8},{5,2,3},{2,7,3}, {7,10,3},{7,6,10},{7,11,6},{11,0,6},{0,1,6}, {6,1,10},{9,0,11},{9,11,2},{9,2,5},{7,2,11} };
4.构建细分多面体相对应的对偶多面体(一种多面体的每个顶点均能对应到另一种多面体上的每个面的中心),即可得到戈德堡多面体。求对偶的思路是将细分多面体上每个面的中心点作为对偶多面体上的顶点,细分多面体上与顶点相连的边确定对偶后每个面上的5/6个顶点,通过数学方法对这5/6个顶点的编号进行排序,再确定新的面片关系进行绘制(一个六边形/五边形可以拆分成三个面片)。
5.最后只需调整半径大小、细分级别,即可获得不同的戈德堡多面体。
上面的方法精确度不够高,在后期制作时发现面片大小轻微有所不同。由于时间问题,最后也没找到改进的办法。理论上来讲,下述方式会明显提高精确度,但点面关系的维护也会增加难度,感兴趣的小伙伴可以试试,欢迎交流。