2014-03-27 73 views
0

我想在Z軸上旋轉我的三角形,但我會圍繞三角形的中心而不是屏幕的中心。我已經研究了很多,但沒有找到任何解決方案。Android OpenGL ES 2.0 - 旋轉到位

任何想法,我可以嘗試解決它?

public class RendererClass implements Renderer { 

FloatBuffer bufferObj1; 
FloatBuffer bufferObj2; 

int programObj1; 
int programObj2; 

int positionObj1; 
int positionObj2; 

int rotationMatrixLocationObj1; 
int rotationMatrixLocationObj2; 

int colorObj1; 
int colorObj2; 

float[] rotationMatrixObj1 = new float[16]; 
float[] rotationMatrixObj2 = new float[16]; 

@Override 
public void onSurfaceCreated(GL10 arg0, EGLConfig config) { 

    GLES20.glClearColor(0.0f, 1.0f, 1.0f, 1.0f);  

    float[] vertexObj1 = { 

      -0.8f, 0.8f, 
      -0.8f, 0.0f, 
      0.0f, 0.0f 

    }; 

    float[] vertexObj2 = { 

      0.8f, 0.8f, 
      0.8f, 0.0f, 
      0.0f, 0.0f 

    }; 

    bufferObj1 = ByteBuffer.allocateDirect(vertexObj1.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer().put(vertexObj1); 
    bufferObj2 = ByteBuffer.allocateDirect(vertexObj2.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer().put(vertexObj2); 

    String vssObj1 = "attribute vec4 positionObj1;" + 
        "uniform mat4 rotationMatrixObj1;" + 
        "void main(){" + 
        "gl_Position = rotationMatrixObj1 * positionObj1;" + 
        "}"; 

    String vssObj2 = "attribute vec4 positionObj2;" + 
        "uniform mat4 rotationMatrixObj2;" + 
        "void main(){" + 
        "gl_Position = rotationMatrixObj2 * positionObj2;" + 
        "}"; 

    String fssObj1 = "precision mediump float;" + 
        "uniform vec4 colorObj1;" + 
        "void main(){" + 
        "gl_FragColor = colorObj1;" + 
        "}"; 

    String fssObj2 = "precision mediump float;" + 
        "uniform vec4 colorObj2;" + 
        "void main(){" + 
        "gl_FragColor = colorObj2;" + 
        "}"; 

    int vsObj1 = glCreateShader(GL_VERTEX_SHADER); 
    int vsObj2 = glCreateShader(GL_VERTEX_SHADER); 

    int fsObj1 = glCreateShader(GL_FRAGMENT_SHADER); 
    int fsObj2 = glCreateShader(GL_FRAGMENT_SHADER); 

    glShaderSource(vsObj1, vssObj1); 
    glShaderSource(vsObj2, vssObj2); 

    glShaderSource(fsObj1, fssObj1); 
    glShaderSource(fsObj2, fssObj2); 

    glCompileShader(vsObj1); 
    glCompileShader(vsObj2); 

    glCompileShader(fsObj1); 
    glCompileShader(fsObj2); 

    programObj1 = glCreateProgram(); 
    programObj2 = glCreateProgram(); 

    glAttachShader(programObj1, vsObj1); 
    glAttachShader(programObj2, vsObj2); 

    glAttachShader(programObj1, fsObj1); 
    glAttachShader(programObj2, fsObj2); 

    glLinkProgram(programObj1); 
    glLinkProgram(programObj2); 

    positionObj1 = glGetAttribLocation(programObj1, "positionObj1"); 
    positionObj2 = glGetAttribLocation(programObj2, "positionObj2"); 

    rotationMatrixLocationObj1 = glGetUniformLocation(programObj1, "rotationMatrixObj1"); 
    rotationMatrixLocationObj2 = glGetUniformLocation(programObj2, "rotationMatrixObj2");  

    colorObj1 = glGetUniformLocation(programObj1, "colorObj1"); 
    colorObj2 = glGetUniformLocation(programObj2, "colorObj2");  

} 

@Override 
public void onSurfaceChanged(GL10 arg0, int width, int height) { 

    Matrix.setIdentityM(rotationMatrixObj1, 0); 
    Matrix.rotateM(rotationMatrixObj1, 0, MainActivity.angle, 0, 0, 1);  

    Matrix.setIdentityM(rotationMatrixObj2, 0); 
    Matrix.rotateM(rotationMatrixObj2, 0, MainActivity.angle, 0, 0, -1); 

} 

GL10 gl; 

@Override 
public void onDrawFrame(GL10 glUnused) { 

    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);  

    onSurfaceChanged(gl, 0, 0); 

    glUseProgram(programObj1); 
    bufferObj1.position(0); 
    glVertexAttribPointer(positionObj1, 2, GL_FLOAT, false, 0, bufferObj1); 
    glEnableVertexAttribArray(positionObj1); 
    glUniform4f(colorObj1, 0.0f, 0.0f, 1.0f, 1.0f); 
    glUniformMatrix4fv(rotationMatrixLocationObj1, 1, false, rotationMatrixObj1, 0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glUseProgram(programObj2); 
    bufferObj2.position(0); 
    glVertexAttribPointer(positionObj2, 2, GL_FLOAT, false, 0, bufferObj2); 
    glEnableVertexAttribArray(positionObj2); 
    glUniform4f(colorObj2, 1.0f, 0.0f, 0.0f, 1.0f); 
    glUniformMatrix4fv(rotationMatrixLocationObj2, 1, false, rotationMatrixObj2, 0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

} 

} 

回答

0

您使用glDrawArrays這樣你就可以改變你的三角形在你的代碼,你想要的任何方式。使用簡單的三角函數獨立旋轉頂點。

+0

三角函數已經在着色器中,使用我的「rotationMatrixObj1」和「rotationMatrixObj2」。問題在於它們圍繞屏幕的中心點旋轉,而不是圍繞三角形中心。你能發表任何建議嗎? – user3466862

0

旋轉矩陣圍繞座標系中心旋轉頂點。 如果你想周圍的一些其他點(X0,Y0,Z0)旋轉的場景,你必須做這3個簡單步驟:

  1. 翻譯以這樣的方式的場景,你的觀點將在座標系統的中心(通過-x0,-y0,-z0)
  2. 旋轉
  3. 轉換回(由X0,Y0,Z0)

當然不需要改造的3個步驟,矩陣乘法可以做這個工作我們。

+0

謝謝,我認爲這是解決方案。只是最後一個問題,如果我翻譯這個場景,我的座標系統中心和三角形(座標系統上的)都將被翻譯。這樣做的三角形和中心之間的距離將與以前一樣,旋轉將如前所述 - 不在三角形中心附近。我想我不遵循我應該在代碼中做什麼。你能否提供一些步驟1的樣子的更多細節?旋轉和翻譯我可以弄明白。謝謝。 – user3466862

+0

我解決了我的問題。我應該把我的三角形放在座標系統的中心(不是),然後平移和旋轉。完美的伴侶,謝謝。 – user3466862