LIBGDX APICargaModelos3D
UNIDADE 5: Carga Modelos 3D.
Introdución
O obxectivo deste punto é amosar como podemos cargar os modelos utilizando a nova API 3D.
Neste punto podedes cargar calquera modelo que atoparedes por Internet ou un voso.
Lembrar que é mellor ter o modelo en formato binario que en formato obj.
Tedes neste enlace como cambiar de formato.
Tamén imos facer uso da clase AssetManager explicada anteriormente.
Preparación:
- Descomprime o arquivo Ship.zip e copia o seu contido ó cartafol /assets/ da versión Android: Media:Ship.zip
- Copia a clase EX_1_DefinicionLuz do punto anterior e pon de nome EX_2_CargaModelos.
- Crea unha nova clase de nome EX_2_CargaModelos e copia o contido seguinte:
Código da clase EX_2_CargaModelosInicial
1 import com.badlogic.gdx.Gdx;
2 import com.badlogic.gdx.Screen;
3 import com.badlogic.gdx.graphics.GL20;
4 import com.badlogic.gdx.graphics.PerspectiveCamera;
5 import com.badlogic.gdx.graphics.g3d.Environment;
6 import com.badlogic.gdx.graphics.g3d.ModelBatch;
7 import com.badlogic.gdx.graphics.g3d.ModelInstance;
8 import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
9 import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
10 import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
11
12
13
14 public class EX_2_CargaModelos implements Screen {
15
16 private PerspectiveCamera camara3d;
17 private ModelInstance modeloInstancia;
18 private ModelBatch modelBatch;
19
20
21 private Environment environment;
22 private CameraInputController camController;
23
24 public EX_2_CargaModelosInicial(){
25 camara3d = new PerspectiveCamera();
26 camController = new CameraInputController(camara3d);
27 Gdx.input.setInputProcessor(camController);
28
29 modelBatch = new ModelBatch();
30 environment = new Environment();
31 environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
32 environment.add(new DirectionalLight().set(1f, 1f, 1f, 1f, 0f, 0f));
33
34
35 }
36
37 @Override
38 public void render(float delta) {
39 // TODO Auto-generated method stub
40 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
41
42 camController.update();
43
44 modelBatch.begin(camara3d);
45
46
47
48 modelBatch.end();
49 }
50
51 @Override
52 public void resize(int width, int height) {
53 // TODO Auto-generated method stub
54
55 camara3d.fieldOfView=67;
56 camara3d.viewportWidth=width;
57 camara3d.viewportHeight=height;
58
59 Gdx.input.setInputProcessor(camController);
60
61 camara3d.position.set(0f,0f,15f);
62 camara3d.lookAt(0,0,0);
63 camara3d.near=1;
64 camara3d.far=300f;
65 camara3d.update();
66
67
68 }
69
70 @Override
71 public void show() {
72 // TODO Auto-generated method stub
73 }
74
75 @Override
76 public void hide() {
77 // TODO Auto-generated method stub
78
79 }
80
81 @Override
82 public void pause() {
83 // TODO Auto-generated method stub
84
85 }
86
87 @Override
88 public void resume() {
89 // TODO Auto-generated method stub
90
91 }
92
93 @Override
94 public void dispose() {
95 // TODO Auto-generated method stub
96
97 modelBatch.dispose();
98
99 }
100
101 }
- Modifica a clase PracticasNovaApi3D para que chame á clase EX_2_CargaModelos
Carga de Modelos
Un só modelo
A carga de modelos utilizando a clase AssetManager non ten moito problema:
- Instanciamos a clase AssetManager.
1 AssetManager assets = new AssetManager();
- Chamamos ó método load cargando o modelo obj ou g3db se o convertimos anteriormente.
1 assets.load("ship.obj", Model.class);
2 assets.finishLoading();
- Obtemos o Model a partires do modelo cargado. A partires de aquí é o mesmo que no explicado no punto anterior.
1 Model model = assets.get("ship.obj", Model.class);
2 modeloInstancia = new ModelInstance(model);
- Renderizamos o ModelInstace (é o que determina a posición do modelo no espazo 3D).
1 @Override
2 public void render(float delta) {
3 // TODO Auto-generated method stub
4 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
5
6 camController.update();
7
8 modelBatch.begin(camara3d);
9
10 modelBatch.render(modeloInstancia,environment);
11
12 modelBatch.end();
13 }
Ó final teremos como resultado isto:
Múltiples modelos
Preparación:
- Descargade este arquivo e o descomprimides no cartafol /assets/ da versión Android: Media:LIBGDX_cubo.zip.
Como veredes ven o obj en forma binaria.
Agora imos cargar este cubo xunto coa nave.
Para facelo temos que definir un array de ModelInstance.
Lembrar que a clase ModelInstance vai gardar nunha matriz a posición, rotación e escalado do modelo cargado.
Polo tanto:
- Definimos o array de ModelInstance:
1 private Array<ModelInstance> instances;
- Instanciamos o array, normalmente no constructor:
1 instances = new Array<ModelInstance>();
- Cargamos os modelos no AssetManager:
1 AssetManager assets = new AssetManager();
2 assets.load("ship.obj", Model.class);
3 assets.load("cube.g3db", Model.class);
4 assets.finishLoading();
5
6 Model modelNave = assets.get("ship.obj", Model.class);
7 Model modelCubo = assets.get("cube.g3db", Model.class);
- Unha vez cargados os modelos, os engadimos ó array:
1 instances.add(new ModelInstance(modelNave));
2 instances.add(new ModelInstance(modelCubo));
Nota: Fixarse que agora o array ten dous ModelInstance (na posición 0 está a nave e na 1 o cubo).
No seguinte punto imos explicar como mover cada un deles, polo de agora só poñemos o código e o explicamos posteriormente.
- Movemos o cubo para que non coincida na mesma posición cá nave.
1 instances.get(0).transform.setToTranslation(2, 2, 2);
- Renderizamos o array completo:
1 @Override
2 public void render(float delta) {
3 // TODO Auto-generated method stub
4 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
5
6 camController.update();
7
8 modelBatch.begin(camara3d);
9
10 modelBatch.render(instances,environment);
11
12 modelBatch.end();
13 }
- Liberamos o array:
1 @Override
2 public void dispose() {
3 // TODO Auto-generated method stub
4
5 modelBatch.dispose();
6 instances.clear();
7
8
9 }
Dará como resultado isto:
Código da clase EX_2_CargaModelos
Obxectivo: Visualizar varios modelos.
1 import com.badlogic.gdx.Gdx;
2 import com.badlogic.gdx.Screen;
3 import com.badlogic.gdx.assets.AssetManager;
4 import com.badlogic.gdx.graphics.GL20;
5 import com.badlogic.gdx.graphics.PerspectiveCamera;
6 import com.badlogic.gdx.graphics.g3d.Environment;
7 import com.badlogic.gdx.graphics.g3d.Model;
8 import com.badlogic.gdx.graphics.g3d.ModelBatch;
9 import com.badlogic.gdx.graphics.g3d.ModelInstance;
10 import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
11 import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
12 import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
13 import com.badlogic.gdx.utils.Array;
14
15
16
17 public class EX_2_CargaModelosInicial implements Screen {
18
19 private PerspectiveCamera camara3d;
20 private ModelBatch modelBatch;
21
22 private Array<ModelInstance> instances;
23
24
25 private Environment environment;
26 private CameraInputController camController;
27
28 public EX_2_CargaModelosInicial(){
29 camara3d = new PerspectiveCamera();
30 camController = new CameraInputController(camara3d);
31 Gdx.input.setInputProcessor(camController);
32
33 modelBatch = new ModelBatch();
34 environment = new Environment();
35 environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
36 environment.add(new DirectionalLight().set(1f, 1f, 1f, 1f, 0f, 0f));
37
38 instances = new Array<ModelInstance>();
39
40 AssetManager assets = new AssetManager();
41 assets.load("ship.obj", Model.class);
42 assets.load("cube.g3db", Model.class);
43 assets.finishLoading();
44
45 Model modelNave = assets.get("ship.obj", Model.class);
46 Model modelCubo = assets.get("cube.g3db", Model.class);
47
48 instances.add(new ModelInstance(modelNave));
49 instances.add(new ModelInstance(modelCubo));
50
51 instances.get(0).transform.setToTranslation(2, 2, 2);
52
53
54
55 }
56
57 @Override
58 public void render(float delta) {
59 // TODO Auto-generated method stub
60 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
61
62 camController.update();
63
64 modelBatch.begin(camara3d);
65
66 modelBatch.render(instances,environment);
67
68 modelBatch.end();
69 }
70
71 @Override
72 public void resize(int width, int height) {
73 // TODO Auto-generated method stub
74
75 camara3d.fieldOfView=67;
76 camara3d.viewportWidth=width;
77 camara3d.viewportHeight=height;
78
79 Gdx.input.setInputProcessor(camController);
80
81 camara3d.position.set(0f,0f,15f);
82 camara3d.lookAt(0,0,0);
83 camara3d.near=1;
84 camara3d.far=300f;
85 camara3d.update();
86
87
88 }
89
90 @Override
91 public void show() {
92 // TODO Auto-generated method stub
93 }
94
95 @Override
96 public void hide() {
97 // TODO Auto-generated method stub
98
99 }
100
101 @Override
102 public void pause() {
103 // TODO Auto-generated method stub
104
105 }
106
107 @Override
108 public void resume() {
109 // TODO Auto-generated method stub
110
111 }
112
113 @Override
114 public void dispose() {
115 // TODO Auto-generated method stub
116
117 modelBatch.dispose();
118 instances.clear();
119
120
121 }
122
123 }
-- Ángel D. Fernández González -- (2014).