Pergunta

Iv'e exportou um modelo do blender para um arquivo .obj.Iv'e conseguiu criar um muito simples classe que carrega vértices e índices para matrizes.Meu problema é que eu quero as coordenadas de textura (vt) e normais (vn) também.Por exemplo, eu precisaria de 4 vértices * 6 faces para um cubo simples ser capaz de usar textura, mas eu só tenho 8 no meu arquivo .obj, assim como não tenho a menor idéia de como lidar com os índices paravt, uma vez que só posso ter um array / buffer para índices, mas recebo dois v / vt diferentes no arquivo .obj.

Existe algum carregador por aí que retorna apenas matrizes ou similar para vértice, textura, normais e uma matriz de índices?Ou exemplos de como escrever um?Iv'e só encontrei carregadores em motores 3D completos até agora e não é isso que eu quero.

Foi útil?

Solução

4 vértices * 6 faces é mais do que você precisa.Na verdade, não será eficiente.Os vértices exportados que você tem são otimizados com índices.Usando Opengl-es você pode apontar de onde obter vértices (array) e então desenhar vértices usando seus índices em outro array.Como resultado, você obtém 8 vértices contra 24 vértices possíveis, você precisa de menos memória para armazenar.Portanto, a eficiência é 16/24 * 100%.Imagine que você terá um modelo com 1000 vértices.

Índice de vértice significa que em outra matriz com um deslocamento adequado, a GPU obterá um vértice (size_of_vertex (3 flutuadores) * índice) e um deslocamento adequado para coordenadas UV (size_of_UVcoord (2 flutuadores) * índice)

este código para opengl ES 2.0, mas você pode ter uma ideia:

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

e sqTEx são uma instância de 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;
        }



}

Outras dicas

Olhe um PCT (ou jPCT-AE), é uma excelente biblioteca 3D para Java (e / ou Android).Suporta carregamento 3ds / obj pronto para uso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top