在本教程中,我们创建一个3D场景。
本篇教程你需要了解场景图
创建一个3D游戏时:
本篇教程中,你将了解如何使用节点作为句柄来操作场景图中的对象,以及rootNode为什么很重要,你将学习如何创建简单对象,如何让它们携带自定义数据(例如健康值),以及如何通过移动、缩放和旋转来“转换”它们。你将理解场景图中如下两种“Spatials”类型之间的区别:
|你想做什么?|用 jme3术语怎么说 | |-|-| |布置3 d 场景|填充场景图| |创建场景对象|创建 Spatials (例如创建几何图形Geometries)| |让一个物体出现在场景中|将 Spatial 附加到 rootNode| |让一个物体从场景中消失|从 rootNode 移除 Spatial| |定位/移动、旋转或调整对象的大小|平移、旋转或缩放一个对象 = 转换一个对象|
每个 jme3应用程序都有一个 rootNode: 您的游戏自动从 SimpleApplication 继承 rootNode 对象。所有添加到 rootNode 的对象都是场景图的一部分。场景图中的每一个元素都是一个Spatials。
||Geometry|Node| |-|-|-| |是否可见|一个Geometry是一个可见对象|一个Node是场景图中不可见的一个“句柄”| |用途|一个Geometry为场景图中的一个可见对象|Node可以组合Geometry或者其他的Node| |示例|盒子、球体、玩家、建筑物、地形、车辆、导弹、 npc 等|rootNode,一个楼层节点,将多个地形分组,一个定制的载客汽车节点,一个带武器的玩家节点,一个音频节点等|
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.shape.Box;
/**
* 如何使用节点作为句柄来操作场景图中的对象.
* 可以通过操作对象的父节点来旋转、平移和旋转对象.
* 根节点是一个特殊的节点,只有添加到根节点的节点才会出现在场景图中.
*/
public class HelloNode extends SimpleApplication {
public static void main(String[] args){
HelloNode app = new HelloNode();
app.start();
}
@Override
public void simpleInitApp() {
// 在坐标(1, -1, 1)创建一个蓝色的Box
Box box1 = new Box(1,1,1);
Geometry blue = new Geometry("Box", box1);
blue.setLocalTranslation(new Vector3f(1,-1,1));
Material mat1 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color", ColorRGBA.Blue);
blue.setMaterial(mat1);
// 在坐标(1,3,1)的蓝色上方直接创建一个红色的盒子
Box box2 = new Box(1,1,1);
Geometry red = new Geometry("Box", box2);
red.setLocalTranslation(new Vector3f(1,3,1));
Material mat2 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
mat2.setColor("Color", ColorRGBA.Red);
red.setMaterial(mat2);
// 在坐标(0,0,0)处创建一个 pivot 节点,并将其附加到根节点
Node pivot = new Node("pivot");
rootNode.attachChild(pivot);
// 将两个盒子连接到 pivot 节点(并传递到根节点)
pivot.attachChild(blue);
pivot.attachChild(red);
// 旋转枢轴节点: 此时两个框都已旋转!
pivot.rotate(.4f,.4f,0f);
}
}
运行上面的代码,可以看到如下效果: