Climate based Biomes

Aim of this project was to find a simple method to generate convincingly distributed biomes on a procedurally generated world map that can be used for global strategy games.

In nature, a biome is a collection of biotic organisms in a certain region defined by its climatic conditions. In strategy games, it’s basically a categorized composition of terrain features like elevation, temperature and precipitation. There are many ways to generate these features, but the commonly used noise based algorithms tend to suffer from redundancy and recurring patterns. Incorporating essential principles of Earth’s climate into the procedural generation process can overcome this problem and improve the realism of the resulting world maps.

Video

Details

Developer: Thomas Würstle
Mentor: Daniel Scherzer
Year: 2016

C++ Cinder OpenGL ImGui

7 thoughts on “Climate based Biomes

  1. I’m trying to replicate the circulation map, but you don’t mention how the air density map, air pressure map, and wind flow map are produced.

    “Air density is estimated based on equator distance and temperature” – How exactly? The reference image you point to (figure 32) doesn’t mention air density, only air pressure.

    “Air pressure is computed on a per pixel basis by evaluating the difference in air density” – Do you mean that air pressure = difference in intensity between neighbouring air density pixels? Becuase this way tends to create very weak intensity pressure maps, unless the air density map is *very* turbulent.

    “Differences in air pressure are then used to determine wind directions and speed” – How? This is the most important step, I believe. Calculating a 2d direction and speed from a single float value pixel is no straightforward task.

    Could you post more code snippets to explain the process? Or alternatively, could you post the source code? I’ve been trying to replicate your process for days now, but I feel there’s just too little information to go on. Thankful for any help.

    1. I only do a rough estimation of air density according to Earth’s pressure zones by using a cosine with three periods along the vertical axis of the map (similar to the estimated base moisture) and let it fluctuate with inverted temperature.

      Then I calculate pressure by comparing the density delta between the surrounding pixels in multiple octaves: first the directly adjacent pixels, then those with distance two, four, … (seven octaves total, each time reducing the influence by half).

      After combining the horizontal and vertical deltas, I simply use the resulting vector as wind direction and its length as wind speed.

      I didn’t release the source since it’s not cleaned up. I’m currently working in a research group that is subsidized with public money. We are working on procedural generation including climate approximation. Therefore, an improved version of this will be released open source eventually, but I can’t tell you when this will happen.

      1. Hi again, thanks for mentioning fluctuating the pressure map with inverted temperature, that turned out to be the missing piece of the puzzle!

        However, I’m quite confused as to how exactly the convection process in your humidity map works. I assume you mean to compare two pixels (any pixel, and the pixel his wind vector points to), and then blend their humidity values to their shared average.
        This produces a pretty watercolor-esque effect like seen in your example pictures, but only at short ranges in areas with big humidity differences (coasts, mainly). So in my experiment, central Africa remains as dry as the initial evapotranspiration map, even after 60+ iterations. (example pic: https://puu.sh/yGZWb/7b6d671d54.png)
        This is becuase the effectiveness of the average-blending effect quickly drops the further inland you go. I can circumvent this by multiplying the wind speeds of the circulation map to rather large values, but this would let wet air easily travel over mountain ranges. (Example pic using 8x wind strength: https://puu.sh/yH0Vk/2453d971c8.png)

        Speaking of mountain ranges, I’m also confused about your creation and implementation of the orographic effect. Reading your document, it seems to me that the orographic effect is calculated *during* the humidity iterations, but only used in the final precipitation map. So I understand it as the orographic effect has no direct influence on the creation of the humidity map, which seems strange to me.
        Furthermore, what is the “vec3 elevation_gradient” described in the document? I don’t see it mentioned anywhere else, and I’m deeply confused as to what it means and how to create it.

        I should add that I’ve tried many other algorithms to try and create a nice humidity/rainfall map, but most of them create too turbulent results to be of use.

        PS: Good luck on the open-source project!

        1. The humidity distribution isn’t a full-fledged simulation. It’s based on an estimation of global moisture (see listing 6). The convection process only distributes it a bit.

          Initially, I computed the humidity distribution first and used the result to determine precipitation. The orographic effect was applied twice: During the humidity distribution, it would reduce the amount of humidity that is conveyed further and then for the precipitation determination, it would increase the precipitation intensity.

          Later I combined humidity and precipitation calculations: Code Snippet

          I’m afraid the elevation gradient should actually be the surface normal and the two dimensional part is missing normalization.

Leave a Reply to tenjix Cancel reply

Your email address will not be published. Required fields are marked *