5

我正在用 JavaScript ( http://www.isogenicengine.com/demos/1.1.0/lander/ ) 编写一个简单的月球着陆器克隆,而不是一个只有高点和低点的基本景观,我想要一个算法生成随机的洞穴状空间。给定一个矩形区域以使用 [0, 0, 1920, 1200],该算法应该能够生成如下图所示的内容。理想情况下,洞穴区域的任何“入口”都应具有设定的宽度,以便着陆器可以进入“内部”。

着陆器

我认为这可能是不可能的,我可以只画一堆像上面那样的图像并将像素数据转换为粗糙的多边形数据,但是随机生成的关卡会更酷!

对于超硬核加分,指定有多少类似洞穴的结构的能力将更加令人敬畏。

该算法的输出将是一个点数组,每个点都是一个包含 x 和 y 属性 {x: val, y: val} 的对象,当您在当前点和下一个点之间顺序绘制线时,构成多边形.

如果有人有类似的 JavaScript 实现,那也会有很大帮助!

4

2 回答 2

3

从了解在建筑中使用的气泡图是什么开始。这是一个空间的拓扑图,以气泡为空间,以线条代表通道。我没有找到任何可以快速推荐的优秀网页,但是进行图像搜索会产生很多示例。

气泡图可以被认为是一个以气泡为顶点的图形。在您的示例中,将“天空”(包括顶部边缘的斑点)建模为顶点。洞穴是另一个顶点,入口是边缘。从这个角度来看,很容易生成尽可能多的洞穴般的复杂性。

下一个技巧是把它变成几何。本质上,您希望从图形的骨架中推出并在玩家可以导航的地方留出空隙。同时,您要确保这些空隙不会推出太远、变薄或消除墙壁。因此,您还需要对实体区域进行建模,这是通过对偶图完成的。对偶图位于原始图的“下方”,从某种意义上说,边缘交叉代表了冲突,冲突的解决有利于虚实而不是实心。

总结:(1)用你想要的特征做一个拓扑图。(2) 为图创建几何图形,为每个顶点分配一个位置,为每个边分配一个路径。(3) 构造一个对偶图,并分配它的几何图形。(4) 通过向外扩展来充实与每个图相关的空间,解决冲突有利于通过而不是阻塞。

您可能想说服自己,最终几何图形的周长列表可以通过图的半边遍历生成,就像一只手扶着墙上走迷宫一样。

于 2012-11-20T05:16:32.000 回答
1

如果您有兴趣,可以使用 Marching Squares 将标量值的 2D 字段(可能从 Perlin 或 Simplex Noise 获得)转换为一组边缘线。当然,最终的结果将取决于您如何获得 2D 场标量值(您如何操作 Perlin 或 Simplex Noise)。

是我能找到的最好的网站,它很好地介绍了细节。(它的记录不如它的 3D 双胞胎 Marching Cubes 那样有据可查)

实际上,它上面的Wiki页面非常好。

于 2012-12-10T14:37:30.910 回答