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 DetailMap objects (up to four), you need pass the DetailMap objects 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 TerrainData variable 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 TerrainData object 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 Terrain objects camera mask and add it to a Node or a Scene, be careful. When Terrain is added into a Node or a Scene, 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.

results matching ""

    No results matching ""