3D Terrain Generation - Department of Electrical Engineering

advertisement

3D Terrain Generation

Pablo Saldarriaga

CSE4431

Why virtual terrains?

There are many applications for 3d terrains

Just to name a few

Virtual tourism and travel planning

Education

Civil engineering, urban planning

Weather visualizations

Real Estate

Games

Movies

Placement of communication signal towers

Background

The defense industry created virtual terrains as early as the 1970’s

Their purpose were ballistics and training simulations

TINs (Triangulated Irregular Networks) appeared in 1973, developed by

Randolph Franklin at Simon Fraser University

TIN : vector based representation of the physical land surface or sea bottom

In the 1980’s procedural techniques are developed and they are used to generate artificial terrains

This was the time Perlin created his noise functions

It was only until the late 1980’s that fractals and polygonal subdivision techniques started to become more widespread in artificial terrain generation

Military simulation software SIMDIS

Triangulated Irregular Network(TIN) Emil Multifractal terrain by Kenton Musgrave

A virtual terrain generated using Terragen 2 from

Planetside software

Image created by Hannes Janetzko.

http://www.planetside.co.uk/gallery/f/tg2/Hannes-Another+jungle+flyover.jpg.html

How are virtual terrains generated?

Heightfields

Widespread approach for generating virtual terrain

 games and simulators use heightfields as a rough terrain model

 This lecture will be focused in this approach

Voxels

Volume based values in a 3D grid

Meshes

TIN’s, tesselation schemes such as ROAM (Realtime optimally adapting mesh) and other LOD(Level of Detail) techniques

ROAM

Voxel Terrain

ROAM : Inventor Projects 2006, http://merlin.fit.vutbr.cz/wiki/index.php/Inventor_Projects_2006

Voxel Terrain: Generating Complex Procedural Terrains Using the GPU, http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html

Topics

Glsl vertex displacement using height maps

Fractal Terrain generation

Midpoint displacement Alg.

Diamond – Square Alg.

Fault Line Alg.

Particle deposition

In Glsl, terrain can be generated relatively easy if a heightmap texture is available to the vertex shader the surface that is going to be displaced is tesselated fine enough to show the heightmap details

If this is the case then add the following to the vertex shader

//make sure your height value is in the desired range (for example from 0 to 1) float h = texture(heightmap, st).r *Scale + Bias;

//ensures that the displacement happens in the direction of the normal of the current vertex vec3 newPos = currentPos + currentNormal * h; gl_Position = uModelViewProjectionMatrix * vec4(newPos,1.);

Very simple example

Fractal Terrains

 first approach would be to generate a heightmap using fBm noise

 results look ok but not very realistic since fBm is homogeneous and isotropic

A better choice would be to use Multifractals

These are fractals whose dimension/roughness varies with location

 So how do you generate a Multifractal?

Multifractal terrain by Kenton Musgrave.

Texturing and Modeling: a Procedural Approach 3 rd edition, pg 490

“Multiplicative Multifractal”

H controls the roughness of the fractal

Multifractal terrain patch with an offset of 0.8

The above multifractal function is considered to be unstable

It varies from highly heterogenous (at offset = 0) to flat (offset diverges to infinity)

Its output usually needs to be rescaled

Other kinds of Multifractals

Hybrid multifractals

Called hybrid because they are both additive and multiplicative multifractals

Ridged multifractals

Similar to Perlin’s turbulence noise

They calculate 1-abs(noise) so that the resulting “canyons” from abs(noise) become high ridges

Ridged multifractal terrains : taken from Texturing and Modeling: A Procedural

Approach pg 518 (left) pg 480(right)

Midpoint displacement 1D version

Type of polygon subdivision algorithm, also a fractal function

Created to simulate tectonic uplift of mountain ranges

One of its main input parameters is the roughness constant r

Step 0

Step 1

Step 2

Displace the midpoint of the line by some random value between (-d, d)

Now reduce the range of your random function depending on r by d* = pow( 2 , -r)

Again displace the midpoint of all the line segments and reduce your

Random function’s range

Step 3

Nth step

Keep iterating until you get the required detail

Always remembering to reduce d

After every step

How does r affect the outcome?

If r = 1

Your d will half each iteration

If r > 1 d increases faster generates smooth terrain

If < 1 d increases slowly generates chaotic terrain

Diamond- Square

Also called the cloud fractal , plasma fractal or random midpoint displacement

The 2D version of the original Midpoint displacement algorithm

Therefore it also has a roughness constant

The diamond-square alg. works best if it is run on square grids of width 2^n

This ensures that the rectangle size will have an integer value at each iteration

 the algorithm starts with a 2 x 2 grid

The heights at the corners can be set to either zero, a random value or some predefined value

 the first step involves calculating the midpoint of the grid based on its corners and then adding the maximum displacement for the current iteration

E = (A+B+C+D)/4 + Rand(d)

Rand(d) can generate random values between

-d and +d

This is called the Diamond step ,

Because if you render this terrain you will see four diamond shapes

Next is the Square step

Calculate the midpoints of the edges between the corners wrapping

G = (A+B+E+E)/4 + rand(d)

H = (B+D+E+E) /4 + rand(d)

I = (D+C+E+E)/4 + rand(d)

F = (A+C+E+E)/4 + rand(d)

Non-wrapping

G = (A+B+E)/3 +rand(d) same for H,I,F

Since the first iteration is complete, now d is reduced by

d *= pow(2,-r) where r is the roughness constant

Start the second iteration

Again perform the diamond step

B

J = (A+G+F+E)/4 + rand(d)

K = (G+B+E+H)/4 + rand(d)

L = (F+E+D+I)/4 + rand(d)

M = (E+H+I+C)/4 + rand(d)

Remember this d is smaller than the one in the first iteration

D

C

Perform the square step wrapping

O = (A+G+J+J)/4 + rand(d)

P = (J+G+K+E)/4 + rand(d)

Q = (J+E+L+F)/4 + rand(d)

N = (A+F+J+J)/4 +rand(d)

Non-wrapping

O = (A+G+J)/3 + rand(d)

N = (A+F+J)/3 + rand(d)

Continue subdividing until you reach the desired level of detail

To summarize,

Diamond - Square alg.

While length of square sides > 0

Pass through the whole array and apply the diamond step for each square

Pass through the whole array and apply the square step for each diamond

Reduce the range of the random displacement

Fault line algorithm

Created to approximate real world terrain features such as escarpments, mesas, and seaside cliffs

First step in faulting process

Terrain generated after 400 iterations

Pictures from http://www.lighthouse3d.com/opengl/terrain/index.php?fault

One way of generating fault lines in a height field grid randomly pick two grid points p1 p2 calculate the line between them

Go through all the points in the height field and add or subtract an offset value depending on what side of the line they are located

Before the next fault is drawn, reduce the range of the offset by some amount

Height fields generated by this algorithm need to be filtered in order to look like realistic terrain

A low pass filter is usually used

 some variations to the fault line algorithm

Cosine

Sine

Particle Deposition

Simulates volcanic mountain ranges and island systems drop random particles in a blank grid

Determine if the particle’s neighboring cells are of a lower height

If this is the case increment the height of the lowest cell keep checking its surrounding cells for a set number of steps or until it is the lowest height among its surrounding cells

If not increment the height of the current cell

Generated after 5 series of 1000 iterations

Issues with using Height fields

They cannot generate overhangs or caves

Some solutions, for example :

“mushrooming” effects that involve the manipulation of vertex normals in order to render height field textures with overhangs

 the game Halo Wars implemented a new type of height field called a vector height field which stored a vector to displace a vertex instead of a height value

Bibliography

De Carpentier, Giliam J.P.. Interactively synthesizing and editing virtual outdoor terrain.MA thesis. Delft University of Technology, 2007. http://www.decarpentier.nl/downloads/InteractivelySynthesizingAndEditingVirtualOu tDoorTerrain_report.pdf

DeLoura, Mark. Game Programming Gems. Charles River Media, 2002.

Ebert, David S., Musgrave, F. Kenton, Peachey, Darwyn, Perlin, Ken and Worley,

Steve.Texturing and Modeling: A Procedural Approach, 3rd edition. USA. Morgan

Kaufman Publishers, 2003.

Martz, Paul. “Generating Random Fractal Terrain.” Game Programmer. Publisher

Robert C.

Pendleton, 1997. http://www.gameprogrammer.com/fractal.html#midpoint

McAnlis, Colt. “HALO WARS: The Terrain of Next-Gen.” GDC Vault, 2009.

<http://www.gdcvault.com/play/1277/HALO-WARS-The-Terrain-of>

Olsen, Jacob. Realtime Procedural Terrain Generation. Department of Mathematics and Computer Science, IMADA, University of Southern Denmark, 2004.

<http://web.mit.edu/cesium/Public/terrain.pdf>

“OpenGL”. yaldex.com. http://www.yaldex.com/open-gl/ch20lev1sec2.html

Polack, Trent. Focus on 3D Terrain Programming. Cengage Learning, 2002.

Ramirez F., António. “Terrain Tutorial.” Open GL. Lighthouse 3D., 2012.

<http://www.lighthouse3d.com/opengl/terrain/index.php3?introduction>

Tamshi. “RE: Heightmap, Voxel, Polygon (geometry) terrains.” Game Development.

StackExchange Inc., 2011.

<http://gamedev.stackexchange.com/questions/15573/heightmap-voxel-polygongeometry-terrains>

“Welcome to the Virtual Terrain Project.” VTERRAIN.org, 2011.

<http://vterrain.org>

Download