如何使用噪音产生不同的地形生物群系风格

本文关键字:生物群 风格 噪音 何使用 | 更新日期: 2023-09-27 18:13:27

我目前正在使用值噪声,我相信它被称为与分形布朗运动相结合,在3D环境中生成地形。我从噪声中生成一个2D高度图,其值范围在-1和+1之间。我通常只是将返回值乘以10左右来设置高度,这样就产生了起伏的丘陵。

我想做的是以某种方式组合对算法的调用,使一些地区非常丘陵,其他地区相当平坦,而有些地区几乎是山区。你如何在不让区域之间的边缘非常明显(比如突出的悬崖将它们分开)的情况下进行这样的操作?

编辑:这需要在近乎无限的环境中完全程序化。

根据ananthonline的回答,我将低频呼叫我的噪声发生器作为掩码。对于两种生物群落类型,我采用生物群落的"影响",减去掩模值的绝对值减去掩模上的"位置",然后再将整个值除以"影响"值。

(冲击- abs(Mask - Location))/冲击

这给了我一个值,当它为正值时,我可以乘以具有特定频率,振幅等(例如起伏的丘陵或山脉或海洋)的特定噪声呼叫的返回值。

这里的主要问题是,如果我的遮罩返回值为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个不同的生物群落一起做这件事,将需要一些极端的想法放入确切的"位置"answers"影响"值中,以确保混合是完美无瑕的。我宁愿用这样一种方式来编码,以确保它已经被处理好了。

如何使用噪音产生不同的地形生物群系风格

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

注意,你也可以手工绘制这个"混合"纹理,允许精细控制悬崖和平滑过渡区域(锐利的边缘vs模糊的边缘)。