我目前正在使用值噪声,我相信它与分形布朗运动结合使用以在 3D 环境中生成地形。我从噪声中生成了一个 2D 高度图,其值介于 -1 和 +1 之间。我通常只是将该返回值乘以 10 左右来设置高度并生成连绵起伏的丘陵。
我想做的是以某种方式结合对算法的调用,使某些区域非常丘陵,其他区域非常平坦,而有些则几乎是山区。如果区域之间的边缘非常明显(比如突出的悬崖将它们隔离开来),你如何处理这样的事情?
编辑:这需要在近乎无限的环境中完全程序化。
根据 ananthonline 的回答,我正在对我的噪声发生器进行低频调用作为掩码。对于两种生物群系类型,我取生物群系的“影响”,减去掩码值的绝对值减去掩码上的“位置”,然后再将整个值除以“影响”值。
(Impact- abs(Mask - Location))/Impact
这给了我一个值,当为正时,我可以乘以具有特定频率、幅度等(例如连绵起伏的丘陵或山脉或海洋)的特定噪声调用的返回值。
这里的主要问题是,如果我的掩码返回值 0 到 1 作为示例,我需要(在两个生物群落场景中)将一个生物群落的位置设置为 0.25,另一个设置为 0.75,强度为 0.5每个都让他们正确地融合在一起。至少,如果我想要均匀分布每种生物群落类型并将它们正确地混合在一起。如果我想让山脉出现的频率是连绵起伏的丘陵的两倍,我会很努力。
我这样做希望这是有道理的。数学计算得非常好,但我当然不认为我用我有限的数学背景和知识来解释它。也许一些代码会有所帮助(如果我粗鲁的未注释代码对某人意味着什么),请注意 GetNoise2d 返回的值介于 0 和 1 之间:
float GetHeight(float X, float Z)
{
float fRollingHills_Location = .25f, fRollingHills_Impact = .5f, fRollingHills = 0;
float fMountains_Location = .75f, fMountains_Impact = .5f, fMountains = 0;
float fMask = GetNoise2d(0, X, Z, 2, .01f, .5f, false, false);
float fRollingHills_Strength = (fRollingHills_Impact - Math.Abs(fMask - fRollingHills_Location)) / fRollingHills_Impact;
float fMountains_Strength = (fMountains_Impact - Math.Abs(fMask - fMountains_Location)) / fMountains_Impact;
if (fRollingHills_Strength > 0)
fRollingHills = fRollingHills_Strength * (GetNoise2d(0, X, Z, 2, .05f, .5f, false, false) * 10f + 25f);
if (fMountains_Strength > 0)
fMountains = fMountains_Strength * (GetNoise2d(0, X, Z, 2, .1f, .5f, false, false) * 25f + 10f);
return fRollingHills + fMountains;
}
如果需要指定上述代码的问题,那么假设使用 10 个不同的生物群系来执行此操作将需要一些极端的想法来考虑确切的“位置”和“影响”值,以确保混合完美无瑕. 我宁愿以这样的方式对其进行编码,以确保已经处理好了。