Making Realistic Terrain for Fantasy Maps
Why Bother with Fantasy Terrain?
I love topography. It is dynamic, complex. High mountains drop down into plains split by gulleys before crumpling into hills. It flows and morphs. No two points are exactly the same. Most fantasy maps do not show realistic terrain, but instead use abstractions like stamps to add features to a map.
There is nothing wrong with this. I want to say that again because it is that important:
There is no wrong way to make a map, as long as it fits the audience.
Stamps give a wonderful old-fashioned artistic flair to a map, and they show different types of terrain in a clear, easy to read way. However, real terrain does not look like this. So what if we want to give our fantasy maps the look of real topography? Well it is complicated, because a stamp can be as easy as drawing in a triangle for a mountain, but you cannot do that for realistic topography.
Nor, is it easier to draw a realistic relief by hand, as is often done for real landscapes. We have elevation data for earth. That source already exists, but for a fantasy map there is nothing except what you provide with your own imagination. Drawing relief like the above without having a existing reference would be nightmarish, to say nothing of the actual time involved. One solution to making realistic topography for a fantasy map is making elevation data first, and letting the computer handle the rest.
Making a ‘Fake’ DEM
All digital terrain starts with a DEM (Digital Elevation Model – where each pixel represents a specific height). Because a DEM is a greyscale raster, it is surprisingly straightforward to make one. You could draw a DEM in Microsoft Paint even, though it would not look very realistic. It is much easier to make one out of several real DEMs blended together.
The first step is downloading this data. I grabbed some elevation data from GMTED (you can get it here). Does not have to be of a particular place, the goal is to get a lot of stuff to work with and pare it down later. I got a tile from South America around southeastern Brazil, western India, and part of the Sakha Republic in Siberia (Russia). As I have said before, you can make any area unrecognizable, but I also enjoy going for more obscure terrain (if you are from the US or Europe of course) to begin with just to make it as fresh and exciting as possible.
You then want to decide what scale your eventual fantasy map will be at. The same features can look very different at different scales and you want your data to look consistent, just like real terrain would. For my example map, I am aiming for a area about the size of western Europe, so I will be working at 10,000,000km (rounded to make things easier). I am sure there is a better way to do this, but currently I export snippets of each tile as .tif files at that scale through the layout tool in ArcGIS Pro (400 dpi).
This leaves you with what is essentially a bunch of 8bit rasters, which might be a lot less than your original DEM, but you are going to be hacking at them like Frankenstein later on anyways. Ideally I hope to work out how to export at the original bit depth of the DEM, modify in that bit depth, and then make the finished DEM at that same bit depth, but you can still get good results with my current workflow. One trick that works anytime you are worried about coarse data, is to work at a much larger scale than your final image.
I drop all these images into a empty Photoshop .psd file, and layer them together. It is hard to describe this section without sounding like “step 2. draw the owl”.
What you are doing here is a lot like making a photo mosaic or rearranging puzzle pieces. You are taking existing shapes and moving them around to form something new. Here you are just going to grab whatever interests you, say a mountain range, and slap it somewhere else to make a new landscape. You can smash things together at random, or try and match geologically related landforms in plausible ways. It is entirely up to you. Fantasy landscapes do not have to follow real-world rules after all.
Something to remember here, is that light and dark does not mean just that, it also translates to elevation in your final DEM. So you can use the dodge and burn tools to level a landscape, or create mountains out of nothing. I also like using the clone stamper and soft brushes (in Photoshop). Generally, my workflow for any particular area is to find something I like, move it with selection tools, and then blend it into surrounding areas.
You also want to decide what sort of landscape you want to end up with. I want to make a island, so it has to have lower areas all around it so I can later generate where the waterline would be. I also want some mountains in it, because mountains are pretty (do we need a better reason)?
I started with this area, one of the several views I clipped of northeastern Siberia and started drawing it in with the clone stamp tool:
I can already see a interesting shape forming here. There is a natural bay here, and maybe some potential coasts in other places. I am going to start to add in some other features by switching to sampling from the view of India (01_Export) and another view of Siberia ((03_Export) – I rotated this 90° degrees too) and covering up some areas.
Because India is mostly lower elevation than this part of Siberia, blending them together is going to have the effect of making areas lower in elevation. This will help further refine our coastlines. As I move into blending terrain together, I turned the opacity of my clone stamp brush down. It is always better to work slowly, building in layers than smushing together different DEMs at full opacity.
This is pretty good. I continued to refine the coastlines, and blurred it to try and knock out any residual hard edges that the clone stamp tool picked up.
Projecting your DEM
This is where things can get complicated. You can use this DEM as-is for lots of purposes, but if you want to fully harness GIS software you are going to have to project it. For technical purposes, this DEM is just a picture. It needs to fit a real ‘space’ to work properly with tools like a hillshade, slope, or even stream direction and flow (thats right: you can calculate rivers for fantasy terrain too). I use ArcGIS Pro, so that is what I will use here but like most GIS tutorials, the overall principles apply across software.
If you drag and drop your DEM .tif file into Pro, you will get this message:
Pro looked at your .tif file and could not figure out where to place it on the map, so it drops it at 0, which in the default Pro projection (Mercator), is a tiny spot just off the shore of Nigeria. This also means we cannot use the project raster tool, because to project a raster you technically need to know what projection it is already in. Instead we define the projection. You are telling Pro what projection the image is in. We are lying to the computer (humanity 1, terminator 0).
(note: ArcGIS Pro modifies the original file when it defines the projection, so I made a copy of it first)
I also used a trick here I learned a few years ago. Instead of assigning to a ‘real’ projection, I make a dummy one:
Then I have the tool set up, and I run it:
If all works out, you will get a larger image:
When I was working this out for the first time, I felt a chilling wave down my spine when I worried that scale might matter. After all, we were using data at a much higher scale than the maps extent here. However, a hillshade works just as well at 1:000 as 1:100k scale. The issue here is not whether or not the scale in the software matches our reference data or our final map, but whether or not its projected – full stop.
You might have issues with running it through hillshades though. This error crops up about half the time I make a fantasy DEM:
Error messages can be infuriatingly ambiguous. This one spells the problem out about halfway. If you check the DEM we are working with so far, it is actually 3 bands. The easiest way to yank one band out is to use the ‘Make Raster Layer’ tool, which creates a temporary raster meant as a middle-man file for other tools (perfect for us). What band you choose does not matter, since unlike say, a Landsat image where each band contains meaningfully different information here they all contain the same value (elevation).
With this file, you can run it through a hillshade tool but it is going to look really weird:
This error is related to the ‘z-factor’ of the raster, which measures vertical change itself (to simplify). You can easily fix this by using the Project Raster tool, setting your projection to whatever your map is in, and then running Hillshade again:
This may look just as broken but in the opposite direction. Yet, if you stretch the raster you can see the tool worked perfectly (zoomed in):
Finishing the Map
With your projected DEM, you can do whatever you want to this map like it was real terrain. A good start is extracting and vectorizing elevations below a certain point to get realistic coastlines:
I messed around and ended up with this map:
I am not going to tell you how to make the map itself. This tutorial is about getting you to the best step 1, and then letting you go free from there. The beauty about going through this workflow, is that you can do anything with your new data that you would do with real terrain. You can run calculations with your DEM (but be careful that you do not over-interpret the results since it does not necessarily follow the rules of real terrain), or even make other datasets based off of it. Just like real spatial data, you can even take your fantasy map online.
Imagine running a game of Dungeons and Dragons through a custom Mapbox app, or a Story Map taking someone through a 3D model of Middle Earth. Anything is possible!
You have created this world through data. It is real in a sense, and opens up a world of possibilities beyond even the greatest static drawn or painted map. There is a lot I still want to learn to help refine this workflow, but I hope this tutorial inspires people to experiment for themselves anyways. Together we will make the world of GIS just a bit more magical.
Many thanks to Tom Howell for inspiring this tutorial.