JME学习文档中文版.docx
- 文档编号:9280445
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:87
- 大小:435.85KB
JME学习文档中文版.docx
《JME学习文档中文版.docx》由会员分享,可在线阅读,更多相关《JME学习文档中文版.docx(87页珍藏版)》请在冰豆网上搜索。
JME学习文档中文版
JMonkeyEngine3
学习文档
(Version1.0)
JME团队成员编写
JMonkeyEngine3Engine
一、BeginnerTutorials
1.1HelloSimpleApplication
本教程假定你已经下载并在你所选择的IDE上搭建起了jMonkeyEngine3引擎,并且能够顺利的运行演示程序。
你已经准备好创建你的第一个jMonkeyEngine3游戏!
在这个入门系列教程里你可以使用任意的集成开发环境(IDE),如jMonkeyPlatform,NetBeans,Eclipse,或直接从命令行运行。
编写一个简单的应用程序
在IDE里创建一个jme3test.helloworld包和一个HelloJME3.java文件。
在NetBeans中,你可以用鼠标右击源代码包节点
●选择New->JavaClass来创建一个新文件
●输入一个类名:
HelloJME3
●输入一个包名:
jme3test.helloworld
●单击“完成”
示例代码
用下面的代码替换HelloJME3.java文件的内容:
packagejme3test.helloworld;
importcom.jme3.app.SimpleApplication;
importcom.jme3.material.Material;
importcom.jme3.math.Vector3f;
importcom.jme3.scene.Geometry;
importcom.jme3.scene.shape.Box;
importcom.jme3.math.ColorRGBA;
/**示例1-如何开始大部分简单的JME3应用程序。
*展示一个蓝色的3D立方体,并且通过移动鼠标和按WASD键从各个方向
*观看它。
*/
publicclassHelloJME3extendsSimpleApplication{
publicstaticvoidmain(String[]args){
HelloJME3app=newHelloJME3();
app.start();
}
@Override
publicvoidsimpleInitApp(){
Boxb=newBox(Vector3f.ZERO,1,1,1);
Geometrygeom=newGeometry("Box",b);
Materialmat=newMaterial(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color",ColorRGBA.Blue);
geom.setMaterial(mat);
rootNode.attachChild(geom);
}
}
编译和运行HelloJME3类。
如果一个JME设置对话框弹出,则保持默认设置点确认。
1.你应该看到一个简单的窗口,显示一个3-D立方体。
2.使用WASD键和鼠标在立方体周围操纵它。
3.按Esc键来关闭这个应用程序。
恭喜你,它运行出来了!
我们是怎么做到的呢?
理解代码
所有的JME3游戏有一些基本的规则
开始游戏
请注意,HelloJME3.java类继承了com.jme3.app.SimpleApplication,这是com.jme3.app.Application的一个子类。
每个JME3游戏都是com.jme3.app.Application的一个实例(直接或间接)。
要运行JME3的游戏,你首先要实例化你的应用基础类,然后调用它的start()方法:
HelloJME3app=newHelloJME3();
app.start();
通常情况下,你都是从你的Java应用程序主方法开始做。
提示:
高级Java开发人员可能要做一个SimpleApplication复制品并且使用它作为一个模板,自定义应用程序类。
初始化场景
这个简单的“游戏”只有一个立方体组成。
下面是我们如何创建它,定位它,给它一个颜色,并且将它附加到场景。
(之后我们将有一个详细的介绍)。
publicvoidsimpleInitApp(){
Box(Vector3f.ZERO,1,1,1);//创建立方体形状
Geometrygeom=newGeometry("Box",b);//创建多维的几何形状
Materialmat=newMaterial(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");//创建一个简单的材料
mat.setColor("Color",ColorRGBA.Blue);//设置材料的颜色
geom.setMaterial(mat);//设置立方体的材料
rootNode.attachChild(geom);//将立方体附加到场景中去
}
这个simpleInitApp()方法是每个JME3游戏开始时自动调用一次的。
在这个方法中,你创建或加载游戏开始之前所需要的对象!
下面是通常的过程:
1.初始化游戏对象:
●创建或加载所有对象并定位它们。
●为了使几何图形(如盒子)出现在场景中,将它附加到的RootNode。
●例如:
载入球员,地形,天空,敌人,障碍,并将其放置在它们的起始位置。
2.初始化游戏变量:
●游戏变量决定游戏的状态。
将它们设置初始值。
●例如:
在这里设置score为0,并且health为100%,等等。
3.初始化导航:
下面的键绑定是默认情况下被配置的:
●W,A,S,D键-四周移动
●鼠标和方向键-打开相机
●Esc键-退出游戏
最重要的部分是:
JME3应用程序有一个根节点对象。
你的游戏会自动继承根节点。
任何事情都附加到根节点然后出现在场景中。
或者换句话说:
一个已创建的对象,如果没有连接到根节点上,它仍然是看不见。
结论
这几行代码没做什么事情,但足以显示一个静态的3-D对象,并且它们已经允许你在3D范围内去导航它。
你已经学习到SimpleApplication是一个很好的起点,因为它为你提供:
●simpleInitApp()方法来初始化游戏对象
●你附加几何图形到根节点上使它们出现在场景中
●有用的默认导航设置
在真正的游戏中,你将会:
●初始化游戏世界
●在事件循环中触发行为
●响应用户输入
在以下的教程中,你将学习如何用jMonkeyEngine3完成这些任务!
继续HelloNode教程,在这里我们将首先介绍关于如何初始化游戏世界的详细内容,也称为场景图。
1.2HelloNode
当创建一个3D游戏时,你开始创建一个场景和一些对象。
你放置对象(球员,障碍等)在场景中,并且移动,缩放,旋转,着色使它们有生命力。
在这个教程中,我们将看到一个简单的3D场景。
你将学到3D世界在场景图中是一个代表以及根节点重要的原因。
你将学习如何创建简单的对象,以及如何改造它们-移动,缩放,旋转。
你将了解在场景图中,节点和几何图两种类型之间的区别。
为了对场景图有一个视觉上的介绍,请看我们的示例展示。
示例代码
packagejme3test.helloworld;
importcom.jme3.app.SimpleApplication;
importcom.jme3.material.Material;
importcom.jme3.math.Vector3f;
importcom.jme3.scene.Geometry;
importcom.jme3.scene.shape.Box;
importcom.jme3.math.ColorRGBA;
importcom.jme3.scene.Node;
/**示例2-如何使用节点作为手柄操纵场景图中的对象。
你可以通过操纵*它们的父节点来旋转,平移,缩放对象。
根节点是特殊的:
只有附加到根*节点上的东西才会出现在场景中。
*/
publicclassHelloNodeextendsSimpleApplication{
publicstaticvoidmain(String[]args){
HelloNodeapp=newHelloNode();
app.start();
}
@Override
publicvoidsimpleInitApp(){
//在坐标(1,-1,1)处创建一个蓝色盒子
Boxbox1=newBox(newVector3f(1,-1,1),1,1,1);
Geometryblue=newGeometry("Box",box1);
Materialmat1=newMaterial(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color",ColorRGBA.Blue);
blue.setMaterial(mat1);
//在蓝色盒子上边坐标为(1,3,1)处垂直创建一个红色盒子
Boxbox2=newBox(newVector3f(1,3,1),1,1,1);
Geometryred=newGeometry("Box",box2);
Materialmat2=newMaterial(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
mat2.setColor("Color",ColorRGBA.Red);
red.setMaterial(mat2);
//在坐标为(0,0,0)处创建一个pivot节点并把它附加到根节点上
Nodepivot=newNode("pivot");
rootNode.attachChild(pivot);
//附加两个盒子到pivot节点上!
pivot.attachChild(blue);
pivot.attachChild(red);
//旋转pivot节点:
两个盒子都被旋转了!
pivot.rotate(0.4f,0.4f,0.0f);
}
}
编译和运行代码示例。
你应该看到在相同的角度有两个倾斜的彩色盒子。
理解术语
在这个教程中,你将学到一些新的术语:
1.场景图代表你的3D世界。
2.场景图(如在这个例子中的盒子)中的对象被称为空间。
●空间是一个收集有关对象的信息:
它的位置,旋转和缩放。
●空间可装载,转换和保存。
3.有两种类型空间,节点和几何图。
4.为了添加一个空间到场景图,你必须附加这个空间到根节点上。
5.被附加到根节点上的每一样东西都是场景图的一部分。
理解代码
那么究竟在这个代码片段里发生了什么?
注意,我们使用的simpleInitApp()方法在第一篇教程中已经进行了介绍。
1.我们创建了一个盒子几何体。
●这个盒子几何体的延伸是(1,1,1),这使得它为2x2x2单位大。
●我们放置这个盒子在坐标(1,-1,1)上。
●我们给予它一个蓝色的固体材料。
Boxbox1=newBox(newVector3f(1,-1,1),1,1,1);
Geometryblue=newGeometry("Box",box1);
Materialmat1=newMaterial(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color",ColorRGBA.Blue);
blue.setMaterial(mat1);
2.我们创建了第二个盒子几何体。
●这个盒子几何体也是2x2x2单位大。
●我们放置这个盒子在坐标(1,3,1)上。
它垂直在蓝色盒子的上边。
它们之间的空隙为两个单位大。
●我们给予它一个红色的固体材料。
Boxbox2=newBox(newVector3f(1,3,1),1,1,1);
Geometryred=newGeometry("Box",box2);
Materialmat2=newMaterial(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
mat2.setColor("Color",ColorRGBA.Red);
red.setMaterial(mat2);
3.我们创建了一个节点。
●这个节点默认是放置在坐标(0,0,0)上。
●我们附加这个节点到根节点上。
●这个附加的节点在场景中是不可见的。
Nodepivot=newNode("pivot");
rootNode.attachChild(pivot);
4.注意,我们还没有把两个盒子附加到任何东西上。
●如果我们这是运行应用程序,场景图中将不会出现任何东西。
5.我们附加两个盒子到节点上。
●如果我们这是运行应用程序,我们将会看到两个盒子:
一个垂直在另一个上。
pivot.attachChild(blue);
pivot.attachChild(red);
6.现在我们旋转这个节点。
●我们现在运行这个应用程序,我们看到两个盒子在彼此之上-并且都在相同的倾斜角度上。
pivot.rotate(0.4f,0.4f,0.0f);
发生了什么?
我们附加两个盒子几何体到一个节点上。
接着我们把这个节点作为手柄去抓取两个盒子,并且同时变换(旋转)它们,这是一个普通的任务,并且在你的游戏中当你移动游戏角色时你将用到这个方法。
定义:
几何体VS节点
在你的场景图中你可以操纵两种类型的空间:
节点和几何体。
这是不同点:
几何体
节点
可见性
一个可见的3-D对象
一个”不可见“的手柄
用途
几何体存储对象的外貌特征
一个节点由几何体和其它的节点组成
例子
一个盒子,一个球体,运动员,建筑,一块地形,车辆,导弹,NPC,等...
默认的是根节点,用户界面节点(屏幕上的文字);地面节点,一个自定义的车辆和乘客节点,一个音频节点,等等...
常见问题:
如何填充场景图?
任务?
解决办法!
创建一个空间
创建一个形状,并给予它一个材料。
以一个盒子为例:
Boxmesh=newBox(Vector3f.ZERO,1,1,1);
Geometrything=newGeometry("thing",mesh);
Materialmat=newMaterial(assetManager,"Common/MatDefs/Misc/ShowNormals.j3md");
thing.setMaterial(mat);
是一个对象出现在场景中
附加空间到根节点上,或附加到绑定在根节点上的任意节点上。
rootNode.attachChild(thing);
从场景中移除对象
从根节点上分离空间,或是从绑定在根节点上的节点上分离。
rootNode.detachChild(thing);
rootNode.detachAllChildren();
在场景中通过对象的名字或ID找到对象
看节点的孩子
Spatialthing=rootNode.getChild("thing");
Spatialtwentythird=rootNode.getChild(22);
起初,指定什么东西应该被载入
在游戏的开始,你在simpleInitApp()方法中初始化和附加到根节点上的每一样东西都是场景中的一部分。
如何变换对象呢?
有三种类型的3D转换:
转移(移动)、尺度(调整大小)、旋转(转动)。
任务?
解决办法!
X
Y
Z
放置和移动对象
转移:
在三个方向上指定新的位置:
左/右,上/下,前/后。
示例1:
移动对象到指定的坐标,如(0,40.2f,-2),用:
thing.setLocalTranslation(newVector3f(0.0f,40.2f,-2.0f));
示例2:
通过特定的距离移动对象,例如:
向上(y=40.2f)和向后(z=-2.0f):
thing.move(0.0f,40.2f,-2.0f);
左/右
上/下
前/后
调整对象大小
尺度:
为了调整空间大小,在各个方向指定调整的元素:
长,高,宽。
0.0f到1.0f之间的值将收缩对象;比1.0f大的值将是对象变大;并且1.0f将保持这个方向不变。
各个方向用相同的值将成比例的调整对象的大小,用不同的值将伸缩对象。
示例:
使对象变成10倍长,1/10高,宽不变:
thing.setLocalScale(10.0f,0.1f,1.0f);
thing.scale(10.0f,0.1f,1.0f);
长度
高度
宽度
旋转对象
旋转:
3-D旋转有一点复杂。
简单说:
你能从三个幅度旋转对象:
倾角,偏移,转动。
重要:
你不能指定这个旋转在0°到360°,只能在0.0f到6.28f旋转(FastMath.PI*2)!
示例:
在Z轴旋转对象180°。
thing.rotate(0f,0f,FastMath.PI);
提示:
如果你的游戏需要一系列旋转,查找一下四元数是值得的,一种能高效结合和保存旋转的数据结构。
thing.setLocalRotation(newQuaternion().fromAngleAxis(FastMath.PI/2,newVector3f(1,0,0)));
倾角
偏移
转动
如何解除节点?
如果你得到了不希望的结果,检查一下是否你犯下了下边的普遍错误:
问题?
解决问题!
被创建的几何体没有出现在场景中
你附加它到(附加到根节点上的其它节点)根节点上了吗?
它有材料了吗?
它的位置是什么?
它被其它几何体覆盖了吗?
空间旋转错误
你用的是旋转值而不是度数吗?
你旋转的是你想要旋转的节点吗?
你旋转的是正确的幅度吗?
几何体出现了不希望的材料
你重用其它几何体的材料和不故意改变它的属性了吗?
结论
你已经学习到3D世界是一个空间的场景图:
可见的几何体和不可见的节点。
你能变换空间,或者把它们附加到节点上,然后变换节点。
由于像球体和方体已经远远不能满足我们,继续下一章我们将学习载入资源,如3-D模型。
1.3HelloAssets
在这个教程里,我们将学习用JME资源管理器把3D模型和文本载入到场景图中。
你还将学习如何达到正确的路径和使用哪种文件格式。
在一个新的jMonkeyPlatform工程里,为了使用这个例子,右击你的工程选择“Properties”,进入到“Libraries”,点击“AddLibrary”,并且添加“jme3-test-data”库文件。
示例代码
packagejme3test.helloworld;
importcom.jme3.app.SimpleApplication;
importcom.jme3.font.BitmapText;
importcom.jme3.light.DirectionalLight;
importcom.jme3.material.Material;
importcom.jme3.math.Vector3f;
importcom.jme3.scene.Geometry;
importcom.jme3.scene.Spatial;
importcom.jme3.scene.shape.Box;
/**示例3-怎么载入一个OBJ模型和OgreXML模型,材料,纹理,或文本。
*/
publicclassHelloAssetsextendsSimpleApplication{
publicstaticvoidmain(String[]args){
HelloAssetsapp=newHelloAssets();
app.start();
}
@Override
publicvoidsimpleInitApp(){
Spatialteapot=assetManager.loadModel("Models/Teapot/Teapot.obj");
Materialmat_default=newMaterial(
assetManager,"Common/MatDefs/Misc/ShowNormals.j3md");
teapot.setMaterial(mat_default);
rootNode.attachChild(teapot);
//用test_data里的简单纹理创建一面墙
Boxbox=newBox(Vector3f.ZERO,2.5f,2.5f,1.0f);
Spatialwall=newGeometry("Box",box);
Materialmat_brick=newMaterial(
assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
mat_brick.setTexture("ColorMap",
assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));
wall.setMaterial(mat_brick);
wall.setLocalTranslation(2.0f,-2.5f,0.0f);
rootNode.attachChild(wall);
//用默认的字体显示一行文本
guiNode.detachAllChildren();
guiFont=assetManager.loadFont("Interface/Fonts/Default.fnt");
BitmapTexthelloText=newBitmapText(guiFont,false);
helloText.setSize(guiFont.getCharSet().getRenderedSize());
helloText.setText("HelloWorld");
helloText.setLocalTranslation(300,helloText.getLineHeight(),0);
guiNode.attachChild(helloText);
//从t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JME 学习 文档 中文版