JME基础教程代码分析10高度图

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);

 

  }

}

posted on 2011-08-12 11:30  苏桓(osbert)  阅读(399)  评论(0编辑  收藏  举报

导航