libgdx 3D 从资源文件加载模型

1. 资源下载:https://github.com/xoppa/blog/tree/master/tutorials/assets/loadmodels/data

把资源文件放到android/assets/data下

别忘了将Run Config的working directory指向assets

2. 代码

 1 package com.mygdx.game;
 2 
 3 import com.badlogic.gdx.ApplicationAdapter;
 4 import com.badlogic.gdx.Gdx;
 5 import com.badlogic.gdx.assets.AssetManager;
 6 import com.badlogic.gdx.graphics.GL20;
 7 import com.badlogic.gdx.graphics.PerspectiveCamera;
 8 import com.badlogic.gdx.graphics.g3d.*;
 9 import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
10 import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
11 import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
12 import com.badlogic.gdx.utils.Array;
13 
14 public class MyGdxGame2 extends ApplicationAdapter {
15     public Environment environment;//可以包含点光源集合和线光源集合
16     public PerspectiveCamera cam;//3D视角
17     public CameraInputController camController;//视角控制器
18 
19     public AssetManager assets;
20     public Array<ModelInstance> instances = new Array<ModelInstance>();
21     public ModelBatch modelBatch;
22 
23     public boolean loading;
24 
25     @Override
26     public void create () {
27         environment = new Environment();
28         environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));//环境光
29         environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));//直线光源
30 
31         modelBatch = new ModelBatch();
32         cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());//67可以理解成一个定值,视角宽度(67度)
33         cam.position.set(10f, 10f, 10f);
34         cam.lookAt(0,0,0);
35         cam.near = 1f;
36         cam.far = 300f;
37         cam.update();
38 
39         camController = new CameraInputController(cam);
40         Gdx.input.setInputProcessor(camController);
41 
42         assets = new AssetManager();
43         assets.load("data/ship.obj", Model.class);
44         loading = true;
45 
46     }
47 
48     private void doneLoading() {
49         Model ship = assets.get("data/ship.obj", Model.class);
50         ModelInstance shipInstance = new ModelInstance(ship);
51         instances.add(shipInstance);
52         loading = false;
53     }
54 
55     @Override
56     public void render () {
57         if (loading && assets.update()){
58             doneLoading();
59         }
60 
61         camController.update();
62         Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
63         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
64 
65         modelBatch.begin(cam);
66         modelBatch.render(instances,environment);
67         modelBatch.end();
68     }
69 
70     @Override
71     public void dispose() {
72         modelBatch.dispose();
73         instances.clear();
74         assets.dispose();
75         super.dispose();
76     }
77 }

3. 截图

4. 多个实例

 1 private void doneLoading() {
 2         Model ship = assets.get("data/ship.obj", Model.class);
 3         for (float x = -5f; x <= 5f; x += 2f) {
 4             for (float z = -5f; z <= 5f; z += 2f) {
 5                 ModelInstance shipInstance = new ModelInstance(ship);
 6                 shipInstance.transform.setToTranslation(x, 0, z);//设置位置
 7                 instances.add(shipInstance);
 8             }
 9         }
10         loading = false;
11     }

 5. obj文件对于目前测试用是没有问题的,但是实际应用中,模型要复杂得多,obj貌似支持不了。

libgdx支持两种文件格式,g3db(二进制)和g3dj(json)。

可以使用 fbx-conv工具进行格式转换,支持的格式FBX/Collada/Obj。FBX是大多数3d建模软件都支持的。

工具主页:https://github.com/libgdx/fbx-conv

原文地址:https://www.cnblogs.com/hanhongmin/p/3844948.html