package com.hello; import com.jme3.app.SimpleApplication; 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(); app.start(); }
@Override public void simpleInitApp() { flyCam.setMoveSpeed(50); //这段程序看似难以理解,实际上对图像构成理解了,这个程序也就好懂了 /** 1. Create terrain material and load four textures into it. */ //先创建它的材质,Terrain是地形材质 mat_terrain = new Material(assetManager, "Common/MatDefs/Terrain/Terrain.j3md");
/** 1.1) Add ALPHA map (for red-blue-green coded splat textures) */ //加载一个红绿蓝三种颜色构成的纹理图,注意key是“m_Alpha” mat_terrain.setTexture("m_Alpha", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png"));
/** 1.2) Add GRASS texture into the red layer (m_Tex1). */ //用grass.jpg覆盖红色层 Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg"); grass.setWrap(WrapMode.Repeat); mat_terrain.setTexture("m_Tex1", grass); mat_terrain.setFloat("m_Tex1Scale", 64f);
/** 1.3) Add DIRT texture into the green layer (m_Tex2) */ //用dirt覆盖绿色层 Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg"); dirt.setWrap(WrapMode.Repeat); mat_terrain.setTexture("m_Tex2", dirt); mat_terrain.setFloat("m_Tex2Scale", 32f);
/** 1.4) Add ROAD texture into the blue layer (m_Tex3) */ //用road覆盖蓝色层 Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg"); rock.setWrap(WrapMode.Repeat); mat_terrain.setTexture("m_Tex3", rock); mat_terrain.setFloat("m_Tex3Scale", 128f);
/** 2. Create the height map */ //创建高度图,仔细看一下png文件 final Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png"); //靠这张图片转换的抽象高度图,文件是.png格式,可能是加载转换的必要条件 final AbstractHeightMap heightmap = new ImageBasedHeightMap( ImageToAwt.convert( heightMapImage.getImage(), false, true, 0)); heightmap.load();
/** 3. We have prepared material and heightmap. Now we create the actual terrain: * 3.1) We create a TerrainQuad and name it "my terrain". * 每片地形是64x64 提供65 * 3.2) A good value for terrain tiles is 64x64 -- so we supply 64+1=65. * 高度图尺寸是512x512, 提供513 * 3.3) We prepared a heightmap of size 512x512 -- so we supply 512+1=513. * 每步层次细节提供Vector3f(1,1,1) * 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.setMaterial(mat_terrain); terrain.setLocalTranslation(0, -100, 0); terrain.setLocalScale(2f, 1f, 2f); rootNode.attachChild(terrain);
/** 5. The LOD (level of detail) depends on were the camera is: */ //为相机取得层次细节 List<Camera> cameras = new ArrayList<Camera>(); cameras.add(getCamera()); TerrainLodControl control = new TerrainLodControl(terrain, cameras); terrain.addControl(control);
} } |