LIBGDX APICargaModelos3D

De MediaWiki
Saltar a: navegación, buscar

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