如何改进 Perlin 噪声算法,以便沿着这条曲线,噪声将具有首选值范围(或者,为了简单起见,值 0)?
这可以通过简单的变换地图中的每个像素来实现p -> f(p)
数学函数。
考虑一个函数,它将紫色线映射到蓝色曲线 - 它强调较低的定位高度以及非常高的定位高度,但使它们之间的过渡更陡峭(这个例子只是一个余弦函数,使曲线不太平滑会使的转变更加突出)。
您也可以只使用曲线的下半部分,使峰值更尖锐,位置较低的区域更平坦(因此更具可玩性)。
曲线的“锐度”可以通过功率(使效果更加显着)或平方根(降低效果)轻松调节。
其实现实际上非常简单(特别是如果您使用余弦函数) - 只需在地图中的每个像素上应用该函数即可。如果该函数在数学上不是那么简单,则查找表可以正常工作(在表值之间进行三次插值,线性插值会产生伪影)。
(从我的回答复制到另一个问题 https://stackoverflow.com/questions/14006238/tweaking-heightmap-generation-for-hexagon-grids/14009833#14009833)
如果您需要的只是将生成的噪声转换为已知的值范围(例如 -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]
.
您可以在此图中看到这种方法:
(这是我为自己做的地形生成项目 https://code.google.com/p/geogen/)