【问题标题】:How to use noise to generate varied terrain biome style如何使用噪声来生成不同的地形生物群系风格
【发布时间】:2013-05-09 06:14:42
【问题描述】:

我目前正在使用值噪声,我相信它与分形布朗运动结合使用以在 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 个不同的生物群系进行此操作,需要对确切的“位置”和“影响”值进行一些极端的考虑,因此请确保混合完美无瑕。我宁愿以这样的方式对其进行编码,以确保已经处理好了。

【问题讨论】:

    标签: c# xna noise terrain procedural-generation


    【解决方案1】:

    如何在比地形纹理 1/8 或更小的纹理中生成低频噪声(白黑),将其模糊,然后将其用作遮罩将两个高度图混合在一起(可能作为渲染算法本身)?

    请注意,您也可以手动绘制这种“混合”纹理,从而可以精细控制悬崖与平滑过渡区域(更清晰的边缘与模糊的边缘)。

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多