有些情况下在加载游戏模型的时候需要控制一些加载的进度,因此可以用G3dModelLoader来代替 AssetManager进行资源加载
ModelLoader modelLoader = new G3dModelLoader(new JsonReader());
ModelData modelData = modelLoader.loadModelData(Gdx.files.internal("data/data.g3dj"));
Model model = new Model(modelData, new TextureProvider.FileTextureProvider());
for (int i = 0; i < model.nodes.size; i++) {
//Todo: do sth
}
在这里,可以通过实现TextureProvider来对textures做更多的控制与操作
ModelData 包含了原始的Model资源,基本上一一对应的包含了所有文件格式,但是并没有包含任何资源,
其中用float和short数组替代了Mesh,以及用只包含了纹理文件名的textures替代了真实的纹理资源
ModelInstance中包含了Model中的部分类型,如materials,nodes和animations数组,这些东西都是ModelInstance在构造的时候从Model中copy来的(注意是copy不是引用)这其实意味着你要修改某一Model的materials的时候不会影响其他的Model
ModelInstance中并没有像Model一样包含 Mesh跟 MeshPart数组,它是通过对Node (NodePart)进行引用来实现的,所以Mesh会被共享在若干个Model对象里面,也会包含在纹理和材质里面,牵一发而动全身
NodePart 是一个Model中最小的组成部分,用来描述如何去渲染一个Model,它包含了MeshPart 以及 Material。一个Renderable也同样包含这些值跟transform,lights,shader,userData一起提供
调用ModelBatch.render(ModelInstance)的时候,ModelInstance中的所有节点将转换到Renderable中然后用ModelBatch绘制
Tips
- 加载
g3dj
格式的模型时G3dModelLoader使用JsonReader
参数类型- 加载
g3db
格式模型时G3dModelLoader使用UBJsonReader
参数类型