Saltar al contenido

Cómo cargar y mostrar un archivo .obj en Android con OpenGL-ES 2

Indagamos en el mundo online para de este modo darte la respuesta para tu duda, en caso de dudas deja tu inquietud y te contestaremos porque estamos para servirte.

Solución:

Terminé escribiendo un nuevo analizador, se puede usar así para construir FloatBuffers para usar en su Renderer:

ObjLoader objLoader = new ObjLoader(context, "Mug.obj");

numFaces = objLoader.numFaces;

// Initialize the buffers.
positions = ByteBuffer.allocateDirect(objLoader.positions.length * mBytesPerFloat)
        .order(ByteOrder.nativeOrder()).asFloatBuffer();
positions.put(objLoader.positions).position(0);

normals = ByteBuffer.allocateDirect(objLoader.normals.length * mBytesPerFloat)
        .order(ByteOrder.nativeOrder()).asFloatBuffer();
normals.put(objLoader.normals).position(0);

textureCoordinates = ByteBuffer.allocateDirect(objLoader.textureCoordinates.length * mBytesPerFloat)
        .order(ByteOrder.nativeOrder()).asFloatBuffer();
textureCoordinates.put(objLoader.textureCoordinates).position(0);

y aquí está el analizador:

public final class ObjLoader 

    public final int numFaces;

    public final float[] normals;
    public final float[] textureCoordinates;
    public final float[] positions;

    public ObjLoader(Context context, String file) 

        Vector vertices = new Vector<>();
        Vector normals = new Vector<>();
        Vector textures = new Vector<>();
        Vector faces = new Vector<>();

        BufferedReader reader = null;
        try 
            InputStreamReader in = new InputStreamReader(context.getAssets().open(file));
            reader = new BufferedReader(in);

            // read file until EOF
            String line;
            while ((line = reader.readLine()) != null) 
                String[] parts = line.split(" ");
                switch (parts[0]) 
                    case "v":
                        // vertices
                        vertices.add(Float.valueOf(parts[1]));
                        vertices.add(Float.valueOf(parts[2]));
                        vertices.add(Float.valueOf(parts[3]));
                        break;
                    case "vt":
                        // textures
                        textures.add(Float.valueOf(parts[1]));
                        textures.add(Float.valueOf(parts[2]));
                        break;
                    case "vn":
                        // normals
                        normals.add(Float.valueOf(parts[1]));
                        normals.add(Float.valueOf(parts[2]));
                        normals.add(Float.valueOf(parts[3]));
                        break;
                    case "f":
                        // faces: vertex/texture/normal
                        faces.add(parts[1]);
                        faces.add(parts[2]);
                        faces.add(parts[3]);
                        break;
                
            
         catch (IOException e) 
            // cannot load or read file
         finally 
            if (reader != null) 
                try 
                    reader.close();
                 catch (IOException e) 
                    //log the exception
                
            
        

        numFaces = faces.size();
        this.normals = new float[numFaces * 3];
        textureCoordinates = new float[numFaces * 2];
        positions = new float[numFaces * 3];
        int positionIndex = 0;
        int normalIndex = 0;
        int textureIndex = 0;
        for (String face : faces) 
            String[] parts = face.split("/");

            int index = 3 * (Short.valueOf(parts[0]) - 1);
            positions[positionIndex++] = vertices.get(index++);
            positions[positionIndex++] = vertices.get(index++);
            positions[positionIndex++] = vertices.get(index);

            index = 2 * (Short.valueOf(parts[1]) - 1);
            textureCoordinates[normalIndex++] = textures.get(index++);
            // NOTE: Bitmap gets y-inverted
            textureCoordinates[normalIndex++] = 1 - textures.get(index);

            index = 3 * (Short.valueOf(parts[2]) - 1);
            this.normals[textureIndex++] = normals.get(index++);
            this.normals[textureIndex++] = normals.get(index++);
            this.normals[textureIndex++] = normals.get(index);
        
    

Prueba con este proyecto que me encontró en Github. https://github.com/WenlinMao/android-3d-model-viewer

Esta es una demostración de OpenGL ES 2.0. Es una aplicación de Android con un motor 3D que puede cargar archivos Wavefront OBJ, STL, DAE y glTF. La aplicación se basa en el proyecto de andresoviedo que se puede encontrar aquí con una función adicional de carga y renderizado en formato glTF.

El propósito de esta aplicación es aprender y compartir cómo dibujar usando OpenGLES y Android. Como esta es mi primera aplicación para Android, es muy probable que haya errores; pero intentaré seguir mejorando la aplicación y agregando más funciones.

¡Este proyecto es de código abierto y contiene clases que pueden resolver su problema!

Finalizando este artículo puedes encontrar las notas de otros usuarios, tú igualmente eres capaz mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *