Help with terrain tutorial

I just need some better understanding of what is being said here…



package jme3test.helloworld;


import com.jme3.material.Material;

import com.jme3.renderer.Camera;

import com.jme3.terrain.geomipmap.TerrainLodControl;

import com.jme3.terrain.heightmap.AbstractHeightMap;

import com.jme3.terrain.geomipmap.TerrainQuad;

import com.jme3.terrain.heightmap.HillHeightMap; // is used in example 2

import com.jme3.terrain.heightmap.ImageBasedHeightMap;

import com.jme3.texture.Texture;

import com.jme3.texture.Texture.WrapMode;

import java.util.ArrayList;

import java.util.List;

import jme3tools.converters.ImageToAwt;

public class HelloTerrain extends SimpleApplication {

private TerrainQuad terrain;

Material mat_terrain;

public static void main(String[] args) {

HelloTerrain app = new HelloTerrain();




public void simpleInitApp() {


/** 1. Create terrain material and load four textures into it. /

mat_terrain = new Material(assetManager, "Common/MatDefs/Terrain/Terrain.j3md");

* 1.1) Add ALPHA map (for red-blue-green coded splat textures) /



* 1.2) Add GRASS texture into the red layer (Tex1). /

Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");


mat_terrain.setTexture("Tex1", grass);

mat_terrain.setFloat("Tex1Scale", 64f);

* 1.3) Add DIRT texture into the green layer (Tex2) /

Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");


mat_terrain.setTexture("Tex2", dirt);

mat_terrain.setFloat("Tex2Scale", 32f);

* 1.4) Add ROAD texture into the blue layer (Tex3) /

Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");


mat_terrain.setTexture("Tex3", rock);

mat_terrain.setFloat("Tex3Scale", 128f);


Where does it get the four textures, or am i missing something…


* 2. Create the height map /

final Texture heightMapImage =


final AbstractHeightMap heightmap =

new ImageBasedHeightMap(


heightMapImage.getImage(), false, true, 0));



what is mountain512.png and what just happened right here.


* 3. We have prepared material and heightmap. Now we create the actual terrain:

  • 3.1) We create a TerrainQuad and name it "my terrain".
  • 3.2) A good value for terrain tiles is 64x64 – so we supply 64+1=65.
  • 3.3) We prepared a heightmap of size 512x512 – so we supply 512+1=513.
  • 3.4) As LOD step scale we supply Vector3f(1,1,1).
  • 3.5) At last, we supply the prepared heightmap itself.


    terrain = new TerrainQuad("my terrain", 65, 513, heightmap.getHeightMap());

    * 4. We give the terrain its material, position & scale it, and attach it. /


    terrain.setLocalTranslation(0, -100, 0);

    terrain.setLocalScale(2f, 1f, 2f);



    Is this the part that creates the mountains?


    * 5. The LOD (level of detail) depends on were the camera is: */

    List<Camera> cameras = new ArrayList<Camera>();


    TerrainLodControl control = new TerrainLodControl(terrain, cameras);


    and this part just justifies what the camera is looking at i presume




    I got through most of the parts with relative ease, until i got to this, and it confused me. If anyone could help me get a better understanding it would be appreciated!

Where does it get the four textures, or am i missing something…

They are in the library. jMonkey is able to load files directly from a .JAR.

In the source, it corresponds to test/data

what is mountain512.png and what just happened right here.

It’s an image which represents the terrain’s height. Here it loads the PNG file, and converts it to an array of floats with ImageBasedHeightmap(). TerrainQuad requires a float array to draw the mountains.

Is this the part that creates the mountains?

That part creates the TerrainQuad() object, based on the provided heightmap. This is indeed the 3D geometry which will be displayed in your 3D world.

I got through most of the parts with relative ease, until i got to this, and it confused me.

This block is for the level of detail (LOD), when the camera moves far from a mountain, jMonkey will automatically reduce it’s number of polygons, to make it faster to display. The block basically links the Camera (to get its position) to the TerrainQuad. You can remove it safely if you don’t want automatic LOD.