3d 约束景观的程序生成

3d 约束景观的程序生成,3d,gradient,terrain,perlin-noise,procedural-generation,3d,Gradient,Terrain,Perlin Noise,Procedural Generation,我想实现地形的程序生成。 经过深入的研究,我得出了一个结论,即应该使用一种梯度(相干)噪声生成算法来实现,例如Perlin噪声算法。 然而,我不希望这一代完全是随机的。我想应用一些约束条件(比如哪里应该是山脉,哪里应该是低地等等) 问题: 例如,我有一条代表一些景观元素的曲线。曲线是一组点 我该如何改进柏林噪声算法,以便沿着这个方向 曲线噪声将有一个首选的值范围(或 简单性,价值(0) 或者,如果我有一个纹理是 柏林噪声算法(2d阵列)的输出,如何转换 是否达到所需的噪音(受曲线影响) 我如

我想实现地形的程序生成。 经过深入的研究,我得出了一个结论,即应该使用一种梯度(相干)噪声生成算法来实现,例如Perlin噪声算法。 然而,我不希望这一代完全是随机的。我想应用一些约束条件(比如哪里应该是山脉,哪里应该是低地等等)

问题:

例如,我有一条代表一些景观元素的曲线。曲线是一组点

  • 我该如何改进柏林噪声算法,以便沿着这个方向 曲线噪声将有一个首选的值范围(或 简单性,价值(0)
  • 或者,如果我有一个纹理是 柏林噪声算法(2d阵列)的输出,如何转换 是否达到所需的噪音(受曲线影响)
我如何改进柏林噪声算法,使噪声沿着这条曲线具有一个首选的值范围(或者,为了简单起见,值为0)

这可以通过一个简单的
p->f(p)
数学函数变换地图中的每个像素来实现

考虑一个函数,它将紫色线映射到蓝色曲线-它强调较低的定位高度以及非常高的定位高度,但使它们之间的过渡更陡峭(本例只是一个余弦函数,使曲线不太平滑将使变换更突出)

您也可以只使用曲线的下半部分,使峰值更尖锐,较低位置的区域更平坦(因此更可玩)

曲线的“锐度”可以通过功率(使效果更加生动)或平方根(减小效果)轻松调节

实现这一点实际上非常简单(特别是如果使用余弦函数),只需将函数应用于地图中的每个像素。如果函数在数学上不是那么简单,那么查找表就可以正常工作(表值之间使用三次插值,线性插值会产生伪影)

(从我的答复抄送至)

如果只需将生成的噪波转换为已知值范围(如-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]

您可以在该图上看到这种方法:


(我自己做的)

这正是我想要的!谢谢你的详尽和全面的回答!看起来是非常强大和灵活的解决方案。期待在我自己的项目中使用这些技术。