Cómo cargar un objeto 3d en Android?

Tengo el archivo de .obj y el archivo de .mtl pero no sé importarlo. He probado los tutoriales, que no están funcionando.

Una forma de cargar un objeto desde un archivo .obj es primero obtener el inputtream del archivo, luego pasar por cada línea, ya que una línea consta de un vértice. La parte donde a continuación, utilice los datos youre desde el archivo .obj para dibujarla acctually es algo que fácilmente puede encontrar un montón de tutoriales en línea, un ejemplo: http://www.droidnova.com/android-3d-game- Tutorial-parte-i, 312.html . Si quieres profundizar más en Opengl y aprender mucho, puedes utilizar Nehe the allmightys tutorial en línea que cubre mucho y entra bastante en la programación de OpenGL: http://nehe.gamedev.net/ .

De todos modos, la carga del archivo .obj podría comenzar por algo como esto:

while ((line = reader.readLine()) != null) { if (line.startsWith("f")) { faces++; processFLine(line); } else if (line.startsWith("vn")) { normals++; processVNLine(line); } else if (line.startsWith("vt")) { UVCoords++; processVTLine(line); } else if (line.startsWith("v")) { vertices++; processVLine(line); } } 

Para todo, excepto cuando la línea comienza con 'f' es bastante sencillo, sólo almacena dos o tres valores de thoose en algo, he preferido un Vector:

  private void processVNLine(String line) { String[] tokens = line.split("[ ]+"); int c = tokens.length; for (int i = 1; i < c; i++) { // add the normals to the normal vector _vn.add(Float.valueOf(tokens[i])); } } 

Para la parte de las caras (donde comienza la línea con 'f', preferiblemente primero comprobar cuántos '/' cada vértice consta de:

  private void processFLine(String line) { String[] tokens = line.split("[ ]+"); int c = tokens.length; if (tokens[1].matches("[0-9]+")) { caseFEqOne(tokens, c); } if (tokens[1].matches("[0-9]+/[0-9]+")) { caseFEqTwo(tokens, c); } if (tokens[1].matches("[0-9]+//[0-9]+")) { caseFEqOneAndThree(tokens, c); } if (tokens[1].matches("[0-9]+/[0-9]+/[0-9]+")) { caseFEqThree(tokens, c); } } 

Cada cara está construida por tres vértices, donde cada índice de vértices es v / vt / vn.

Esto es lo que podría pasar si tienes v / vt. Almacena los índices en vectores separados.

  private void caseFEqTwo(String[] tokens, int c) { for (int i = 1; i < c; i++) { Short s = Short.valueOf(tokens[i].split("/")[0]); s--; _vPointer.add(s); s = Short.valueOf(tokens[i].split("/")[1]); s--; _vtPointer.add(s); } } 

Ahora usted ha manejado esto agregando los índices en los vectores o los arrays del sperarate.

Ahora debes tener Vectores que consiste en coordenadas y vector que consiste en índices para cada tipo (v, vt o vn). Usted también debe tener el número de caras. Al conocer el número de caras que ahora se puede iniciar un bucle que va de 0 a número de caras.

Si ahora crea nuevos vectores que consisten en el resultado final, puede mover en este bucle las coordenadas en el índice desde el índice de bucle al índice de bucle en los vectores de resultados.

Esto puede necesitar un poco explenation tal vez aquí es un ejemplo sencillo:

 private void reArrange() { Iterator<Short> i; short s; i = _vPointer.iterator(); while (i.hasNext()) { s = (short) (i.next() * 3); for (int k = 0; k < 3; k++) { _vResult.add(_v.get(s + k)); } } i = _vnPointer.iterator(); while (i.hasNext()) { s = (short) (i.next() * 3); for (int k = 0; k < 3; k++) { _vnResult.add(_vn.get(s + k)); } } i = _vtPointer.iterator(); while (i.hasNext()) { s = (short) (i.next() * 2); for (int k = 0; k < 2; k++) { _vtResult.add(1f - _vt.get(s + k)); } } _indices = new short[faces * 3]; for (short k = 0; k < faces * 3; k++) { _indices[k] = k; } } 

Ahora your'e acctually hecho y tiene la información que usted necesita del archivo .obj. Por lo tanto, mediante la conversión de thoose vectores a FloatBuffers y mediante la creación de un ShortBuffer que es tan simple como 0,1,2,3,4,5 … y así sucesivamente puede utilizar thoose con OpenGL-ES para dibujar su objeto.

(Esto no es completamente escrito por mí, utilicé un concepto básico que encontré en algún lugar en línea, no puedo encontrar ahora tho, y luego lo hizo encajar muy bien a lo que quería y ajustado abit para llegar más fácil de entender)

Lo que esto no cubre es la parte en la que también se carga un archivo .mtl que a menudo obtendrá así durante la exportación de un objeto de un programa. Si quieres implementar eso también puedes echar un vistazo a esto: http://people.sc.fsu.edu/~jburkardt/data/mtl/mtl.html

Esto es algo que puede ser bueno tener si your'e la construcción de un objeto en un programa y desea una réplica más exacta donde esto le dará valores de cómo la luz debe ser manejado a los materiales también.

Si tiene alguna pregunta, no dude en preguntar.

(Sé que esto no puede ser la forma óptima de cargar un archivo .obj, ya que usamos hasta 9 vectores diferentes, pero si se utiliza la serialización también esto podría obtener acctually bastante rápido.)

OpenGL no es una biblioteca de escenas. Le proporciona un conjunto de sofisticadas herramientas de dibujo, pero nada más. Carga de modelos 3D, gestión de escenas, etc son todos dejado para que pueda implementar, o utilizar una biblioteca para.

Es muy tarde ahora … pero sigue siendo una solución útil: motor min3D ayuda a cargar el modelo 3d en android

Los siguientes son syeps:

1) Descargar Rajawali lib .

2) Crear una RenderActivity

Private Object3dContainer faceObject3D; Private Object3dContainer objModel;

  @Override public void initScene() { scene.lights().add(new Light()); scene.lights().add(new Light()); Light myLight = new Light(); myLight.position.setZ(150); scene.lights().add(myLight); IParser parser = Parser.createParser(Parser.Type.OBJ, getResources(), "com.azoi.opengltutor:raw/monster_high", true); parser.parse(); objModel = parser.getParsedObject(); objModel.scale().x = objModel.scale().y = objModel.scale().z = .7f; scene.addChild(objModel); } 

Add ur 3d modelo obj archivo en res / raw directorio … aquí es monster_high

Eso es todo … registrar la actividad en Manifest y ejecutar :).

Si desea mover el modelo 3d actualizar updateScene (..):

 public void updateScene() { super.updateScene(); objModel.rotation().x++; objModel.rotation().y--; objModel.rotation().z++; } 

Más aquí http://code.google.com/p/min3d/wiki/HowToLoadObjFile Disfrute 🙂

  • El ejemplo de Android openGL da una pantalla en blanco
  • ¿Cómo deshacerse de los bordes dentados en Android OpenGL ES?
  • Android OpenGL: relación de aspecto loco después de dormir
  • EGLConfig en HTC Desire, la configuración disponible cuelga el dispositivo
  • Crash con SurfaceView en Android NDK al pausar / reanudar la aplicación rápidamente
  • Compartir el contexto EGL2.0 entre 2 GLSurfaceViews causó EGL_BAD_ACCESS en las tabletas Android
  • Cómo mover un cuadrado OpenGL con el dedo?
  • Conversión de GLSurfaceView a TextureView (a través de GLTextureView)
  • Píxeles de lectura de Android desde GL_TEXTURE_EXTERNAL_OES
  • Cómo utilizar la biblioteca Assimp en Android NDK
  • Android NDK - OpenGL ES 2.0 - vinculación de la biblioteca
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.