簡體   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