`
ilovezhurong
  • 浏览: 44514 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jme学习笔记例13---创建地形

阅读更多

 本程序介绍JME的的地形实用工具类。您将学习如何使用ProceduralTextureGenerator,ImageBasedHeightMap,MidPointHeightMap和TerrainBlock对象。
这一切都将允许看毫不费力地创建地形。

 

import com.jme.app.SimpleGame;
import com.jme.terrain.TerrainBlock;
import com.jme.terrain.util.MidPointHeightMap;
import com.jme.terrain.util.ImageBasedHeightMap;
import com.jme.terrain.util.ProceduralTextureGenerator;
import com.jme.math.Vector3f;
import com.jme.bounding.BoundingBox;
import com.jme.scene.state.TextureState;
import com.jme.util.TextureManager;
import com.jme.image.Texture;
import java.net.URL;
import javax.swing.*;
/**
* Started Date: Aug 19, 2004<br><br>
*
* This program introduces jME's terrain utility classes and how
* they are used. It
* goes over ProceduralTextureGenerator,
* ImageBasedHeightMap, MidPointHeightMap, and
* TerrainBlock.
*
* @author Jack Lindamood
*/
public class HelloTerrain extends SimpleGame {
public static void main(String[] args) {
HelloTerrain app = new HelloTerrain();
app.setDialogBehaviour(SimpleGame.ALWAYS_SHOW_PROPS_DIALOG);
app.start();
}
protected void simpleInitGame() {
// First a hand made terrain
homeGrownHeightMap();
// Next an automatically generated terrain with a texture
generatedHeightMap();
// Finally a terrain loaded from a greyscale image with
// fancy textures on it.
complexTerrain();
}
private void homeGrownHeightMap() {
// The map for our terrain. Each value is a height on the terrain
int[] map=new int[]{
1,2,3,4,
89
2,1,2,3,
3,2,1,2,
4,3,2,1
};
// Create a terrain block. Our integer height values will
// scale on the map 2x larger x,
// and 2x larger z. Our map's origin will be the regular
// origin, and it won't create an
// AreaClodMesh from it.
TerrainBlock tb=new TerrainBlock("block",4,
new Vector3f(2,1,2),
map,
new Vector3f(0,0,0),
false);
// Give the terrain a bounding box.
tb.setModelBound(new BoundingBox());
tb.updateModelBound();
// Attach the terrain TriMesh to our rootNode
rootNode.attachChild(tb);
}
private void generatedHeightMap() {
// This will be the texture for the terrain.
URL grass=HelloTerrain.class.getClassLoader().getResource(
"jmetest/data/texture/grassb.png");
// Use the helper class to create a terrain for us. The
// terrain will be 64x64
MidPointHeightMap mph=new MidPointHeightMap(64,1.5f);
// Create a terrain block from the created terrain map.
TerrainBlock tb=new TerrainBlock("midpoint block",mph.getSize(),
new Vector3f(1,.11f,1),
mph.getHeightMap(),
new Vector3f(0,-25,0),false);
// Add the texture
TextureState ts=display.getRenderer().createTextureState();
ts.setTexture(
TextureManager.loadTexture(grass,
Texture.MM_LINEAR,Texture.FM_LINEAR,true)
);
tb.setRenderState(ts);
// Give the terrain a bounding box.
tb.setModelBound(new BoundingBox());
tb.updateModelBound();
// Attach the terrain TriMesh to rootNode
rootNode.attachChild(tb);
}
private void complexTerrain() {

// This grayscale image will be our terrain
URL grayscale = HelloTerrain.
class.getClassLoader(). getResource("jmetest/data/texture/bubble.jpg");
// These will be the textures of our terrain.
URL waterImage=HelloTerrain.
class.getClassLoader().
getResource("jmetest/data/texture/water.png");
URL dirtImage=HelloTerrain.
class.getClassLoader().
getResource("jmetest/data/texture/dirt.jpg");
URL highest=HelloTerrain.
class.getClassLoader(). getResource("jmetest/data/texture/highest.jpg");
// Create an image height map based on the gray scale of our image.
ImageBasedHeightMap ib=new ImageBasedHeightMap( new ImageIcon(grayScale).getImage()
);
// Create a terrain block from the image's grey scale
TerrainBlock tb=new TerrainBlock("image icon",ib.getSize(),
new Vector3f(.5f,.05f,.5f),ib.getHeightMap(), new Vector3f(0,0,0),false); // Create an object to generate textured terrain from the
// image based height map.
ProceduralTextureGenerator pg=new ProceduralTextureGenerator(ib);
// Look like water from height 0-60 with the strongest
// "water look" at 30
pg.addTexture(new ImageIcon(waterImage),0,30,60);
// Look like dirt from height 40-120 with the strongest
// "dirt look" at 80
pg.addTexture(new ImageIcon(dirtImage),40,80,120); // Look like highest (pure white) from height 110-256
// with the strongest "white look" at 130 pg.addTexture(new ImageIcon(highest),110,130,256);
// Tell pg to create a texture from the ImageIcon's it has recieved.
pg.createTexture(256);
TextureState ts=display.getRenderer().createTextureState();
// Load the texture and assign it.
ts.setTexture(
TextureManager.loadTexture(
pg.getImageIcon().getImage(),
Texture.MM_LINEAR_LINEAR,
Texture.FM_LINEAR,
true, true )
); tb.setRenderState(ts);
// Give the terrain a bounding box tb.setModelBound(new BoundingBox());

tb.updateModelBound();
// Move the terrain in front of the camera
tb.setLocalTranslation(new Vector3f(0,0,-50));
// Attach the terrain to our rootNode. rootNode.attachChild(tb); } }

这个程序演示了jme的地形如何工作,所有的地形来自基类
TerrainBlock。这个类也是一个TriMesh,此类用一个整数
数组创建地形,这个程序创建了3个不同类型的地形,
第一个始手工的,第2个使用工具创建,第3个是从某地形文件创建,我们开始第一个先
// The map for our terrain. Each value is a height on the terrain
int[] map=new int[]{
1,2,3,4,
2,1,2,3,
3,2,1,2,
4,3,2,1
};
// Create a terrain block. Our integer height values will
// scale on the map 2x larger x,
// and 2x larger z. Our map's origin will be the regular
// origin, and it won't create an
// AreaClodMesh from it.
TerrainBlock tb=new TerrainBlock("block",4,
new Vector3f(2,1,2),
map,
new Vector3f(0,0,0),
false);

这个地图数组就是整数值,每个整数代表一个高度
这地形是一个正方形,如果你用map数组创建每个高度
他看起来就是这样的,这就是在terrainblock如何生成的
TerrainBlock第一个参数是地形块的名字(每个spatial对象必须有名字),接着块的尺寸是4*4.3rd是地形的scale值,我们定义了地形的整数值但如果我们要浮点的高度,
scale值把地形沿x和z轴拉长了两倍。通过这个值可以控制
地形的大小,最后两个参数是地形的原点(0,0,00
如果我们要用areaclodmesh创建地形,地形将占用更大的内存可是会有更快的刷新率
   下面,看这个地形的生成
// Use the helper class to create a terrain for us. The
// terrain will be 64x64
MidPointHeightMap mph=new MidPointHeightMap(64,1.5f);
// Create a terrain block from the created terrain map.
TerrainBlock tb=new TerrainBlock("midpoint block",mph.getSize(),
new Vector3f(1,.11f,1),
mph.getHeightMap(),
new Vector3f(0,-25,0),false);
这里我们使用midpointheightmap去生成一个地形,
地形是64*64的,我们给他的粗糙度是1.5,这个值让
地形变得平滑,你可以把它设成你期望的效果,
terrainblock对象从midpointheightmap中读取地形大小。
 
 最后我们创建一个灰色图片的地形。

你要注意地形图片的明暗度,imagebasedheightmap创建的地形从高到低由亮到暗,
// Create an image height map based on the gray scale of our image.
ImageBasedHeightMap ib=new ImageBasedHeightMap(
new ImageIcon(grayScale).getImage() );

我必须传递imagebasedheightmap一个图片对象,为此
我创建imageicon获取url资源的图片,在height map和
terrainblock创建之后,下一步是创建strange地形,
首先,看这三个地形
第一个是water,第2个是dirt最后一个是highest.jpg
注意highest.jpg是相似白,现在另一个要关注的是复杂
地形的尺寸
// Create an object to generate textured terrain from the
// image based height map.
ProceduralTextureGenerator pg=new ProceduralTextureGenerator(ib);
// Look like water from height 0-60 with the strongest
// "water look" at 30
pg.addTexture(new ImageIcon(waterImage),0,30,60);
// Look like dirt from height 40-120 with the strongest
// "dirt look" at 80
pg.addTexture(new ImageIcon(dirtImage),40,80,120);
// Look like highest (pure white) from height 110-256
// with the strongest "white look" at 130
pg.addTexture(new ImageIcon(highest),110,130,256);

当我创建pd时传递它一个height map(实际height map
对象不是int[]数组),它使用height map创建纹理
下面我传递3个图片给地形的3个部分,让我们看其中一个
另外两个是同样的道理
// Look like water from height 0-60 with the strongest
// "water look" at 30
pg.addTexture(new ImageIcon(waterImage),0,30,60);

这个方法调用pg从高0-60存放water图片,water图片融合
0-30之间,这个融合的最大强度是30,同样处理其他两个纹理,通知pg需要创建纹理
// Tell pg to create a texture from the ImageIcon's it has recieved.
pg.createTexture(256);

你将注意当我创建纹理对象需要使用texturestate,
我从pg获得texture
TextureState ts=display.getRenderer().createTextureState();
// Load the texture and assign it.
ts.setTexture(
TextureManager.loadTexture(
pg.getImageIcon().getImage(),
Texture.MM_LINEAR_LINEAR,
Texture.FM_LINEAR,
true,
true
)
);
全部的工作完成了,一个terrain类创建地形并把它拆分到
不同的约束盒所以你看不到地形被包裹
 
0
0
分享到:
评论

相关推荐

    jme3游戏demo rise-of-mutants

    游戏中的3D模型是通过建模软件(如Blender或3ds Max)创建的,然后导入到jme3中。jme3支持多种3D格式,如OBJ、FBX等。场景构建则涉及到节点树的概念,每个节点代表一个对象或者一组对象,通过父子关系构成复杂的3D...

    联想的JME2207P键盘驱动

    标题中的“联想的JME2207P键盘驱动”是指专门为联想品牌的一款键盘型号为JME2207P的设备设计的驱动程序。在计算机硬件系统中,驱动程序是连接操作系统与硬件设备的关键软件,它使得操作系统能够识别并控制特定硬件,...

    JME中文教程.pdf

    - **jme3-terrain**:提供地形生成API,支持使用高度图生成3D地形。 - **jme3-blender**:专门用于加载blender格式的模型文件,但仅限于桌面开发。 - **jme3-jbullet/jme3-bullet**:分别基于jbullet和BulletPhysics...

    JME3学习文档

    ### JME3游戏开发引擎中文学习指南 #### 引言 JME3,全称jMonkeyEngine3,是一款开源的3D游戏开发引擎,专为Java开发者设计,旨在简化3D游戏和应用程序的开发过程。本文档将详细介绍如何在Netbeans6.x环境下搭建...

    java8看不到源码-JME3-JFX:用于JME的JFXGui桥接器,具有用于常见用例的有用实用程序

    jme-3.0.10 兼容): 版本:1.+ 分支:jme_3.0 JME3-JFX 需要 java 8,但是可以使用 java 7 在纹理上绘制视频。对于 jME SDK,您应该创建一个 java 8 平台,但是 java8 支持非常糟糕(因为它基于 netbeans 7)。 ...

    jme8002b蓝牙键盘驱动

    jme8002b蓝牙键盘驱动

    JME学习文档—中文版.rar

    这份"JME学习文档—中文版"压缩包文件,显然是为了帮助初学者或有经验的Java开发者掌握JME的使用和开发技巧。 JME的核心在于它的可移植性,它允许开发者编写一次代码,就能在多个平台上运行,这得益于其“Write ...

    ant-jme.jar.zip

    标题“ant-jme.jar.zip”指的是一个压缩文件,其中包含了两个关键元素:ant-jme.jar和ant.license.txt。这个文件主要与Java开发工具有关,特别是Apache Ant和Java Micro Edition (JME)。 Apache Ant是一个Java库和...

    JME程序设计实例教程

    **JME程序设计实例教程详解** Java Micro Edition(JME),又称为Java 2 Micro Edition...通过学习,开发者不仅能够理解JME的编程模型,还能熟练运用其API,解决实际问题,为移动和嵌入式领域的软件开发打下坚实基础。

    jme-remoterpiui-demo:jme-rpiui-demo的配套项目

    jme-remoterpiui-demo RemoteRPIUIControllerDemo MIDlet 该程序允许从JME Emulator远程控制在Raspberry Pi上运行的RPIUIDemoMIDlet应用程序(jme-rpiui-demo存储库)。 该程序连接到RPIUIDemoMIDlet的服务器套接...

    jme3 api(精华chm)

    com.jme3.animation com.jme3.app com.jme3.app.state com.jme3.asset com.jme3.asset.pack com.jme3.asset.plugins com.jme3.audio com.jme3.audio.joal ...jme3tools.preview

    JME教程.rar

    本教程中,你将学习如何创建MIDlets,使用MIDP提供的用户界面元素(如ChoiceGroup和Form),以及如何利用Canvas进行自定义绘图。你还将了解如何处理用户输入,与设备硬件交互,如键盘和触摸屏。此外,网络功能如HTTP...

    jme3-clj-aide:JMonkeyEngine3 + Clojure-Android + AIDE 示例项目

    JMonkeyEngine3(简称JME3)是一款强大的开源3D游戏引擎,它基于Java语言,提供了丰富的图形渲染功能,使得开发者能够创建高质量的3D游戏。而Clojure则是一种现代的、动态类型的Lisp方言,以其简洁的语法和强大的...

    2015jme3指南

    通过深入学习《2015jme3指南》,开发者不仅可以了解JME3的使用,还能掌握3D游戏开发的基本流程和技巧,为今后的项目开发打下坚实基础。同时,结合博主的博客文章,可以得到更全面的开发经验,解决实际遇到的问题。

    联想FN功能键 jme2207p键盘驱动. XP windows7

    标题中的“联想FN功能键 jme2207p键盘驱动. XP windows7”表明这是一个针对联想笔记本电脑的FN功能键以及JME2207P型号键盘的驱动程序,适用于Windows XP和Windows 7操作系统。FN键是许多笔记本电脑上常见的辅助功能...

    JME试题及答案 socket 多线程 高级UI

    ### JME试题及答案知识点详解 #### 一、选择题知识点解析 ...这些知识点涵盖了JME中的多个方面,包括网络通信、图形处理、游戏开发等,旨在帮助中级水平的学习者深入理解JME的相关概念和技术细节。

    JME商业游戏进阶二 (地表层的神秘面纱1)源代码

    源代码可能会展示如何使用JME来创建和纹理贴图这些地形。 3. **3D模型和纹理**:游戏中的地表层通常由3D模型和纹理组成,以提供视觉效果。开发者需要了解如何导入和管理这些资源,以及如何应用光照和阴影来增强真实...

    JME的文件格式及支持的文件格式

    **JMonkeyEngine 3 (JME3) 文件格式详解** JMonkeyEngine 3(简称JME3)是一款开源的游戏开发引擎,专为构建3D游戏和应用而设计。它支持多种文件格式,使得开发者能够方便地导入和管理游戏资源。以下是对JME3支持的...

    java学习笔记整理

    【Java学习笔记整理】 Java是一种广泛使用的编程语言,它不仅是一种语言,还是一个软件开发平台和运行环境。Java分为三个主要版本:Java标准版(JSE)、Java缩微版(JME)和Java企业版(JEE)。JSE主要用于桌面应用...

Global site tag (gtag.js) - Google Analytics