首页 文章

调整Hexagon网格的高度图生成

提问于
浏览
4

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

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

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

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

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

enter image description here

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

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

  • 一种平滑或调整当前方法中顶点的方法,可以将六边形的所有点都放在一个平面上(共面) .

EDIT: For anyone looking for information on how to make points coplanar here is a great explination.

  • 一种更好的程序性地形生成方法,可以更好地控制这类事物 .

  • 一种以不同的方式表示我的顶点信息的方法 .

为了清楚起见,我并没有尝试实现具有凸起边缘或平台的扁平六角网格(如下所示) .

here

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

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

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

1 回答

  • 3

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

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

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

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

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

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

    Cosine value transform

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

    Cosine value transform II

    曲线的“锐度”可以通过功率(使效果更加显着)或平方根(降低效果)轻松调节 .

    enter image description here

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

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

    祝你的项目好运

相关问题