LIBGDX APICargaModelos3D

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

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();
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:

LIBGDX UD5 CargaModelos3D 1.jpg




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:


LIBGDX UD5 CargaModelos3D 2.jpg


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).