4

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

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

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

为了实现六边形网格,我采用了这里解释的想法。它向下移动正常网格的奇数行,以允许相对容易地渲染六边形而没有太多进一步的复杂性(我希望)。

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

在此处输入图像描述

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

所以终于说到我的意思了,有没有:

  • 一种在我当前的方法中平滑或调整顶点的方法,它将六边形的所有点都带到一个平面上(共面)。

编辑:对于任何寻找有关如何使点共面的信息的人来说,这是一个很好的解释

  • 一种更好的程序地形生成方法,可以更好地控制这类事情。
  • 一种以不同方式表示我的顶点信息的方法,允许这样做。

需要明确的是,我并不是想实现一个带有凸起边缘或平台的平面六角网格(如下所示)。

这里)

我希望所有几何图形都加入并引导到下一个位。

我希望实现与我现在所拥有的类似的东西(相对较好的起伏山丘和地形),但具有更可控的高原。这给了我稍后关闭区域(无法播放的瓷砖)的灵活性,如果需要,我可以在其中添加更高细节的网格。

欢迎任何反馈,我将其用作学习练习,所以请 - 欢迎所有评论!

4

1 回答 1

3

这取决于您实际想要什么以及“更受控制”的含义。

您是否希望能够说“坐标 [11, -127] 上会有一座山,半径为 20”?这个的复杂性取决于你想走多远。如果您只想要山脉,那么径向渐变就足够了(只需将渐变值添加到噪声值)。但是,如果您想要一些更复杂的形状,那您就大饱眼福了。

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

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

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

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

余弦值变换

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

余弦值变换 II

曲线的“锐度”可以很容易地用功率(使效果更加戏剧化)或平方根(降低效果)来调制。

在此处输入图像描述

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

可以在本文中找到几种更简单的随机噪声地形“游戏化”方法:“用于计算机游戏的侵蚀分形地形的实时合成”。

祝你的项目好运

于 2012-12-23T09:12:22.973 回答