我该如何改进Perlin噪声算法,使得沿着这条曲线的噪声具有首选值范围(或简单地说,值为0)?
可以通过将地图中的每个像素通过一个简单的p -> f(p)数学函数进行变换来实现这一点。
考虑一个函数,它将紫色线映射到蓝色曲线上-它强调低高度和非常高的高度,但使它们之间的过渡更陡峭(这个例子只是余弦函数,使曲线不太平滑会使转换更加明显)。
![Cosine value transform](https://istack.dev59.com/OxXOW.gif)
你也可以只使用曲线的下半部分,这样峰值会更加尖锐,低处则更加平坦(从而更易于玩耍)。
![Cosine value transform II](https://istack.dev59.com/ApMLw.gif)
"
曲线的“锐利度”可以通过幂函数(使效果更加戏剧化)或平方根函数(减弱效果)轻松调整。
"
![enter image description here](https://istack.dev59.com/CLE8t.gif)
实际上,这个实现非常简单(特别是如果你使用余弦函数)-只需在地图中的每个像素上应用该函数即可。如果该函数不太数学上平凡,查找表也可以很好地工作(在表值之间进行三次插值,线性插值会产生伪影)。
(从我的答案中复制
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](https://istack.dev59.com/2ji4c.webp)
我为自己的地形生成项目制作了这个。