Workflow combining manual-defined geographical regions with different procedural terrain types?

Hi,

I’m working on a fictional landscape in World Machine which will eventually be used in Unreal Engine. It’s a terrain measuring 16 x 16 km, and I want to recreate a specific geography rather than generate a generic procedural landscape.

The landscape is a coastal region with a bay and a sea inlet reaching some distance inland. The coast and inlet are flanked by a mountains around 2 km high, and at one side there’s a very high single prominent mountain peak reaching around 6.4 km with surrounding relief leading up to it.
Here’s the map drawn on the heightmap export from Unreal:

(The geographical layout of the terrain I already had in Unreal, which I’m using as a reference for the new terrain)

I have created a Shapes map defining the large-scale elements. The scene contains these distinct geographical elements:

  • sea floor -100 - 0 m
  • low/coastal terrain 0 - 150 m
  • hills 150 - 300 m
  • coastal mountain range up to ~ 2000 m heigh
  • mountains leading towards the high peak ~ 3000 m
  • the single high peak up to ~ 6400 m

What I’m trying to achieve is for these regions to have different procedural terrain characteristics, while still blending naturally into one continuous terrain.

I started from the Coastal Mountains 2 example, since its structure seemed quite close to what I need. It uses a Shapes guide and a Multi Chooser to select between several terrain inputs.

(The geographical regions I have defined in a Shapes device)

While experimenting with this, I discovered that the Multi Chooser’s guide values determine which terrain input contributes, independently of the actual height ranges of those terrain inputs. I also experimented with Rescale devices to give the different terrain inputs different elevation ranges.

(The Multichooser device preview, showing the geographical selection, with the existing heightmap overlaid for reference)

This works mechanically, but I’ve had difficulty getting the resulting terrain to retain the character and relief of the individual terrain generators. In particular, some combinations produce rather artificial raised or terraced forms instead of natural-looking terrain transitions.

(experimental result using the terrain generator and Multi Chooser. The broad geographical regions are present, but the resulting terrain develops pronounced raised/terraced forms rather than the continuous mountain relief I’m aiming for)

I then came across Tutorial 8, Selectors, Layers, Masks, which demonstrates using selectors/masks to define regions and then compositing different results with a Layers device.

This made me wonder whether Layers might be the more appropriate workflow when the things being combined are heightfields rather than colours or textures.

So my question is:

What would be the recommended World Machine workflow for this kind of terrain?

Would you normally:

  1. use Shapes/Selectors to define the geographical regions,
  2. generate each terrain type separately,
  3. combine the resulting heightfields with Layers/Heightblend,

or is the Multi Chooser / Height Chooser approach more appropriate?

I’m particularly interested in hearing from people who have used World Machine to create a deliberately designed geography with several distinct terrain types, rather than generating a procedural landscape.

Thanks in advance for any advice! I’m particularly interested in whether I’m using the right general approach here, rather than in troubleshooting the particular settings of this one example.


(screenshot from the project in Unreal Engine 5.7. The mountains in this setup are static “backdrop” meshes that are not part of the terrain itself - they look OK from a large distance, but the illusion breaks doen when approaching them - I want to make the mountains part of the actual terrain, and that’s what I want to achieve in World Machine now)

4 Likes

Hi there! I’ve used a few different methods to do this sort of thing in the past, but I’ll give a sort of general breakdown on two specific projects that I think gave me a lot of useful info.

The first was a commission where someone wanted a heightmap for a real world location for which no GIS data existed. To add difficulty, the area was a place the client was from, so they were intimately familiar with the landscape and were seeking a high degree of accuracy.

The second project was a personal one, where I was taking a fantasy map that I’d drawn, like, Tolkien-style, and translating it to a heightmap so I could do a few different styles of render with it.

I took a different approach to recreating the terrain in each project. This will, by no means, be, like, a tutorial on how to achieve your specific goal, but I think hearing how other people think about the process and approach it can be super useful!

Real World Location

For this project, I started sort of similarly to how you have here, using the Shapes device to carve out the general contours of the terrain. In my case, I made sure that the general elevations were correct for what I was going for, rather than just the shapes, I don’t know if you’ve done the same in yours, but that does affect the next steps.

From there, to get some surface detail, I plugged the the output of the Shapes device into both the Shaping Guide and the Mask Input of an Advanced Perlin device, adjusting the parameters until the rough surface details matched the look I was going for.

For some additional detail, I plugged a separate Advanced Perlin into the Distortion Input of the Advanced Perlin the Shapes device was plugged into, and, once again, tuned to taste.

After that, it was just a Curves device to bring back some lost elevation, and I had something that I could really sink my teeth into working on.

Now, for this project, the landscape was fairly simple, it was a sort of rocky outcrop into the ocean, so there were only really 3 distinct terrain types (Exposed rock, a small strip of beach at the shore, and then ocean), so getting the silhouette and general contours correct was more important than blending different terrain types. Still, it’s a good place to start, especially since, with just 4 devices, you can take something that is pretty boring and more of just a general guideline, and turn it into something that can very easily be worked into something realistic.

Here’s a quick example I whipped up while typing this, with the Shapes device on the left and the Curves device on the right.

Combine a Height Selector and some filtering on the lower elevations to smooth them out a bit, maybe an Expander set to minimize on the high peak to sharpen it up, hit it all with some Thermal Erosion and general Erosion, and you’ve got yourself something that could absolutely work with very little effort!

2 Likes

Breaking into a second reply because apparently Chrome decided I was done with the first.

Fantasy Map

For this one, I took a different approach entirely, more similar to the Multi Chooser approach you talked about. For this one, I had the sort of general shape of the land, an idea of where mountain ranges were, but no specific idea on elevations.

As above, I started with a Shapes device, this time dialing in relative elevations rather than specific ones (eg, “I want this part to be higher than that part, but this area here should have an even higher peak”), and then also plugging the resulting general shape into an Equalizer device to ensure that it covered the entire available dynamic range (tuning the heights of the Shapes simultaneously to make sure that the Equalization didn’t break the relationships I’d built up).

From there, I brought the Equalized terrain into the Multi Chooser as the Control Input and set the number of inputs to a value that matched how many different sort of height “zones” I wanted. This project was continent-scale, so I went with relatively few, I think 4? A coastal zone, general lowlands, general highlands, and alpine. Further tuning would be done later with specific masks.

For the inputs, I was using Basic Noise devices for quick tuning. Coastal areas got very large, low persistence Billowy noise, lowlands similar but with a smaller noise to get more variation in the hills, highlands started moving into the Basic noise pattern, and then fully alpine got Ridged.

One big thing I’ve learned, especially for getting smooth transitions between zones is that, especially in the transition zones, you want the lower elevation noise to get pretty close in height to the next zone’s elevation in the control input, but you also want to be very intentional in general with the noise pattern for lower zones having their elevation go into the next elevation zone’s height section, if that makes sense? In general, you want to be making sure that the average height of the noise pattern for each zone “fits” within its zone, or you start getting very harsh transitions. Also, don’t ignore or neglect the Transition Contrast settings for the Multi Chooser.

Once I’d gotten the basic layout tuned within the Multi Chooser it was back to the normal workflow of just tuning the level of detail, using filter devices to sharpen, smooth, increase contrast, etc until I had something that both fit the shape I set out to create and looked viable for the Thermal Erosion and/or Erosion process.

For this project, I also did some large scale Create Water devices, a couple for lakes, and one for defining a general river system for the continent. This was to help drive/inform the later Erosion, since this was a continent-scale project, but that’s a bit project specific.

Starting with the same Shapes device as the last example, this is where I ended up with the Multi Chooser approach.

Another good way to get some extra detail here is to tune the individual noise patterns before bringing them into the Multi Chooser, you get a lot finer control of the final details of each zone.

Summary

For the most part, in both approaches, my main goal is always to get from a smooth Shapes device to something that has enough detail for further processing, which is why the process sort of looks the same for both after a certain point.

3 Likes

Hi Blattacker, thank you for your reply :+1: !
Your result looks promising, I’ll see if I can set something like that up!

I’m just curious if you think it would be worthwhile looking into the Layers device as well? I wonder if it would work better to generate the different types of terrain separately, and assembling them using height blending and masks.

As I did it now with the Shapes / Multichooser setup - essentially encoding the terrain types in different heights, and then assigning different Perlin → rescale routes to each of those - felt a little bit complicated, though it seemed to work well on the included Coastal Mountains example.

1 Like

I’ve definitely used the Layers device in that way before, but I have found it to be significantly more finicky.

Ultimately, though, the best advice I can give is to just experiment! If you think something is worth trying, try it! There is no “right” way to do anything in creative software, whatever works best for your brain, your workflow, and your project is going to be the correct thing.

2 Likes

Here’s the difference between the Multichooser and a Layers/Chooser cascade.

The difference is that a Multichooser assigns each of the inputs to a part of the guide map. In your world, you might be defining a progression of:

Canyons → Deserts → Highlands → Mountains

for example. That progression will always be present in that order from your guide map no matter how you draw it.

If you can live with that limitation, it will make your life easier! It means that for example, you only have to make sure that the elevation ranges of each one match the next in the series using Clamps as you discovered. So you tune your Canyons to work well with Deserts, which work well with Highlands, etc.

Using a chain of Choosers or a Layer device, you can indepently place each biome type. This is more flexible and powerful! But: if for example, you place the Mountains biome right next to both the Canyons and also Highlands in that progression above, somehow you have to make it look good relative to both in terms of the elevation bands they occupy.

I would stick with the Multichooser to define your basic terrain if you can.

3 Likes

Thank you Blattacker and Stephen, this clarifies the process significantly! I’ll post it here if I have a working setup :+1:

1 Like

I tried again with the multichooser, and I can get it to work to a degree but keep running into problems. After a lot of testing I think I have an idea what’s happening. I have a fair number of different terrain types:

  • Sea floor -100 - 0 m
  • Coastal terrain 0 - 150 m
  • Lower hills 150 - 350 m
  • Higher hills 350 - 1000 m
  • Coastal mountains 1000 - 2200 m
  • High mountains 2200 - 3800 m
  • That one high peak 3800 - 6400 m

For each of those I defined the necessary shape element in the shapes device that guides the multichooser (as in the Coastal Mountains 2 example); set the number of inputs to 7, and after some testing found that the multichooser indeed creates equally distributed height bands (using the “equal space” setting). So, taking the total range of -100 - 6400 m, I calculated the center value of each of those bands and set the shape elements to that height.

So far, so good. But as Stephen indicates above:

The problems arise in places where different height regimes meet and merge in the shapes device. The height field from the shapes device is continuous, so when a shape from channel #3 sits next to one from channel #6 and they have some overlap, there will always be an area where the height field passes through the intermediary channels 4 and 5, and the multichooser will pull input from the corresponding generator channels.

And that gives some strange results, like channels going to sea level where two shapes meet. When I analyse such issues I can sort of understand what the problem is, but that doesn’t really help, because I cannot avoid such larger channel differences sitting close to one another. The terrain has a lot of height variation in a relatively small area.

So instead of wrestling with the selection logic of the multichooser I tried using the layers device instead, merging the heightfields from the various channels:

Shape defining form and height of a landscape element → generator → rescale → layers

… times seven. And this works right away.

I think what made the multichooser setup so hard to handle in my case was that the shapes were used in two functions: 1) to drive the multichooser (shapes must sit in the center of their height band); and 2) to direct & mask the generator (shapes must be the same “shape” but instead have their intended height instead of the height band center). This was also becoming conceptually a bit of a pain to grasp, while keeping the shapes synchronised and the rescale / clamp values from causing issues.

So the layers approach seems to work better. I’ll post it when I have the whole thing set up.