Stochastic Geomophical Transport for Terrain Erosion Simulation
One major way to model terrain has been through simulating erosion: how the rock weathers away is a big component of the vibe of the landscape on a geological scale. But there's a couple of components to that: both the erosion itself and also where that material goes afterwards. In short, this new simulation from Nicholas McDonald and Guillaume Cordonnier handles both mountains and rivers.
(Another major way, of course, is Perlin Noise and related approaches, which eschew teleological realism but gain other benefits.)
The idea here is momentum conversation: using a new particle-based algorithm (which can be combined with other geological processes, like tectonics and wind direction) it simulates geomorphological transport, which operates over geological time, taking advantage of the difference in timescales: over the course of geologic time, a river is basically instantaneous.
This makes it very flexible for mixing "a wide variety of phenomena" as they say: in the paper they describe the potential for things like dunes, coastal erosion, floods, rockfalls, varying erosion weights. I particularly like how effective it is at effects like braided rivers and river deltas, which are very common in nature but often overlooked on procedurally-generated maps.
On the other hand, if the erosion is fast (individual rockslides) or transport is slow (glaciers) that breaks the assumption and it won't be as accurate at modeling it.
I think the reason that I'm personally drawn toward this algorithm is because it has a history that is naturally embedded in it.
You don't necessarily need to replicate the exact phenomena that was involved in creating something to get a good result. Much of games and simulation is about picking the right abstraction to get the right feel, regardless of how you get there. It's often the better call, to get the right poetry instead of the exhaustively correct metric. But one benefit that you do get replicate the physical causative process to try to simulate the physical effects of water, wind, and time is that it comes with a built-in sense of history.
Simulation creates its own history. In looking at the terrains produced through this method, you can see the paths of historical rivers, the canyons carved out over millennia and eons. All the details that humans find hard to capture just because of the sheer amount of subtle detail that builds up in tiny ways.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
ā Live Streamingā Interactive Chatā Private Showsā HD Qualityā Free Actions
Free to watch ⢠No registration required ⢠HD streaming
Everling Noise offers a significant advancement in procedural terrain generation by addressing the common performance bottleneck associated with traditional noise functions. The core innovation lies in Cassio Everlingās approach to achieving linear time complexity (O(n)) ā a critical factor for scaling terrains to massive sizes without experiencing crippling slowdowns. Previously, techniques likeā¦
The Terrifying Cave Generation of Minecraft Snapshot 21w06a
The Terrifying Cave Generation of Minecraft SnapshotĀ 21w06a
After a very long wait, weāve finally gotten to the ācavesā part of the Caves and Cliffs snapshots. This is very exciting for Minecraft, since a cave update has been both teased and desired for years. While Minecraftās original cave system is pretty cool, especially with canyons, Snapshot 21w06a threatens to completely demolish it. While only being the tip of the iceberg.
21w06a introduces theā¦
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
ā Live Streamingā Interactive Chatā Private Showsā HD Qualityā Free Actions
Free to watch ⢠No registration required ⢠HD streaming
The Terrifying Cave Generation of Minecraft Snapshot 21w06a
The Terrifying Cave Generation of Minecraft SnapshotĀ 21w06a
After a very long wait, weāve finally gotten to the ācavesā part of the Caves and Cliffs snapshots. This is very exciting for Minecraft, since a cave update has been both teased and desired for years. While Minecraftās original cave system is pretty cool, especially with canyons, Snapshot 21w06a threatens to completely demolish it. While only being the tip of the iceberg.
21w06a introduces theā¦
The Treachery of Rings- Escaping the consistency of Perlin Noise
Perlin noise is an algorithm very common in computer science- it is an algorithm designed to create maps of graduated floats that range between 0.0 and 1.0, maps that can be referenced by coordinate and thus used to add variety to textures, height maps, et cetera.
The primary advantage of algorithms like Perlin noise, simplex noise, et cetera, is that these variations can be achieved mathematically, rather than by a determinism based on a pre-existing state of input data besides the coordinates.Ā However, the true beauty of these maps is in the ability to use them as a basis for more sophisticated algorithms. Data ranges of these 0.0-1.0 floats can be used to place objects, modulate other values, and so on. However, when they are used as height map data, typically they are either takenĀ āas-isā and used to generate hills/islands or add subtle variety to manually-drawn maps.
Personally, I never liked to see it used to generate islands and hills. The problem I have with it is that, viewed from a macro level, Perlin noise is slightly too consistent.Ā
What bothers me most about naive implementations of Perlin Noise are what I callĀ āheight rings.ā In this image, you can see bands of slightly darker green that neighbor the higher green and the blue. This is the expected behavior of Perlin noise. Naturally, when you have variables that slowly graduate, they will pass into values that lie between the starting and ending values. In two dimensions, this creates theĀ āhillsā. This process, using the quasi-random behavior that makes Perlin noise work, creates hills at varying height, spacing, and slope.
So whatās my problem?
Well, the problem is that if one uses Perlin noise to generate landforms, then the landforms generated will not be naturalistic. Hills, viewed ostensibly, behave similarly to this when one compares a single hill in reality to a single hill in a Perlin noise map. However, the problem is that landforms in the real world do not consistently follow this pattern. This is especially true of continents, where the mountainous peaks usually stand to one side, rather than in the center, of the landmass(this is because of continental drift, where the tectonic plates rub against each other, pushing the Earthās crust upward at each plateās edges).
Often, Perlin Noise is implemented in such a way that it hasĀ āoctavesā of itself, where the variations are further varied by repeating the algorithm at a higher frequency and adding it to the previous result. This makes the resulting map more interesting to look at, but still not realistic.
So whatās our goal? We want to create a version of Perlin noise(or any other similar algorithm- What weāre about to do can be used just as well with Simplex or value noise, for instance) that allows values not only to graduate from one to the other, but can alsoĀ āskipā back down to a lower value- Essentially, creating cliffs. Cliffs that, like the hills, are determined mathematically.
So how do we do that? What we need is an extra dimension to this. We need another graduation of value, one that approaches either a āslopeā range or a ācliffā range.
The easiest way is through vectors.
Vectors are representations of directions on the number plane. In two dimensions, we have X and Y. Given each value pair of X and Y, one can extrapolate a direction. Using trigonometry, we get an angle in reference to angle 0, which most often lies on the positive X axis. This angle from a starting rotation can be considered in terms of ranging from 0 to 359. If it wraps across the top, it wraps back to the smaller value. 360 is equal to 0, 361 is equal to 1, et cetera. This is inversely true, as well: -1 is equal to 359.
So, because Perlin noise gives us values that graduate across a range, we can apply this range to an equal positive and negative value set. -1.0 and +1.0 will work just fine. If we do this twice with different modifiers, we can get a semirandom 2-dimensional vector. And if these values can each cross their range independent of each other, what we can get is a direction that can turn clockwise or counterclockwise freely withoutĀ ābouncingā off the boundary where the angle 0 crosses into angle 359. Instead, depending on the value of one dimension, the other dimension will either graduate cleanly over from 90 to 270, or cross from 270 to 359, wrap back to 0, and then graduate to 90.
If we then project this angle from degrees(or radians) back to a range of 0.0 to 1.0, we get a new map.
Here, we have replaced theĀ āhillsā of standard Perlin noise, which always move smoothly from 0.0 to 1.0 and back to 0.0, with a form that can move smoothly from 0.0 to 1.0, OR immediately drop back to 0.0. Thus we have create the basis for more varied landforms in terrain generation.
But we can do even better. Itās dramatic, but not realistic, for cliffs to drop at an angle of exactly 90 degrees, or at least to do so always. So letās pick a more reasonable shape for them.
We can translate our new 0.0-1.0 range onto a curve, getting any new graduation pattern we want. It simply uses our original pattern as aĀ ālandmarkā for changing the pattern. This is the result:
Picturing the brown areas as highlands and the white as mountain peaks, already weāre starting to see patterns that look a little moreĀ ācontinentalā than we could get with Perlin noise.
Now, letās re-introduce the octaves which added variety to Perlin:
The same patterns have been transformed- We now have coastlines that are either smooth or ragged, and mountain ranges that donāt necessarily sit in the center of their continents but instead to one side. We even have some very interesting-looking inland seas and archipelagoes.
Whatās even more exciting are further potential with this direction of change. For instance, using a third result from our Perlin function, we could add further variety, perhaps by interpolating our translation curve to different shapes. But I think this is a good place to stop for now.
In the run-up to starting my honors project, I want to prototype a few systems I have planned to be in the final game. This prototyping will aid me in making decisions about systems I develop for the final project, and will aid me in making sure everything is within scope.
I donāt want to give away too much about my final project yet, simply due to how early it is and how much it could change in between now and the start of it in January. One thing I can say however, is that iām going to have Hex Terrain in it. Ideally, Hex terrain that varies slightly from level to level. For this reason, my first system is going to be a quick prototype of some hex terrain gen.Ā
Inspirations for this terrain comes from The Lab archery minigame, which iāve been playing religiously since I purchased a Vive. The way the toy-ish landscape resembles a board game, whilst still being fun and immersive in VR, really inspires me to create something like this for my project.
To start off, I modeled a very simple Hexagonal Prism in Blender, then imported it over into Unity to start messing around with placement. I found thisĀ really helpful article on Hexagonal Geometry and Coordinate systems, written by Red Blob Games, a really helpful source for this sort of thing. I used Axial Coordinates to make my first script, which makes Hexagons out of Hexagons.
It seemed logical to start with making the shape out of little shapes, along with a little slider that would change the Hexagonās radius. This worked really well, and taught me a lot about the positioning and displacement between the elements to make up the shape. Whilst doing this, I also realized Iām essentially placing navigable nodes, meaning implementing A* Path finding algorithms later on will be a breeze.
The next step was to add a bit of random-ness to the shape, to make it resemble more of a land mass. I did this simply by having a random chance that the generation will create another node after finishing a line, and then having an even lower chance that it will also place another afterwards.
Of course these generation decisions could be a lot more informed, however for now it really served as a proof of concept for what could be achieved with the shape.
My next step is to try out more of a rectangular-based shape, rather than a hexagonal shape. This will get me closer to making the board-game-like feel Iām going for, and will also allow for me to mess around with some more interesting land formations, like rivers, valleys and mountains.
On-top of prototyping this terrain system, Iām also completely remaking my portfolio, and hope to have that up again working soon!