调整Hexagon网格的高度图生成

时间:2012-12-22 20:15:33

标签: terrain procedural-generation hexagonal-tiles heightmap

目前我正在开展一个小项目,只是为了一点乐趣。它是一个使用OpenGL的C ++,WinAPI应用程序。

我希望它会变成在六边形网格上播放的RTS游戏,当我完成基本游戏引擎时,我计划进一步扩展它。

目前我的应用程序包含一个保存顶点和高度图信息的VBO。高度图使用中点位移算法(菱形方块)生成。

为了实现六边形网格,我接着解释了here的想法。它向下移动一个正常网格的奇数行,以便相对容易地渲染六边形,而不会有太多复杂的问题(我希望)。

几天之后,它开始走到一起,我已经添加了鼠标拾取,这是通过以独特的颜色渲染网格中的每个十六进制,然后在此FBO中对给定的鼠标位置进行采样以识别ID来实现的选定的单元格(在下面的屏幕截图的右上角显示)。

enter image description here

在我的项目的下一阶段,我想看看产生更多“可玩”的地形。对我来说,这意味着每个六边形的形状应该比上图所示的更加规则。

所以终于到了我的意思,是吗:

  • 在当前方法中平滑或调整顶点的方法 这将六角形的所有点都放在一个平面上(共面)。

编辑: 对于任何寻找有关如何制作共面点here is a great explination的信息的人来说。

  • 一种更好的程序性地形生成方法 为了更好地控制这类事情。
  • 以不同的方式表示我的顶点信息的方法。

要明确的是,我并没有尝试使用凸起的边缘或平台来实现扁平的六角网格(如下所示)。

here

我希望所有几何体都能加入并引入下一个几何体。

我希望能够获得类似于我现在所拥有的东西(相对漂亮起伏的山丘和地形),但具有更可控的高原。这使我可以灵活地在以后对区域(无法播放的图块)进行编码,如果需要,我可以在其中添加更高细节的网格。

欢迎任何反馈,我将此作为学习练习,所以欢迎所有评论!

1 个答案:

答案 0 :(得分:3)

这取决于你真正想要什么,你的意思是“更有控制力”。

你想说“坐标[11,-127]半径20”会有一座山吗?这种复杂性取决于你想走多远。如果您只想要山脉,那么径向渐变就足够了(只需将渐变值添加到噪声值中)。但是如果你想要一些更复杂的形状,你就可以享受。

我在project深入探索这个想法(请考虑发布的版本只是一个原型,目前正在进行重大的重新设计,但它完全可用于地图生成器)。

另一种方法是使生成更具程序性 - 您只需指定一系列数学函数,并将其应用于地形。即使是简单的价值转换也能让你走得很远。

所有这些方法都适用于十六进制网格。如果由于奇数行移位而出现伪影,那么您可以替换奇数行(仅使用简单的线性插值公式从两个顶点之间计算顶点的高度值)。

考虑一个函数,它将紫色线映射到蓝色曲线 - 它强调较低的位置高度以及非常高的位置高度,但使它们之间的过渡更陡峭(这个例子只是一个余弦函数,使得曲线更少平滑会使转变更加突出)。

Cosine value transform

你也可以只使用曲线的下半部分,使峰值更锐利,更低的位置区域更平坦(因此更具可玩性)。

Cosine value transform II

曲线的“锐度”可以很容易地用力量调制(使效果更加显着)或平方根(降低效果)。

enter image description here

实现这个实际上非常简单(特别是如果你使用余弦函数) - 只需在地图中的每个像素上应用该函数。如果函数在数学上不是那么简单,那么查找表就可以正常工作(在表值之间使用三次插值,线性插值会产生假象)。

本文可以找到几种简单的随机噪声地形“游戏化”方法:“Realtime Synthesis of Eroded Fractal Terrain for Use in Computer Games”。

祝你的项目好运