JME学习文档中文版Word文档格式.docx

上传人:b****5 文档编号:20940393 上传时间:2023-01-26 格式:DOCX 页数:72 大小:435.94KB
下载 相关 举报
JME学习文档中文版Word文档格式.docx_第1页
第1页 / 共72页
JME学习文档中文版Word文档格式.docx_第2页
第2页 / 共72页
JME学习文档中文版Word文档格式.docx_第3页
第3页 / 共72页
JME学习文档中文版Word文档格式.docx_第4页
第4页 / 共72页
JME学习文档中文版Word文档格式.docx_第5页
第5页 / 共72页
点击查看更多>>
下载资源
资源描述

JME学习文档中文版Word文档格式.docx

《JME学习文档中文版Word文档格式.docx》由会员分享,可在线阅读,更多相关《JME学习文档中文版Word文档格式.docx(72页珍藏版)》请在冰豆网上搜索。

JME学习文档中文版Word文档格式.docx

*观看它。

*/

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()方法:

通常情况下,你都是从你的Java应用程序主方法开始做。

提示:

高级Java开发人员可能要做一个SimpleApplication复制品并且使用它作为一个模板,自定义应用程序类。

初始化场景

这个简单的“游戏”只有一个立方体组成。

下面是我们如何创建它,定位它,给它一个颜色,并且将它附加到场景。

(之后我们将有一个详细的介绍)。

Box(Vector3f.ZERO,1,1,1);

//创建立方体形状

//创建多维的几何形状

Materialmat=newMaterial(assetManager,

"

//创建一个简单的材料

//设置材料的颜色

//设置立方体的材料

//将立方体附加到场景中去

这个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世界在场景图中是一个代表以及根节点重要的原因。

你将学习如何创建简单的对象,以及如何改造它们-移动,缩放,旋转。

你将了解在场景图中,节点和几何图两种类型之间的区别。

为了对场景图有一个视觉上的介绍,请看我们的示例展示。

importcom.jme3.scene.Node;

/**示例2-如何使用节点作为手柄操纵场景图中的对象。

你可以通过操纵*它们的父节点来旋转,平移,缩放对象。

根节点是特殊的:

只有附加到根*节点上的东西才会出现在场景中。

publicclassHelloNodeextendsSimpleApplication{

HelloNodeapp=newHelloNode();

//在坐标(1,-1,1)处创建一个蓝色盒子

Boxbox1=newBox(newVector3f(1,-1,1),1,1,1);

Geometryblue=newGeometry("

box1);

Materialmat1=newMaterial(assetManager,"

mat1.setColor("

blue.setMaterial(mat1);

//在蓝色盒子上边坐标为(1,3,1)处垂直创建一个红色盒子

Boxbox2=newBox(newVector3f(1,3,1),1,1,1);

Geometryred=newGeometry("

box2);

Materialmat2=newMaterial(assetManager,"

mat2.setColor("

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)上。

●我们给予它一个蓝色的固体材料。

2.我们创建了第二个盒子几何体。

●这个盒子几何体也是2x2x2单位大。

●我们放置这个盒子在坐标(1,3,1)上。

它垂直在蓝色盒子的上边。

它们之间的空隙为两个单位大。

●我们给予它一个红色的固体材料。

3.我们创建了一个节点。

●这个节点默认是放置在坐标(0,0,0)上。

●我们附加这个节点到根节点上。

●这个附加的节点在场景中是不可见的。

4.注意,我们还没有把两个盒子附加到任何东西上。

●如果我们这是运行应用程序,场景图中将不会出现任何东西。

5.我们附加两个盒子到节点上。

●如果我们这是运行应用程序,我们将会看到两个盒子:

一个垂直在另一个上。

6.现在我们旋转这个节点。

●我们现在运行这个应用程序,我们看到两个盒子在彼此之上-并且都在相同的倾斜角度上。

发生了什么?

我们附加两个盒子几何体到一个节点上。

接着我们把这个节点作为手柄去抓取两个盒子,并且同时变换(旋转)它们,这是一个普通的任务,并且在你的游戏中当你移动游戏角色时你将用到这个方法。

定义:

几何体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("

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”库文件。

importcom.jme3.font.BitmapText;

importcom.jme3.light.DirectionalLight;

importcom.jme3.scene.Spatial;

/**示例3-怎么载入一个OBJ模型和OgreXML模型,材料,纹理,或文本。

publicclassHelloAssetsextendsSimpleApplication{

publicstaticvoidmain(String[]args){

HelloAssetsapp=newHelloAssets();

Spatialteapot=assetManager.loadModel("

Models/Teapot/Teapot.obj"

Materialmat_default=newMaterial(

assetManager,"

teapot.setMaterial(mat_default);

rootNode.attachChild(teapot);

//用test_data里的简单纹理创建一面墙

Boxbox=newBox(Vector3f.ZERO,2.5f,2.5f,1.0f);

Spatialwall=newGeometry("

box);

Materialmat_brick=newMaterial(

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 判决书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1