第七章:加载3D模型
在 jME3 中,3D模型被加载为 com.jme3.scene.Geometry
或 com.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
。