2014-02-15 138 views
0

我做的基礎上,在developer.android.com入門樣本一個簡單的應用程序。它工作正常,但我改變了旋轉邏輯,現在它不顯示三角形。我不確定我是否理解矩陣的內容,所以我想如果有人能檢查我的代碼。 這是SurfaceView方法我覺得可能有問題:旋轉三角形在OpenGL的Android

@Override 
public boolean onTouchEvent(MotionEvent e){ 
    float x = e.getX(); 
    float y = e.getY(); 

    switch(e.getAction()){ 
    case MotionEvent.ACTION_MOVE: 
     float rotateX = 0.0f; 
     float rotateY = 0.0f; 
     float rotateZ = 0.0f; 

     //na coluna da esquerda, rotação no eixo Z 
     if(x < getWidth()/3){ 
      rotateZ = (y - previousY); 
     } 
     //na coluna do meio, rotação no eixo X 
     if(getWidth()/3 < x && x < 2*getWidth()/3){ 
      rotateX = (y - previousY); 
     } 
     //na coluna da direita, rotação no eixo Z invertido 
     if(x > getWidth()/3){ 
      rotateZ = - (y - previousY); 
     } 

     //na linha superior, rotação no eixo Z 
     if(y < getHeight()/3){ 
      rotateZ = (x - previousX); 
     } 
     //na linha do meio, rotação no eixo Y 
     if(getHeight()/3 < y && y < 2*getHeight()/3){ 
      rotateY = (x - previousY); 
     } 
     //na linha inferior, rotação no eixo Z invertido 
     if(y > 2*getHeight()/3){ 
      rotateZ = - (x - previousX); 
     } 

     mRenderer.setAngulo(mRenderer.getAnguloX() + (rotateX) * TOUCH_SCALE_FACTOR, 
          mRenderer.getAnguloY() + (rotateY) * TOUCH_SCALE_FACTOR, 
          mRenderer.getAnguloZ() + (rotateZ) * TOUCH_SCALE_FACTOR); 
     requestRender(); 

    } 
    previousX = x; 
    previousY = y; 
    return true; 
} 

這是渲染方法:

@Override 
public void onDrawFrame(GL10 unused) { 

    //desenha o fundo 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    //define a posição da camera 
    //Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); 
    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5f, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 

    //cria uma matrix para a rotação de cada angulo 
    Matrix.setRotateM(xRotationMatrix, 0, anguloX, 1, 0, 0); 
    Matrix.setRotateM(yRotationMatrix, 0, anguloY, 0, 1, 0); 
    Matrix.setRotateM(zRotationMatrix, 0, anguloZ, 0, 0, 1); 

    float[] mMatrix = new float[16]; 
    //aplica todas as rotações na matrix scratch 
    Matrix.multiplyMM(mMatrix, 0, xRotationMatrix, 0, mMatrix, 0); 
    Matrix.multiplyMM(mMatrix, 0, yRotationMatrix, 0, mMatrix, 0); 
    Matrix.multiplyMM(mMatrix, 0, zRotationMatrix, 0, mMatrix, 0); 

    // Calcula a view e depois a projeção 
    Matrix.multiplyMM(resultingMatrix, 0, mViewMatrix, 0, mMatrix, 0); 
    Matrix.multiplyMM(resultingMatrix, 0, mProjectionMatrix, 0, resultingMatrix, 0); 

    // Draw shape 
    triangulo.draw(resultingMatrix); 
} 

,因爲我沒有,因爲最後一次改變了它的Triangulo類必須是正確的該應用程序正在工作。

+0

的對於這樣的問題,你可以經常回去,工程的代碼,然後改變小塊接近他們。當它停止工作時,你只需要檢查一個小小的變化。 – fadden

+0

其實我有工作的代碼,但它只是不同的,我不能添加只是一個新的代碼的一部分。我想我一次編輯太多了 – Junior

回答

0

好吧,我徹底分析你的代碼,似乎沒有要在它的任何問題。

但是,我想這個問題是這樣的:

當你調用

Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5f, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 

您在Z設置攝像頭= -5,並且是從原點即朝着+已經Z方向。

(我想的三角形的最初的頂點必須在XY平面內,因此三角形是可見的。)

然後當你調用

Matrix.setRotateM(zRotationMatrix, 0, anguloZ, 0, 0, 1); 

它繞Z軸的三角形是精細。

但你打電話

Matrix.setRotateM(xRotationMatrix, 0, anguloX, 1, 0, 0); 
Matrix.setRotateM(yRotationMatrix, 0, anguloY, 0, 1, 0); 

這裏你繞X軸和Y軸的三角形,三角形的,因爲沒有厚度, 它變得不可見。

可能的修正:

1)取出約X和Y軸的旋轉,並檢查是否正常工作。

    OR 

2)把一個立方體,而不是三角形的,看看它是否工作。

    OR 

3)如果兩者都不起作用,請給我完整的代碼。我將調試並運行它。

祝您好運