第七章:加载3D模型

在 jME3 中,3D模型被加载为 com.jme3.scene.Geometrycom.jme3.scene.Node 对象,它们都是 com.jme3.scene.Spatial 的子类。

单个 Geometry 储存了三角网格(Mesh)和材质(Material);多个 Geometry 可以通过 Node 组成复杂的模型。

加载模型的代码

直接加载源数据格式的 3D 模型,代码如下:

Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.mesh.xml");
rootNode.attachChild(elephant);

加载 .j3o 模型的代码如下:

Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.j3o");
rootNode.attachChild(elephant);

ModelKey

除了直接使用资产路径 Models/Monkey/monkey.j3o 来加载模型,还可以使用 ModelKey 和 loadAsset 方法。

ModelKey modelKey = new ModelKey("Models/Monkey/monkey.j3o");
Spatial model = assetManager.loadAsset(key);
rootNode.attachChild(model);

ModelKey 的主要作用是管理缓存。通过 deleteFromCache() 可以释放 AssetManager 缓存的模型,否则模型所占用的内存是不会被GC回收的。

assetManager.deleteFromCache(modelKey);

目前先介绍到这里,以后的章节会详细讨论 AssetManager 的缓存机制。

模型不显示?

情况一:模型加载后,要添加到 rootNode 才会显示出来。

Spatial monkey = assetManager.loadModel("Models/Monkey/monkey.j3o");
rootNode.attachChild(monkey);// <----- 重要

情况二:模型使用了光照材质,但是场景中没有添加光源,导致画面一片漆黑。向 rootNode 添加光源即可。

// 添加平行光
DirectionalLight sun = new DirectionalLight();
sun.setColor(new ColorRGBA(0.7f, 0.7f, 0.7f, 1f));
sun.setDirection(new Vector3f(-3, -4, -5).normalizeLocal());
rootNode.addLight(sun);
// 添加环境光
AmbientLight ambient = new AmbientLight();
ambient.setColor(new ColorRGBA(0.2f, 0.2f, 0.2f, 1f));
rootNode.addLight(ambient);

情况三:若模型本身不包含材质(例如单独的 .obj 文件),你需要为其设置一个材质,否则将无法正常显示。

Spatial teapot = assetManager.loadModel("Models/Teapot/Teapot.j3o");
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); // 默认无光材质
teapot.setMaterial(mat);
rootNode.attachChild(teapot);

情况四:模型的尺寸太大,画面中只能看到模型的很小一部分;模型尺寸太小,根本看不清。使用 Spatial.scale(float s) 方法调整模型的比例即可。

Spatial mondel = assetManager.loadModel("Models/Ashe/b_ashe.obj");
model.scale(0.01f);// 把模型缩小成原来的 1/100 。
rootNode.attachChild(model);

转换j3o

一般来说,建议用 SDK 将3D模型转化为 .j3o 文件后再加载。如果你不知道怎么转换,可以参考这两篇文章:

注意,JME3不建议直接加载源数据格式。如果你一定要在游戏中直接加载 .blend.fbx.gltf 等文件格式,需要在项目的依赖中添加对应的插件模块。

  • jme3-blender-{version}.jar 用于加载 .blend 文件
  • jme3-plugins-{version}.jar 用于加载 .mesh.xml、.fbx、.gltf

{version}表示版本号,如 jme3-blender-3.1.0-stable.jar