Frage

Ich habe ein Modell in Blender in eine OBJ-Datei exportiert.Ich habe es geschafft, eine sehr einfache zu erstellen Klasse, die Scheitelpunkte und Indizes in Arrays lädt.Mein Problem ist, dass ich auch die Texturkoordinaten (vt) und Normalen (vn) haben möchte.Zum Beispiel würde ich 4 Eckpunkte * 6 Flächen für einen einfachen Würfel benötigen, um Textur verwenden zu können, aber ich bekomme nur 8 in meiner OBJ-Datei, und ich habe keine Ahnung, wie ich mit den Indizes umgehen sollvt da ich nur ein Array / Puffer für Indizes haben kann, aber ich bekomme zwei verschiedene v / vt in der OBJ-Datei.

Gibt es da draußen einen Loader, der nur Arrays oder ähnliches für Vertex, Textur, Normalen und ein Array von Indizes zurückgibt?Oder Beispiele, wie man einen schreibt?Ich habe bisher nur Lader in kompletten 3D-Engines gefunden und das ist nicht das, was ich will.

War es hilfreich?

Lösung

4 Eckpunkte * 6 Flächen sind mehr als Sie benötigen.Eigentlich wird es nicht effizient sein.Exportierte Scheitelpunkte, die Sie haben, werden mit Indizes optimiert.Mit Opengl-es können Sie zeigen, woher Sie Scheitelpunkte (Array) erhalten, und dann Scheitelpunkte mithilfe ihrer Indizes in einem anderen Array zeichnen.Als Ergebnis erhalten Sie 8 Scheitelpunkte gegenüber möglichen 24 Scheitelpunkten. Sie benötigen weniger Speicher zum Speichern.Die Effizienz beträgt also 16/24 * 100%.Stellen Sie sich vor, Sie haben ein Modell mit 1000 Eckpunkten.

Scheitelpunktindex bedeutet, dass in einem anderen Array mit einem geeigneten Versatz die GPU einen Scheitelpunkt (size_of_vertex (3 Floats) * Index) und einen geeigneten Versatz für UV-Koordinaten (size_of_UVcoord (2 Floats) * Index) erhält

diesen Code für opengl ES 2.0, aber Sie können sich ein Bild machen:

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

und sqTEx ist eine Instanz von TexturedSquare:

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;
        }



}

Andere Tipps

Schauen Sie sich ein PCT (oder jPCT-AE) an, es ist eine ausgezeichnete 3D-Bibliothek für Java (und / oder Android).Es unterstützt das sofortige Laden von 3ds / obj.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top