球体世界实现 C++

6

如何最好地实现、存储和渲染球形世界,例如Spore或Infinity中的世界,但没有Spore中的中间阶段,以及Infinity Universe中的多个世界。不要对行星本身的生成方式或其大小/比例进行任何假设。


2
你能否给我们更多细节,说明你实际想要什么? - Eclipse
1
如何实现、存储和渲染复杂的游戏环境是一项巨大的工程。Tom,如果你有更具体的问题,可能会得到更好的回答。 - Drew Dormann
我以前制作过游戏,只是从来没有制作过球形游戏世界!! - Tom J Nowell
4个回答

7

为了渲染,您需要使用某种细节级别算法,以便从接近行星表面无缝移动到远处。有许多动态LOD算法(在此处查看)。一种较旧的算法称为ROAM,可以适应处理球形对象或行星(球形ROAM)。几何剪贴地图是一种较新、更流行的算法,也可以适应球形表面

关于数据存储,您可能需要研究过程生成(根据您的需求)来进行纹理、高度图等处理。这类似于Infinity和Spore的处理方式。您可以在此处阅读有关程序纹理的一些信息。程序高度图则较为简单,具体取决于您希望地形有多复杂/真实。最简单的方法是通过Perlin噪声函数来位移顶点高度。

5
如果您正在寻找一个用于存储表面数据的工具,可以考虑使用HEALpix。这是由天文学界开发的软件,专门用于绘制天空(另一个球形表面)。
HEALpix创建了一个网格,描述了表面面的位置和大小,并为每个面分配了一个ID。然后,您可以使用该ID作为键或索引来访问有关该特定级别的任意详细信息。
HEALpix提供了查找相邻表面区域的方法,并可以为每个网格点提供中心和顶点位置。
它是一种分层网格,允许您将每个面细分为任意数量,因此如果需要,您可以在低分辨率的网格部分和更高分辨率的网格部分之间进行切换。它的优点是它是无限可分的(取决于您的内存限制),并且给定分辨率的网格的每个像素的面积与该分辨率级别的所有其他像素的面积相同。
发行包提供了很多您可能不需要的内容,但核心库应该很有用。

4

这可能不是你想要的... 但没关系,这是一个好故事。

很久以前,当恐龙仍然漫游在地球上,记忆还用千字节来衡量时,我玩了一些软件来分形地生成行星。

我的想法是创建一个2NxN的矩形来代表这个行星。将行星切成许多半,每次都稍微移动两半。(对于切割使用正弦波,带有随机相位和振幅。另一个随机正弦波用于移动。)之后,将低水平区域淹没在水中,并按高度颜色编码其余部分。

然后,在顶部放置直径为N的球体,并投影,将地图的NxN区域包裹在球体的一半周围。将球体移到地图上并看起来像它正在旋转。


这实际上与《人口密集区 3》实现虚假球形世界的方式非常相似。 - Tom J Nowell
有趣。我从没玩过《Populous》,但我不惊讶这种技术被使用了。 - Mr.Ree

2
我建议使用某种多边形模型来实现世界的内存管理,使用文件存储它们,并使用某种3D引擎进行渲染。或者只需使用指针中心和半径,以及一个叠加层来描述世界的地理信息。
编辑: 感谢提供更详细的信息。根据您需要的详细程度,您需要使用某种方法将纹理分成较小的部分-您可以为20个面生成纹理,并在中心点周围构造一个Icosahedron。请参考地图投影,了解如何处理现实生活中的这些问题。

是的,但世界在内存中会如何表示呢?当然,我可以通过四边形在内存中生成一个球体,但问题在于我必须对其进行纹理映射,而在极点处它会被压缩,在赤道处则会被拉伸,这并不像一开始看起来那么简单 =p - Tom J Nowell
这确实有一个缺点,即您拥有一个面的多个形状 - 但它确实有更多的面。 - Eclipse
哦,这个有60个相同形状的面:http://en.wikipedia.org/wiki/Deltoidal_hexecontahedron - 这里有一个展开的网格:http://en.wikipedia.org/wiki/File:Deltoidalhexecontahedron_net.png - Eclipse
也许,但当缩小时,我希望球体的曲率可见,这样会导致顶点穿透吗? - Tom J Nowell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接