Terrain
Terrain is an important component in 3D game. A texture is used to stand for the
height map. And up to 4 textures can be used to blend the details of the terrain,
grass, road, and so on.
HeightMap
HeightMap objects are the core of the terrain. Different from the common image
the height map represents the height of vertices. It determines the terrain's
geometry shape.
DetailMap
DetailMap objects are a list of textures determining the details of the terrain,
up to four textures can be used.
AlphaMap
AlphaMap objects are an image whose data is the blend weights of detail maps.
The blending result is the final terrain's appearance.
LOD policy
Terrain uses an optimization technique called Level Of Detail or LOD.
This is a rendering technique that reduces the number of verticies (or triangles)
that are rendered ,for an object, as its distance from camera increases. Users
can set the distance to the Camera by calling the
Terrain::setLODDistance(float lod1, float lod2, float lod3) method.
Neighboring chunks of Terrain objects, which have different LOD may cause
the crack artifacts. Terrain provide two functions to avoid them:
Terrain::CrackFixedType::SKIRT
Terrain::CrackFixedType::INCREASE_LOWER
Terrain::CrackFixedType::SKIRT will generate four, skirt-like meshes at each edge of the chunk.
Terrain::CrackFixedType::INCREASE_LOWER will dynamically adjust each chunks indices to seamlessly connect them.
How to create a terrain
Creating a Terrain takes a few steps. Example:
The following code snippet is creating a player and place it on the terrain:
auto player = Sprite3D::create("chapter9/orc.c3b");
player->setScale(0.08);
player->setPositionY(terrain->getHeight(player->getPositionX(),player->getPositionZ()));

- create all
DetailMapobjects (up to four), you need pass theDetailMapobjects to the Terrain::DetailMap struct:
Terrain::DetailMap r("dirt.dds");
Terrain::DetailMap g("grass.dds");
Terrain::DetailMap b("road.dds");
Terrain::DetailMap a("greenSkin.jpg");
- to create a
TerrainDatavariable with detail maps, you need to specify the terrain's height map file path and alpha map file path:
Terrain::TerrainData data("chapter9/heightmap16.jpg","TerrainTest/alphamap.png", r, g, b, a);
- pass the
TerrainDataobject to Terrain::create, the last parameter determines the LOD policy (as talked about above). Example:
_terrain = Terrain::create(data, Terrain::CrackFixedType::SKIRT);
- If you set a
Terrainobjects camera mask and add it to aNodeor aScene, be careful. WhenTerrainis added into aNodeor aScene, you can not use transform(translate, scale) on it anymore. If you do this after calling addChild(), some of the terrain's methods may calculate wrong results.
Get Terrain Height
Use the method Terrain::getHeight(float x, float z, Vec3 * normal= nullptr) to
get the specified position's height. This method is very useful when you want to
put a Sprite3D object or any Node on the terrain's surface.
Ray-Terrain intersection test
A Ray-Terrain intersection test will calculate the intersection point by giving a specified position.
Terrain::CrackFixedType::SKIRT will generate four skirt-like meshes at each chunks edge.
Terrain::CrackFixedType::INCREASE_LOWER will dynamically adjust each chunks index to seamlessly connect them.