Sphere World Implementation C ++

时间:2009-01-23 16:48:35

标签: c++ data-structures 3d 3d-rendering

实现,存储和渲染球形世界的最佳方法是什么,例如孢子或无限的但没有孢子的中间阶段,以及多个世界的无限宇宙。不要假设行星本身是如何产生的或它的大小/规模。

4 个答案:

答案 0 :(得分:7)

对于渲染,您需要使用某种细节层次的算法,以便从靠近行星表面无缝移动到远处。有许多动态LOD算法(see here)。较旧的算法(称为ROAM)可以适用于处理球形物体或行星(spherical ROAM)。几何图表地图是一种更新,更流行的算法,可以适应球面as well

至于存储数据,您可能需要查看纹理,高度图等的程序生成(取决于您的需要)。这类似于Infinity和Spore的工作方式。您可以阅读一些关于程序纹理here的内容。程序高度图更简单,取决于您想要地形的复杂/真实程度。在最简单的层面上,您可以通过perlin噪声函数简单地移动顶点高度。

答案 1 :(得分:5)

如果您正在寻找存储表面数据的内容,可以查看HEALpix。它是天文学界开发的专门用于绘制天空(另一个球面)的软件。

HEALpix创建一个网格,用于描述曲面的位置和大小,并为每个曲面分配一个ID。然后,您可以使用该ID作为键或索引来访问有关该特定级别的详细信息。

HEASpix提供了查找相邻曲面区域的方法,并为每个网格点提供了中心和顶点位置。

它是一个分层网格,允许您根据需要细分每个面,因此理论上您可以在低分辨率下使用网格的一部分,如果需要,可以在更高的细节层次上使用其他部分。它有一个很好的属性,它是无限可分的(达到你的内存限制),并且给定分辨率的网格的每个像素与该分辨率级别的所有其他像素具有相同的区域。

分发包提供了许多您可能不需要的东西,但核心库应该是有用的。

答案 2 :(得分:4)

这可能不是你想要的......但是到底是什么。这是一个很好的故事。

很久以前,当恐龙仍然在地球上漫游并且记忆仍以千字节为单位时,我还是用一些软件来分解生成行星。

想法是创建一个代表行星的2NxN矩形。每次切割行星半数时间稍微移动两半。 (随机相移和振幅的切割的正弦波。移位的另一个随机正弦波。)后记,用水淹没下层区域,并用高度对其余区域进行颜色编码。

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

答案 3 :(得分:2)

我建议在内存中使用某种多边形模型来实现它们的世界,使用文件存储它们并使用某种3d引擎渲染它们。无论是那个,还是指针中心和半径,以及描述世界地理的叠加层。

编辑: 谢谢你的更多细节。根据您需要的细节数量,您需要使用某种方法将纹理分解为更小的部分 - 您可以为20个面生成纹理并在中心点周围构建Icosahedron。看看map projections,了解一下如何在现实生活中处理这个问题。