Answers:
我没有将“地面高度”作为样本,而是将噪声值视为“密度”,其中低于0的任何东西都是空气,高于0的任何东西都是地面。
简而言之,对于可能存在块的每个位置,都会评估噪声函数,如果噪声函数> 0,则会放置一个块。Notch的噪声函数是通过将水位高度增加到其值而偏斜的,这就是为什么较低的区域大部分为实心(高度为负,因此高度+噪声也为负),而较高的区域则大部分为空(高度为正,因此高度+噪声也是正数)。
可能还有一些其他的炼金术来决定生成哪种类型的方块并雕刻洞穴。但是我想这与该噪声功能没有直接关系。
另请注意,此方法适用于Notch,因为Minecraft具有基于体素的地形。如果您试图在基于多边形的世界中实现这一目标,则仅采样噪声函数是不够的。您必须使用某种算法将样本转换为曲面,并创建近似于该曲面的多边形。一种这样的算法是行进立方体。
如果地形需要洞穴网络和悬垂,则3D噪声成为强制性。
要从密度信息中提取等值面,最流行的两种技术是行进立方体(MC)和较新的双重轮廓(DC)。根据选择的方法,所需的数据结构有很大不同。
如前所述,Geiss的GPU Gems 3文章是了解和在GPU上实现MC地形的非常有启发性的起点(请注意,他的MC方法完全在GPU上运行,并且至少需要具有SM4-GS功能)。
由于MC体素上的密度数据只能保留在体素的边缘上,因此经典MC可能会在不保留尖锐边缘特征的情况下为体积绘制轮廓。DC不会遭受此缺点,因为密度信息表示为3D点(QEF最小化器),该点位于体素内部的任意位置以及每个角处的符号。
另一方面,MC不会出现自相交的面,因为所有生成的三角形均包含在其对应的体素中,而DC需要进行额外的计算以防止生成的面之间发生相交。DC作者在其算法的改进版本中解决了此问题。
http://www.cs.wustl.edu/~taoju/research/interfree_paper_final.pdf
http://www.cs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf
这位同事还提出了一种基于凸/凹分析的更清洁方法,以避免自相交。他还使用更好的四边形分割规则来帮助保留边的方向:
http://www2.mae.cuhk.edu.hk/~cwang/pubs/TRIntersectionFreeDC.pdf
经典MC也不是开箱即用的“无裂纹”,如果在不受限制的八叉树上运行,可能需要修补裂纹。DC不会受到最后一个问题的困扰。
这是对大多数网格提取技术的相当不错且完整的调查:http : //www.cs.berkeley.edu/~jrs/mesh/
八叉树/体素方法本质上是“ CSG友好”的,这使得计划整齐的,完全“可破坏的”游戏关卡策略更加容易,但是如果需要在游戏中实现所有这些功能,八叉树深度也将变得平淡无奇-依赖。
如果整个内容都适合存储在内存中或已正确传输,则数据也可以用于渲染AO和计算物理/碰撞。
Minecraft使用行进立方体算法生成3D地形。很抱歉,我没有这个参考。我不确定Notch在提到Perlin Noise函数时到底在说什么-也许是行进立方体算法的种子。更多信息在这里:
如果您对行进多维数据集感兴趣,则有一篇很棒的GPU Gems文章:
for (int x = 0; x < Width)
{
for (int y = 0; y < Depth)
{
for (int z = 0; z < Height)
{
if(z < Noise2D(x, y) * Height)
{
Array[x][y][z] = Noise3D(x, y, z)
} else {
Array[x][y][z] = 0
}
}
}
}