如何使用体素和柏林噪声制作三维地形

时间:2014-07-11 19:53:35

标签: javascript 3d perlin-noise voxels

我已经阅读了很多关于这个概念的教程,但我觉得他们都没有深入研究如何做到这一点。我已经知道3D编程(光栅化,投影矩阵等)光线投射(使用欧几里得几何和矢量)和光线追踪工作我只需要知道如何使用perlin噪声生成和渲染体素景观。此外,我知道地图是用2d数组创建的,但是数组的每个元素都代表体素的每个垂直列,或者只是地图上的一个广义点(如山峰或山顶)。 Thanx事先得到答案!

3 个答案:

答案 0 :(得分:1)

我不知道你追求的是什么。您是在寻找像任何视频游戏一样的基本地形映射,还是在寻找"体素"像Minecraft体素?像Minecraft这样的游戏使用 3d Perlin噪音而不是你想象的2-d。三维噪音有助于在地下产生洞穴和洞穴。如果你只是在谈论身高地图,那么这些工作的方式是,"颜色"或者2维平面上的值表示网格点的高度。二维噪声地图上的暗点通常是山谷和光点山脉或任何你想要的。

这里有一个很好的来源,可以帮助我理解三维Perlin噪音。如果你还没有多变量计算,你可能会对它感到困惑,但从你所谈论的其他东西来看,这对你来说应该是轻而易举的。我可能能够做到这一点,但如果我试图编制观点视锥,我会大量出汗:http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf

这是一个很棒的视频,有人在空间中映射 3d 单纯形噪音:https://www.youtube.com/watch?v=GTAqjyG2oOc

Perlin和Simplex(由同一个人制作)建立了一个算法,您可以在坐标处对值进行采样。然后,您可以将这些值用于您想要的任何值,并且它们的潜力实际上是多种多样的。从生成地形到轻松平铺的纹理,到云端,或者从你的笨拙挖掘中获取数百万美元并放置块游戏。

这是我对我的三维佩林噪音的第一次测试。我用它来测量球体表面所有位置的三维噪声密度。由于球体抽象地放置在3-d云中。在球体表面上采样云的值会产生一个完美的平铺而不是拉伸的球体噪声图:http://imageshack.com/a/img908/4101/75e2a4.png

可以使用三维噪声和二维噪声的示例。三维噪声用于在球体上创建无缝纹理,然后球体上的纹理用于生成非常严重勾勒出的行星的高度和颜色图(这只是对噪声的测试,而不是待用)。

无论如何,我不知道你的意思是"体素"就像在内容中生成类似于内容,或者如果你只是在数学意义上意味着体素。对于标准游戏中的一般地形生成,您不必在泥土中挖掘块,二维噪声通常会与我的星球如何使用由3生成的二维纹理相似 - 噪音。它只是将地形网格的高度映射到2维平面。对于更精细的细节,法线贴图和凹凸贴图通过在其他平面上渲染阴影,在底层网格中创建变形错觉。

编辑:我对你的意思感到困惑"我知道体素存储在二维数组中" ...如果你的意思是地图上的顶点,那么,那将是有意义的因为你有数组的x索引,数组的y索引和z(高度)的索引。我见过的大多数地形绝对没有地形网格上z坐标的倾斜。这就是为什么你有时会在像WoW这样的老游戏中在山的两侧看到令人讨厌的拉伸纹理:http://img90.imageshack.us/img90/7000/155n.jpg网格的表面已被拉伸,因为" z&的x和y #34;为方便起见,将值钳制(我假设为整数)。

答案 1 :(得分:0)

您可以使用以2d网格馈送的2D perlin噪声的返回值的幅度来获得基于高度图的体素景观。返回值越高,垂直添加体素越多。如果你想要具有洞穴效果的3D景观,那么你需要一个额外的维度(例如:用3D网格的顶点位置输入3D perlin)并添加你的噪声表面所在的体素(例如:返回值为0的地方,如果你的perlin实现在-1和1之间返回。

答案 2 :(得分:0)

对于空间中的任何XYZ点,3d噪声函数都会返回1到-1 ...

为选定的xyz空间运行噪声函数。

如果它大于0,它包含一个体素。

当xyz返回密度字段(如-1/1)时,称为isosurface函数。

在线查找图像和信息的isosurface教程。