2014-11-21 2 views
0

Я начинаю новый проект Android с использованием OpenGl ES 2, на основе примера, доступного на официальной странице, и я хочу использовать некоторые проекты из Blender в этом приложении. В каком формате я должен экспортировать этот проект в Blender, чтобы облегчить его обработку в проекте Android? И какую библиотеку я должен использовать для обработки этого файла?Экспорт проекта из Blender для использования в проекте Android

Я хочу то, что позволит мне использовать класс вроде этого:

public class Triangle { 

    private final String vertexShaderCode = 
      "uniform mat4 uMVPMatrix;" + 
      "attribute vec4 vPosition;" + 
      "void main() {" + 
      " gl_Position = uMVPMatrix * vPosition;" + 
      "}"; 

    private final String fragmentShaderCode = 
      "precision mediump float;" + 
      "uniform vec4 vColor;" + 
      "void main() {" + 
      " gl_FragColor = vColor;" + 
      "}"; 

    private final FloatBuffer vertexBuffer; 
    private final int mProgram; 
    private int mPositionHandle; 
    private int mColorHandle; 
    private int mMVPMatrixHandle; 

    // number of coordinates per vertex in this array 
    static final int COORDS_PER_VERTEX = 3; 
    static float triangleCoords[] = {0.0f, 0.622008459f, 0.0f, -0.5f, -0.311004243f, 0.0f, 0.5f, -0.311004243f, 0.0f}; 
    private final int vertexCount = triangleCoords.length/COORDS_PER_VERTEX; 
    private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex 

    float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 0.0f }; 

    public Triangle() { 
     // initialize vertex byte buffer for shape coordinates 
     ByteBuffer bb = ByteBuffer.allocateDirect(triangleCoords.length * 4); 
     // use the device hardware's native byte order 
     bb.order(ByteOrder.nativeOrder()); 

     // create a floating point buffer from the ByteBuffer 
     vertexBuffer = bb.asFloatBuffer(); 
     // add the coordinates to the FloatBuffer 
     vertexBuffer.put(triangleCoords); 
     // set the buffer to read the first coordinate 
     vertexBuffer.position(0); 

     // prepare shaders and OpenGL program 
     int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); 
     int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); 

     mProgram = GLES20.glCreateProgram();    // create empty OpenGL Program 
     GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program 
     GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program 
     GLES20.glLinkProgram(mProgram);     // create OpenGL program executables 

    } 

    public void draw(float[] mvpMatrix) { 
     // Add program to OpenGL environment 
     GLES20.glUseProgram(mProgram); 

     // get handle to vertex shader's vPosition member 
     mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); 

     // Enable a handle to the triangle vertices 
     GLES20.glEnableVertexAttribArray(mPositionHandle); 

     // Prepare the triangle coordinate data 
     GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); 

     // get handle to fragment shader's vColor member 
     mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); 

     // Set color for drawing the triangle 
     GLES20.glUniform4fv(mColorHandle, 1, color, 0); 

     // get handle to shape's transformation matrix 
     mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); 
     MyGLRenderer.checkGlError("glGetUniformLocation"); 

     // Apply the projection and view transformation 
     GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 
     MyGLRenderer.checkGlError("glUniformMatrix4fv"); 

     // Draw the triangle 
     GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); 

     // Disable vertex array 
     GLES20.glDisableVertexAttribArray(mPositionHandle); 
    } 

но вместо жесткого кода значение для массивов вершин, я прочитал эти значения из файла (то же самое для цветов и другие компоненты).

Каждый 3D-проект от Blender должен иметь свой класс, и кроме метода draw(), у меня есть другие методы, такие как walk(), jump() и т. Д., Чтобы связать события касания.

Любой может дать нам подсказку? Я принимаю даже указания на учебные пособия, поскольку я не могу найти что-либо подобное в Google (возможно, потому, что я понятия не имею, какой поиск, помимо таких вещей, как android opengl tutorial).

+0

heres, как вы можете загрузить файлы .obj http://stackoverflow.com/questions/22316440/how-to-handle-index-buffer-in-opengl-es-1-1/22316797#22316797 – JRowan

ответ

0

Что вам нужно, это игровой движок для Android, который будет импортировать объекты из Blender. В последнее время в этой области было много разработок, поэтому я написал это article, в котором суммируется их все. Некоторые из них предназначены для Java, некоторые C++, как с открытым исходным кодом, так и нет. Есть много хороших вариантов, это зависит от того, что важно для вас. Например, JMonkeEngine SDK тесно связан с Blender. Моим любимым является PowerVR SDK, поскольку он имеет собственный формат объектных файлов (POD), который является легким и настраиваемым.

Смежные вопросы