繁体   English   中英

如何使用噪声生成各种地形生物群落样式

[英]How to use noise to generate varied terrain biome style

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

我想做的是以某种方式组合对算法的调用,以使某些区域非常丘陵,其他区域相当平坦,而有些区域则接近山区。 您如何进行这样的操作而区域之间没有明显的边缘(如将悬崖隔开的突起)?

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

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

(影响-Abs(遮罩-位置))/影响

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

这里的主要问题是,例如,如果我的面罩返回值0到1,则我需要(在两个生物群落场景中)将一个生物群落的位置设置为.25,将另一个生物群落的位置设置为.75,强度为.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个不同的生物群系来执行此操作,则需要考虑一些极端的想法才能将其准确地输入到“位置”和“影响”值中,从而确保混合无瑕。 我宁愿以某种方式对其进行编码,以确保已经处理完了。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM