想象一个洞穴系统,它表示为顶点和边缘的图形,每个顶点在3D空间中有一个位置,每个边缘代表一个隧道。或者边缘可能代表道路,顶点代表角落和交叉点。关键是我们有一个几何数据图,我们希望能够推断出该数据周围的任意结构。什么算法可以生成网格以在3D中渲染这些东西?
以下是关于类似主题的优秀Youtube视频:Unite 2015 - A coder's guide to spline-based procedural geometry。它涉及一个更简单的情况,我们只需要从一个点到另一个点没有分支,但是在渲染基于图形的3D结构时肯定会有相似的概念。
答案 0 :(得分:2)
从创建圆形洞穴开始
您可以使用Smoothly connecting circle centers作为起点。
然后通过将圆形更改为某些不同的形状,为其添加一些随机性和更像洞穴的轮廓。您还可以根据到图形交叉点的距离调制半径(或宽度)。不要忘记稍后还存储UV
映射以进行适当的纹理处理。这应该很简单,您可以将圆柱轴用作U
,将“圆”的角度参数用作V
。这也可以用作bump/normal mapping的 TBN 矩阵。
这个问题的主要问题是图形交叉点。您将需要创建一个平滑连接交叉管的网格,例如通过一些洞穴“房间”。它应该是可行的,因为顶点应该按圆的参数角度排序,这样你就可以知道哪个顶点位于每个管的哪一侧,并且可以在没有任何可怕的努力的情况下连接它们(即使有适当的多边形缠绕)。
这样你就可以生成几何体。
添加对象和功能
为此你可以完全随机或使用像我在这里Random Island generator那样的物理方法来创建生物群落。因此,您可以添加/利用一些规则,例如您从入口或水中走多远,或者您有多深入生成植被和物品。
<强>广义含强>
当将#1,#2 放在一起时,请尝试对其进行编码,以便输入是每个洞穴区域和图表的特定种子。通过这种方式,您可以分别生成洞穴的每个部分并重复生成。只需将此种子添加到图表中即可。
要进行平滑过渡,您还应生成相邻洞穴区域并插入它们之间的连接。
另一种选择是在没有生物群落的情况下获得均匀的洞穴环境,并且将更多东西添加到洞穴区域内部,然后再添加到边缘区域,因此在关节点处不会立刻发生太多变化。
<强> [注释] 强>
现在你明显将图形作为输入,但万一你没有,你可以随机生成,看看:
为了使洞穴墙更逼真,您可以使用 Diamond&amp; Square (来自岛屿生成器链接)来调制半径,只需确保平均值在角度参数方向上循环完成,以便生成地图添加到圆柱表面时是无缝的。