2014-02-15 3 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) Если ни один из них не работает, дайте мне полный код. Я буду его отлаживать и запускать.

Удачи

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