Question

Iv'e a exporté un modèle dans Blender vers un fichier .obj. Iv'e a réussi à créer une classe très simple qui charge les sommets et les indices aux tableaux. Mon problème est que je veux également les coordonnées de texture (VT) et les normales (VN). Ainsi, par exemple, j'aurais besoin de 4 sommets * 6 faces pour qu'un simple cube puisse utiliser la texture mais je n'en reçois que 8 dans mon fichier .obj, ainsi que je n'ai aucune idée de la façon de gérer les indices pour VT car je ne peux avoir qu'un seul tableau / tampon pour les indices, mais j'obtiens deux V / VT différents dans le fichier .obj.

Y a-t-il un chargeur qui ne renvoie que des tableaux ou similaires pour le sommet, la texture, les normales et un tableau d'indices? Ou des exemples de comment en écrire un? Iv'e n'a trouvé que des chargeurs dans des moteurs 3D complets jusqu'à présent et ce n'est pas ce que je veux.

Était-ce utile?

La solution

4 sommets * 6 faces sont plus que ce dont vous avez besoin. En fait, ce ne sera pas efficace. Les sommets exportés que vous avez sont optimisés avec des index. À l'aide d'OpenGL-ES, vous pouvez pointer à partir de l'endroit où obtenir des sommets (tableau), puis dessiner des sommets en utilisant leurs index dans un autre tableau. En conséquence, vous obtenez 8 sommets par rapport aux 24 sommets possibles, vous avez besoin de moins de mémoire pour stocker. L'efficacité est donc 16/24 * 100%. Imaginez que vous aurez un modèle avec 1000 sommets.

L'index du sommet signifie que dans un autre tableau avec un GPU de décalage approprié obtiendra un sommet (size_of_vertex (3 flotteurs) * index) et un décalage approprié pour les coordonnées UV (size_of_uvcoord (2 flotteurs) * Index)

Ce code pour OpenGL ES 2.0 mais vous pouvez avoir une idée:

GLES20.glUseProgram(programTextured);

GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);
sqTex.getVertexBuffer().position(sqTex.VERT_OFFSET);
GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(programTextured, "aPosition") 3,                                    GLES20.GL_FLOAT, false, 5 * 4, sqTex.getVertexBuffer());               GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(programTextured, "aPosition"));

sqTex.getVertexBuffer().position(sqTex.TEXT_OFFSET);
GLES20.glVertexAttribPointer(
                                GLES20.glGetAttribLocation(programTextured, "aTextureCoord"), 2,
                                GLES20.GL_FLOAT, false, 5 * 4, sqTex.getVertexBuffer());
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, sqTex.getIndexBuffer());

et Sqtex est une instance de texturéSquare:

public class TexturedSquare {

        // private float[] vertices=new float[4];

        float vertices[] = { -1.0f, -1.0f, 0.0f,0.0f,0.0f, // 0, Top Left  //x,y,z,u,v
                        1.0f, -1.0f, 0.0f,0.0f,1.0f, // 1, Bottom Left
                        1.0f, 1.0f, 0.0f,1.0f,1.0f, // 2, Bottom Right
                        -1.0f, 1.0f, 0.0f,1.0f,0.0f, // 3, Top Right
        };

        public static int VERT_OFFSET=0;
        public static int TEXT_OFFSET=3;

        short[] indices = { 0, 1, 2, 2, 3, 0 };;

        // Our vertex buffer.
        private FloatBuffer vertexBuffer;

        // Our index buffer.
        private ShortBuffer indexBuffer;

        public TexturedSquare()
        {
                ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
                vbb.order(ByteOrder.nativeOrder());
                vertexBuffer = vbb.asFloatBuffer();
                vertexBuffer.put(vertices);
                vertexBuffer.position(0);

                // short is 2 bytes, therefore we multiply the number if
                // vertices with 2.
                ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
                ibb.order(ByteOrder.nativeOrder());
                indexBuffer = ibb.asShortBuffer();
                indexBuffer.put(indices);
                indexBuffer.position(0);

        }

        FloatBuffer getVertexBuffer(){
                return vertexBuffer;
        }

        ShortBuffer getIndexBuffer(){
                return indexBuffer;
        }



}

Autres conseils

Regardez un JPCT (ou JPCT-AE), c'est une bibliothèque 3D exellante pour Java (et / ou Android). Il prend en charge le chargement 3DS / OBJ hors de la boîte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top