有限制的景观过程化生成

7
我希望实现地形的过程生成。经过深入研究,我得出结论应该使用其中一个渐变(连贯)噪声生成算法,例如Perlin Noise算法。然而,我不希望生成完全随机。我想应用一些限制条件(例如山脉范围在哪里,低地在哪里等)。
问题:
例如,我有一个表示某个景观元素的曲线。这条曲线是点数组。
1. 如何改进Perlin Noise算法,使得沿着这条曲线的噪声具有首选值范围(或者简单地说,值为0)?
2. 或者,如果我有一个由Perlin Noise算法输出的纹理(2D数组),如何将其转换为所需的噪声(受曲线影响)?
1个回答

13
我该如何改进Perlin噪声算法,使得沿着这条曲线的噪声具有首选值范围(或简单地说,值为0)?
可以通过将地图中的每个像素通过一个简单的p -> f(p)数学函数进行变换来实现这一点。
考虑一个函数,它将紫色线映射到蓝色曲线上-它强调低高度和非常高的高度,但使它们之间的过渡更陡峭(这个例子只是余弦函数,使曲线不太平滑会使转换更加明显)。

Cosine value transform

你也可以只使用曲线的下半部分,这样峰值会更加尖锐,低处则更加平坦(从而更易于玩耍)。

Cosine value transform II

"

曲线的“锐利度”可以通过幂函数(使效果更加戏剧化)或平方根函数(减弱效果)轻松调整。

"

enter image description here

实际上,这个实现非常简单(特别是如果你使用余弦函数)-只需在地图中的每个像素上应用该函数即可。如果该函数不太数学上平凡,查找表也可以很好地工作(在表值之间进行三次插值,线性插值会产生伪影)。
(从我的答案中复制another question
如果您只需要将生成的噪声转换为已知值范围(例如-1.0-1.0),请使用以下算法:
function scaleValuesTo(heightMap, newMin, newMax)
{
    var min = min(heightMap);
    var range = max(heightMap) - min;
    var newRange = newMax - newMin;

    for each coordinate x, y do:
        hrightMap[x, y] = newMin + (heightMap[x, y] - min) * newRange / range;
    end for
}

我想应用一些限制条件(比如山脉应该在哪里,低地应该在哪里等)。
这有点复杂,因为需要指定山脉的位置。最简单的解决方案是创建一个单独的高度图(可以通过程序生成或从位图加载),其中包含所需地形的粗略形状,然后将其与噪声图像相加。需要注意以下几点:
1)确保模板图没有锐利的边缘(这些在组合图上会非常明显)。盒状模糊通常足够实现此目的,尽管更复杂的滤镜(如高斯模糊)可以获得更好的效果(在某些情况下,盒状模糊会保留地图上的一些锐利边缘)。
2)您可能希望在较高海拔处给予噪声图更高的优先级,在较低海拔处给予较低的优先级。可以通过执行以下操作轻松实现:combinedMap[x, y] = templateMap[x, y] + (0.2 + 0.8 * templateMap[x, y]) * noiseMap[x, y]。
您可以在此图表中看到此方法:

http://matejz.wz.cz/scheme.jpg

我为自己的地形生成项目制作了这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接