Answers:
假设您想要一个实际上平坦的地形,我建议您退后基于噪声的答案,并了解它们的来源。“噪声”信号本质上是无数个振幅随机的正弦波之和,给定频率下的“平均”振幅是频率f的函数。您可以通过这种方式获得大多数常见的“噪声”定义。例如,布朗运动具有1 / f ^ 2频率响应(即,给定频率下的平均幅度与频率的平方成反比):这意味着附近的点之间存在相当大的相关性,因为信号的高频分量很大阻尼。相比之下,经典的分形噪声(中点位移,Perlin噪声等)具有1 / f频率响应。附近的点之间存在更多方差,但仍具有相当大的相关性。更进一步,白噪声具有恒定的频率响应-任何一点之间都没有任何关联。
你这有什么好处?好吧,您只需将少数正弦波求和,但要确保它们在任何给定频率下具有适当的幅度,就可以获得一个看上去有些嘈杂的平滑信号。您希望频率是“随机的”,这样它们中的任何两个都不会有一个共同的倍数(否则,您将获得一个与丘陵总体形状有关的周期性分量),所以我建议采取以下步骤(完成与工作示例):
这是我的示例运行的结果,如Wolfram Alpha中所示-请注意,它固定了其图形的大小以用于显示,但是您应该通过我上面提到的常量对结果的水平和垂直范围进行充分控制:
您可以使用噪声函数生成随机高度。它们中最简单的是值噪声,其作用与您的描述完全相同:生成一些随机整数高度,然后进行插值在它们之间高度。最常用的插值方法是三次S曲线映射:
假设您的高度h0
为point x0
,高度h1
为point x1
。然后,要获取任意点x
(x0<=x<=x1
)的高度,请使用
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
用这种方法获得的高度将是平滑的,随机的,但并不是很有趣。为了使您的地形更好,可以使用分形噪声。它的工作方式如下:假设您已经生成了一个函数h(x)
,该函数返回给定坐标处的高度(使用上述方法)。此功能具有一个频率,该频率由原始整数高度的频率确定。为了从中产生分形,可以将具有多个频率的函数组合在一起:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
在此示例中,我组合了四个频率-原始频率,两倍,4倍和8倍原始频率,较高的频率赋予了较少的权重。从理论上讲,分形一直延伸到无穷大,但实际上只需要几个术语。的fbm
式中的代表分数布朗运动-这是该功能的名称。
这是一项强大的技术。您可以使用倍频器,使用不同频率的权重,或添加一些功能来使噪声失真。例如,要获得更多的“山脊”感觉,h(x)
可以将其更改为1-abs(h(x))
(假设-1<=h(x)<=1
)
但是,尽管所有这些都很好,但是该技术存在严重的局限性。使用基于“高度线”的方法,永远不会出现地形“悬垂”。而且我认为它们在类似“月球越野车”的游戏中会是一个非常不错的功能。
添加漂亮的突出部分是一项艰巨的任务。我能想到的一件事-您可以从分形的“高度线”开始,然后将其“细分”为一系列的样条曲线或贝塞尔曲线。然后,地形线将由几个“关键点”定义。对这些关键点施加一些抖动-这将导致地形随机变形,可能会形成一些有趣的形状。但是,这种方法可能会引起地形自相交的问题,特别是在抖动量较高的情况下。