Java3D引擎Jmonkeyengine入门.docx
《Java3D引擎Jmonkeyengine入门.docx》由会员分享,可在线阅读,更多相关《Java3D引擎Jmonkeyengine入门.docx(16页珍藏版)》请在冰豆网上搜索。
![Java3D引擎Jmonkeyengine入门.docx](https://file1.bdocx.com/fileroot1/2023-1/22/8b4a7b22-901f-4354-b07b-42ab3ca1179d/8b4a7b22-901f-4354-b07b-42ab3ca1179d1.gif)
Java3D引擎Jmonkeyengine入门
Java3D引擎Jmonkeyengine入门
V0.1版
一.JME在Eclipse上的下载配置:
2
二.LearningjME9
1.HelloWorldJME9
一.JME在Eclipse上的下载配置:
JME()是一个优秀的开源java3D游戏引擎,以下几幅图是由JME开发的游戏的截图,足以吸引你到其主页上瞧瞧吧?
想上手玩玩?
好,我们一步一步来!
即然是开源的,我们要做的第一步就是下载其源码,源码中包含了jme类库的源码和stepbystep的代码示例。
在ec通过cvs中导入jme源码,看图说话吧:
1.点File下的import:
2.选择通过CVS导入:
3.Next后,选中
,如果你是第一次上的话:
4.设定登陆sunCVS的帐号:
主机当然是,Repository如你不知都有哪些项目,就写/cvs吧,这样进去后就可瞧见sun上所在的Open项目了。
帐号?
如你未在上注册过,就全写guest了(我个主觉得还要是注册下,这是个礼貌问题,毕境是用人家辛苦写出来的代码呢!
)
5.再Next,嗬,原来sun上有这么多开源项目,等搞完这个再慢慢看!
---列表可能有点慢,要看你的网速了,等全列完了,你就在下面选jme导出就OK!
如果你在列表中未找到jme,也不要急,看到这个么?
选中,在里面输入jme后Next。
6.接下来。
。
。
不用贴了吧,导入jme的所有源码,资源文件,例程和其所使用的NativeLib,给个最终结果的全图吧:
Src:
所有的源代码
Lib:
javaLib和NativeLib
7.到底有啥效果呢?
忙乎了这半天?
往下看,这老外做事真是实在,一课一课的讲怎么做个游戏,就生怕我们不玩它的做品!
Jmetest包下都是一个个的测试例程,只要有main方法的你就可以运行---眼见为实嘛!
我建议你运行jmetest.flagrushtut.lesson9.Lesson9这个类,是个己经Started的赛车游戏!
首先看到的是一个对话框,设置相关参数的,直接OK吧,它总是有默认的!
黑屏…变亮……看到了吗?
如看到上图,你现在就可以使用w,s,a,d四个键控制这个小车车,用鼠标控制视角!
有点简简陋?
是不到2000行代码写出的东东啊,你写2W行试试?
可能屏幕一闪而过,又恢复了原状,那就只有两个原因,一是你机器太破了,跑不起(好像有这种情况,我猜的,3D游戏嘛);另一个原因是你技术cha啦,下载的jar包和本地类库没配好。
Jar包好导入,NativeLib就要右击src目录,在对话框中如下设置:
二.LearningjME
ThiswillprovideallyouneedtogetstartedwithjME.ItassumesyouhavejMEinstalled.Ifnot,youcanlooktothisinstallationguide.Asasupplementtothisguide,youcanreadthedocumentationatjME'sdocumentationlink,payingspecialattentiontojME’swiki.Finally,neverbeafraidtoaskquestions(nomatterhowsimple)atjME’sforum.AllofthecodeyouseehereisdoneusingjME’slatestCVSversion.Also,allthesourcecodehereisintheCVSunderpackagejmetest.TutorialGuidePleasepostanycorrectionsonthejMEforums,oremailthemtomedirectly.
1.HelloWorldJME
最简单的一个JME游戏---只是一个场景展示:
使用rootNode展示一个3DBox.:
在空间中展示一个3D的长方体,界面如下图:
代码简单了,先看一下我再来分析:
importcom.jme.app.AbstractGame;
importcom.jme.app.SimpleGame;
importcom.jme.math.Vector3f;
importcom.jme.scene.shape.Box;
/**
*在空间中显示一个长方体:
*1.一个简单游戏只需要继承com.jme.app.SimpleGame即可;
*2.创建一个Box对象,加入到场景中
*@authorjavaFound
*/
publicclassHelloWorldextendsSimpleGame{
//主方法
publicstaticvoidmain(String[]args){
HelloWorldapp=newHelloWorld();
//显示游戏配置窗口,默认为不显示
app.setDialogBehaviour(AbstractGame.ALWAYS_SHOW_PROPS_DIALOG);
//启动游戏
app.start();
}
protectedvoidsimpleInitGame(){
//创建一个Box对象
//第一个参数是其识别名字
//第二个定义了一个Vector3f对象,表示形状在空间中的中心位置点。
//后三个参数分别定义了形状在x,y,z三轴上的拉伸,即长宽高
Boxb=newBox("Mybox",newVector3f(3,2,0),2,20,2);
//rootNode代表场景中的根形状结点,是从父类继承而来的
//将我们自己新建的形状对像b加入到场景中
rootNode.attachChild(b);
}
}
就这么短短的几行代码,看到了吗?
如果还有点摸不着头脑,别急,我来说明下:
1.继承游戏基类SimpleGame:
publicclassHelloWorldextendsSimpleGame
首先,我们的类是extendscom.jme.app.SimpleGame,这是JME提供一游戏引擎基类,当我们自己的类继承其后,再调用start()方法时,JME类库就自动初始化了3d游戏所需要的基础配置。
在com.jme.app.*下面,其它几个类都可以用来继承生成我们的游戏,可根据我们游戏的复杂度选择。
只是SimpleGame是最简单的而己。
换包话说,真正的“引擎”,就是在com.jme.app.*下面。
2.3D形状的创建:
Boxb=newBox("Mybox",newVector3f(3,2,0),2,20,2);
这行代码构建一个3D的立方体,构建时,通过设置Box类不同的构造参数,可以创建不同位置、大小的立方体。
Box有不同的构造器参数,本例中所使用的构造器,第二个参数是一个com.jme.math.Vector3f对象,一个Vector3f对象通过三个float构造而成,用以代表空间中确定某个点坐标的x,y,z值。
在com.jme.math.*下,提供了较常用的数学计算对象;最后一个参数,分别代表了要创建的立方体的长、宽、高参数。
在com.jme.scene.shape.*下面,提供了非常多的3D形状类,比如Sphere等,你可根据自己的需要使用。
3.关于rootNode对象
Boxb=newBox("Mybox",newVector3f(3,2,0),1,1,1);
rootNode.attachChild(b);
:
rooNode是从父类继承而来的,可以理解为当前场景的根对象,后继所加入的对象,将通过rootNode引入,你可以通过rootNode向场景中加入多个形体。
例如,如下代码效果:
Boxb=newBox("Mybox",newVector3f(3,2,0),1,10,1);
rootNode.attachChild(b);
Sphereb2=newSphere("MySphere",newVector3f(3,2,0),4,5,6);
rootNode.attachChild(b2);
Chllenge1:
请在场景是显示一个哑铃状的物体。
2.HelloNode:
本节示例如何在场景中如何定义Node,BoundingVolumes,Sphere,Colors,TranslationandScaling。
如代码示例:
publicclassHelloNodeextendsSimpleGame{
publicstaticvoidmain(String[]args){
HelloNodeapp=newHelloNode();
app.setDialogBehaviour(AbstractGame.ALWAYS_SHOW_PROPS_DIALOG);
app.start();
}
protectedvoidsimpleInitGame(){
Boxb=newBox("MyBox",newVector3f(0,0,0),newVector3f(1,1,1));
//设定一个球形边界外框
b.setModelBound(newBoundingSphere());
//调用这个方法后,以后在场景中所加入的物体在按下B时,就会显示其边界.
b.updateModelBound();
//设置b在空间中的位置
b.setLocalTranslation(newVector3f(5,2,0));
//默认的颜色
b.setDefaultColor(ColorRGBA.blue);
//创建一个球形
Spheres=newSphere("Mysphere",10,10,1f);
s.setModelBound(newBoundingBox());
s.updateModelBound();
//设为随机颜色
s.setRandomColors();
//构造一个用来挂接上面两个物件的子节点
Noden=newNode("MyNode");
//挂接上前面创建的物件
n.attachChild(b);
n.attachChild(s);
//放大节点为其原始大小的5倍
n.setLocalScale(5);
//移动默认场景颜色,物件将会显示自己的颜色
rootNode.setLightCombineMode(LightState.OFF);
//挂接上子节点
rootNode.attachChild(n);
}
}
1.显示边界:
与上节相比,新增加的第一行代码就是:
//设定一个球形边界外框
b.setModelBound(newBoundingSphere());
Bound对象(suchasBoundingSphereandBoundingBox)是jME中的一个关键对象之一.按下B键时,你的物件会的边界会显示在线条构成的球形中(如果使用BoundingSphere对象),在jME中通过物件的Bound对象,可以很容易的观察可视化的和非可视化的物件.特别是当游戏中加入复杂的物件中,如人物。
2.设定位置:
b.setLocalTranslation(newVector3f(5,2,0));
要将物件放到(移动到)指定位置时,需要提供一个Vector3f对象,Vector3f对象构造时的三个参数分别代表空间中x,y,z值。
3.设定物件的颜色:
//默认的颜色
b.setDefaultColor(ColorRGBA.blue);
...
//设为随机颜色
s.setRandomColors();
简单的颜色设置,可通过ColorRGBA的属值设定,当然,你也可通过newColorRGBA(0,1,0,1)调用构造一个自己的色彩对象来设定到物件。
3.贴图:
本节演示如何给物件贴图和打光。
先看效果图:
代码如下:
publicclassHelloStatesextendsSimpleGame{
publicstaticvoidmain(String[]args){
HelloStatesapp=newHelloStates();
app.setDialogBehaviour(AbstractGame.ALWAYS_SHOW_PROPS_DIALOG);
app.start();
}
protectedvoidsimpleInitGame(){
//Createourobjects.Nothingnewhere.
Boxb=newBox("mybox",newVector3f(1,1,1),newVector3f(2,2,2));
b.setModelBound(newBoundingBox());
b.updateModelBound();
Spheres=newSphere("Mysphere",15,15,1);
s.setModelBound(newBoundingSphere());
s.updateModelBound();
Noden=newNode("Myrootnode");
//指定要贴图的图片位置
URLmonkeyLoc;
monkeyLoc=HelloStates.class.getClassLoader().getResource("jmetest/data/images/DSC00660.JPG");
//创建贴图对象
TextureStatets=display.getRenderer().createTextureState();
//设定贴图风格:
在物件的每个面贴一张图
Texturet=TextureManager.loadTexture(monkeyLoc,Texture.MM_LINEAR,Texture.FM_LINEAR);
//合并贴图场景
ts.setTexture(t);
//MaterialState对象,用来给物件上色
MaterialStatems=display.getRenderer().createMaterialState();
//构造ColorRGBA对象,即用来上色的颜色
ms.setEmissive(newColorRGBA(0f,.2f,0f,1));
//创建点光源对象
PointLightl=newPointLight();
//设定光源的位置
l.setLocation(newVector3f(0,10,5));
//设定光源的颜色
l.setDiffuse(ColorRGBA.red.clone());
//Enableit
l.setEnabled(true);
//将光源对象加入到场景中
LightStatels=display.getRenderer().createLightState();
ls.attach(l);
//将贴图对象与物件合并
b.setRenderState(ts);
//将光源与物件合并
n.setRenderState(ms);
//光源只对独立物件起效
lightState.detachAll();
n.setRenderState(ls);
//将物件放入场景
n.attachChild(b);
n.attachChild(s);
rootNode.attachChild(n);
}
}