Submitted by
Gard on Tue, 2003-11-04 02:34.
Half-Life
Creating Environment Maps With Terragen - Mithodiel
Preface:
This tutorial consists of two parts.
In Part I, we explain exactly what an environment map otherwise known
as a "sky" is, and what it is used for in a Half-Life level. Then in
Part II, we discuss how to make an environment map using Terragen.
Experienced mappers who already
understand how a Quake-engine environment map works can skip Part I.
The rest of us should start with Part I.
Part I: What Is an Environment Map?
An environment map is
used in a Half-Life level to provide the the player with the illusion
of being in an outdoor environment. Confining ourselves to the walls of
some building would become quite boring after a while, but "rooms"
(that is, areas enclosed by brushes) are the only player-space areas
that the game engine understands. So, rather than forcing the player to
be indoors all of the time, we use special brushes (sky brushes,
covered all over with the SKY texture) wherever the player is capable
of viewing the sky outdoors. The game engine paints sky brushes with
special graphics that provide the illusion of being contained in a 3D
outdoor environment. The whole idea is to convince the player that he
or she is not simply contained inside some big box. :)
That said, let's get a bit more technical. An environment map takes
the form of a hollow cube. The "outdoors" panorama is then painted on
this cube so that it appears to be continuous in every direction, as
far as the eye can see. Confused yet? What if I told you that the sky
was the projection of a spherical picture on the environment cube? Oh
well, no matter. For our purposes, it's not all that important anyway.
Environment Maps In Half-Life
Since the "outdoors" is painted on a cube, this implies that there
are six separate graphics that make up the sky, each of them the same
size. In Half-Life, each environment map consists of six 256x256
graphics that make up the sky. The images are named skynamert (right), skynameft (front), skynamelf (left), skynamebk (back), skynameup (up), and skynamedn(down), where skyname
is the name of the sky that you are creating. You must store your sky
graphics in two formats: 8-bit uncompressed BMP (for those without 3D
accelerators) and 24-bit compressed TGA (for those with 3D
accelerators).
Hmmm. Perhaps a picture of an unfolded skybox would help:
Wherever two sides of the skybox meet, you must take care to make
the graphics blend together seamlessly. These sides are denoted by
colored bars in the picture -- sides that touch are banded in the same
color. If you do not take care to match them up properly, then you will
see a seam in the game where the sides of the sky meet, and the player
will realize that they are caught inside some big box. That is a Bad
Thing.
Part II: Using Terragen to Make an Environment Map
Now that we understand the concept of an environment map, I can explain how to actually go about making one.
Matt Fairclough has developed a nifty program called Terragen
that generates photo-realistic terrain images. These terrain images can
include lighting, fogging, and other atmospheric effects. Of course,
there are other programs out there that can do the same thing. (Bryce
and 3D Studio MAX come to mind.) The best thing about using Terragen is
that it is free (for non-commercial use) and it is fast
(at 75% detail, I was able to render the entire sky in about 30 minutes
on a P-200 MMX machine with 32MB of RAM). These two qualities make
generating environment maps with it easy for amateur mappers (like me).
First, if you don't have Terragen already, then you will need to download Terragen from the Terragen site.
As of the time of this writing (21 July 2000), the latest version is
0.8.11. The examples and screen shots assume that you are using this
version.
Once you have obtained Terragen and installed it, your next step is
to generate your sky environment. This tutorial is not designed to
explain all of the inner workings of Terragen, so I will have to leave
you to generate your own world. The main Terragen page has links to the official User's Guide and to beginner tutorials to get you started. Use your imagination -- the possibilities are endless.
Rendering the Environment Map
After you create your environment, you are ready to render your sky.
The technique for doing this in Terragen is very similar to the
technique for doing it in Bryce. You will first select an initial
position and orientation for the camera, and then take 90-degree
field-of-view snaps of the scene in each of the six cardinal directions
(right, front, left, back, up, and down).
To set the initial camera position, bring up the Render Controls
window. An overhead map of your terrain appears at the bottom
right-hand side of the window. Clicking on the map with the left mouse
button sets the camera position; clicking on it with the right mouse
button sets the camera target (that is, the point that the camera
always looks toward). You can also enter numbers manually in the Camera
Position fields if you prefer. I usually enter 128 for the camera
position X and Y values, which sets the camera in the center of the
map. You might want to adjust the Z coordinate for the camera position
as well. Then set all three of the Camera Orientation values to 0 and
do a render preview. If you are satisfied, then move on to the next
step; otherwise, keep adjusting the camera position until you are
satisfied.
Once you have set the camera position, click on the Camera Settings
button and manually set the Zoom to 1. A Zoom value of 1 results in a
90-degree field of view, which is what we need for a Half-Life sky. The
other settings are optional, but Zoom must be 1, no more and no less. Once you have set the zoom value, exit the Camera Settings dialog.
Now, you need to decide what size that you want for the rendered
images. Half-Life sky images are 256x256, so you can snap images at
that size if you want to. Alternatively, you can snap the images at a
larger size (say, 512x512) and resample them down to 256x256 using a
paint program such as Paint Shop Pro.
Doing this can give you greater graphical detail, but may require
additional post-processing to make the graphics seamless. So for now,
set the Image Size to 256x256. Also, set the Detail level to maximum
for best image quality. (The example shots are done at 75% detail, and
it shows in the final result.)
Snapping the Sky Images
Now we are ready to snap the sky images. Snapping each image
involves adjusting the Camera Orientation values in order to point the
camera in the proper direction, and pressing the Render Image button to
snap the scene. The three Camera Orientation values control the camera
as follows:
-
Head: This value controls the
camera heading, or compass direction. This value represents degrees
clockwise from "north", and ranges from 0 to 360, where 0 is "north"
(straight up) on the terrain map, 90 is "east", and so on.
-
Pitch: This value controls the
camera pitch, or up-and-down tilt. This value represents some number of
degrees above the horizon, and ranges from -90 (straight down) to 90
(straight up). A pitch of 0 makes the camera level.
-
Bank: This value controls the
bank of the camera, or its side-to-side tilt. This value should always
be 0, unless you are using the bank to produce special sky effects
(which are beyond the scope of this tutorial).
For each of the six cardinal directions listed below, adjust the
Camera Orientation values as shown, render the image, and then save it
to disk using the proper file name convention. (Replace skyname
with the name of our own sky in each file name.) Each direction has a
thumbnail picture of the process, and you can click on the picture for
a larger version of the image.
|
Right (skynamert.bmp)
Camera orientation: Head=0, Pitch=0, Bank=0
Large image size: 86K
|
|
Front (skynameft.bmp)
Camera orientation: Head=90, Pitch=0, Bank=0
Large image size: 83K
|
|
Left (skynamelf.bmp)
Camera orientation: Head=180, Pitch=0, Bank=0
Large image size: 86K
|
|
Back (skynamebk.bmp)
Camera orientation: Head=270, Pitch=0, Bank=0
Large image size: 88K
|
|
Up (skynameup.bmp)
Camera orientation: Head=0, Pitch=90, Bank=0
Large image size: 78K
|
|
Down (skynamedn.bmp)
Camera orientation: Head=0, Pitch=-90, Bank=0
Large image size: 83K
|
Once you have snapped the scenes, you need to save them in the
proper format. Terragen will save them in 24-bit BMP format. You will
need to convert these images to 24-bit compressed TGA, and then also
convert them to 8-bit uncompressed BMP format before you can use them
with Half-Life.
Testing the Sky in Half-Life
Once you have converted your sky into the proper formats, place them in the half-life\valve\gfx\env subdirectory (where half-life
here is the directory where you installed Half-Life). Then load it up
in the game. You can create your own test map, or you can download this example map
that I created for this purpose. It consists of little more than an
(unsealed!) skybox, a CLIP brush for the player to stand on, and a
player start. This allows you to view the entire sky unobstructed by
other map geometry. If you use the example map, then you will obviously want to edit it so that it loads your sky instead of trying to load my sky.

In-game screen
shot #1 (115K) and
shot #2 (113K) of new environment map
Click on a thumbnail to view a larger version of the image
The first shot is especially significant, because the area shown
crosses a sky image intersection (specifically, between the Right and
the Back images). Notice how seamlessly the sky images blend together!
Also, notice the importance of high detail (which the larger shots
bring out much more clearly). This example sky would look much better in the game if I had rendered the images at 100% detail level instead of at 75%. So will yours.
Tutorial Files
Creating an Overview
Day of Defeat Tutorials