The aim of this project is to render a map, starting with the
topography of the map ie lines of equal height (level lines).
From level lines of the map, I generate a heightmap picture. Each pixel
correspond to a vertex of the terrain, the color correspond to the height of the
vertex. This picture (called heightmap picture) can be used to render the map.
To render the heightmap, it can requieres a lot of vertices (for example, a 1800x1400 pixels
map is about 5 million
of vertices). To save performance, the space (ie the map) is partitionned in
small cubes. Each cube are rendered only if they are visible (ie intersect with
the frustum).
For generating the terrain, I start with the below picture :
Level lines
Taken from a real map !
The image is read and level lines are detected and rendered as colored lines in the next screenshot :
Flat map rendered with level lines
Level lines are extracted from the above picture
Each lines is affected with a different each :
A height is assigned to each level lines
and finally a flat heightmap is generated.
Flat 'Heightmap' generation
Generated using level lines and height value
Here are the first attempts to generate a smooth heightmap, you'll see some notable artifacts:
Heightmap generation
Generated using level lines and height value
This project has not gone really farter than that, so the final pass has just been generated using a gaussian blur image processing algorithm:
Heightmap smooth
Generated heightmap + a blurred filter
To optimize rendering of the terrain, its is partitionized on multiple box areas, or 'octree'. The terrrain in each octrees is rendered only the octree volume is visible by the camera. Some
screenshots showing different octree volumes:
Terrain rendered
Full map rendering + Octree (cubic boxes)
from two view point
Full map rendering + Octree optimized (parallelepiped
boxes)
from two view point
Copyright © 2004-2012 Jérôme Jouvie - All rights reserved. | http://jerome.jouvie.free.fr/ |