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

时间:2013-05-14 20:18:03

标签: c# xna noise terrain procedural-generation

我目前正在使用价值噪音我相信它与分形布朗运动相结合,可以在3D环境中生成地形。我根据噪声生成2D高度图,其值介于-1和+1之间。我通常只是将该返回值乘以10左右来设置高度并生成连绵起伏的山丘。

我想要做的是以某种方式将调用与算法结合起来使某些区域非常寒冷,其他区域非常平坦,而有些区域几乎是山区。如果没有区域之间的边缘非常明显(如突出悬崖隔离它们),你怎么做这样的事情?

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

根据ananthonline的回答,我正在低频率调用我的噪音发生器作为掩码。对于两种生物群系类型,我采用生物群系的“影响”,减去掩码值的绝对值减去掩码上的“位置”,并再次将整个值除以“影响”值。

(Impact- abs(面具 - 位置))/影响

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

这里的主要问题是,如果我的掩码返回0到1的值作为示例,我需要(在两个生物群系场景中)将一个生物群系的位置设置为.25,另一个设置为.75,具有强度每个.5他们适当地混合在一起。至少,如果我想要均匀分布每种生物群系类型并将它们正确地混合在一起。如果我想要山脉出现的次数是连绵起伏的山峰的两倍,我会挣扎很多。

我希望这是有道理的。数学运算非常出色,但我当然不认为我用有限的数学背景和知识来解释它。也许一些代码会有所帮助(如果我的cruddy未注释的代码对某人意味着什么),请注意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个不同的生物群系需要一些极端的想法被放入确切的“位置”和“影响”值,所以要确保混合完美无瑕。我宁愿用这样的方式对它进行编码,以确保已经处理好了。

1 个答案:

答案 0 :(得分:2)

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

请注意,您也可以手工绘制这种“混合”纹理,允许精确控制悬崖与平滑过渡区域(锐化边缘与模糊边缘)。