Uso de Matrix. Rotar en OpenGL ES 2.0

Editar – Añadido más código

Tener un montón de problemas al intentar girar correctamente mi quad con OpenGL ES 2.0.

Siempre parece girar alrededor del centro de las coordenadas de la pantalla. Estoy tratando de conseguir que gire alrededor de su propio centro (para 2d, por lo que el eje z sólo).

He estado experimentando con Matrix.translate como se muestra a continuación. Sin embargo, el cambio de la x o y pos aquí simplemente dibuja el quad en un lugar diferente en la pantalla, pero cuando gira, vuelve a girar alrededor del centro de la pantalla. Por favor, alguien podría explicar cómo conseguir que girar alrededor de su propio eje z (como una rueda)?

Gracias, aquí están las líneas relevantes de código – si más se necesita, por favor pregunte y voy a publicar. (Tenga en cuenta que he visto muchas preguntas similares sobre SO y el Internet más amplio pero no he podido encontrar una respuesta hasta el momento).

Gracias.

//Set rotation Matrix.setRotateM(mRotationMatrix, 0, -angle, 0, 0, 1.0f); //Testing translation Matrix.translateM(mRotationMatrix, 0, -.5f, .5f, 0f); // Combine the rotation matrix with the projection and camera view Matrix.multiplyMM(mvpMatrix, 0, mRotationMatrix, 0, mvpMatrix, 0); 

My Shaders (declarado a nivel de clase)

 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;" + "}"; 

De onSurfaceChanged

 float ratio = (float) width / height; Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 

En Mi método onDrawFrame

 // Set the camera position (View matrix) Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); //Calculate the projection and view transformation Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 

4 Solutions collect form web for “Uso de Matrix. Rotar en OpenGL ES 2.0”

He encontrado los mismos problemas (ver distorsiones extrañas y todo lo demás), mi solución basada en la formación de Android> Mostrar gráficos con OpenGL ES> Agregar movimiento a continuación.

(Vaya a mi post detallado para si es necesario: OpenGL ES Android Matrix Transformations .)

  1. Establecer un mModelMatrix a matriz de identidad

     Matrix.setIdentityM(mModelMatrix, 0); // initialize to identity matrix 
  2. Aplicar traducción al modelo mModelMatrix

     Matrix.translateM(mModelMatrix, 0, -0.5f, 0, 0); // translation to the left 
  3. Aplicar la rotación a una mRotationMatrix (ángulos en grados)

     Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f); 
  4. Combinar rotación y traducción a través de Matrix.multiplyMM

     mTempMatrix = mModelMatrix.clone(); Matrix.multiplyMM(mModelMatrix, 0, mTempMatrix, 0, mRotationMatrix, 0); 
  5. Combine la matriz del modelo con la proyección y la vista de la cámara

     mTempMatrix = mMVPMatrix.clone(); Matrix.multiplyMM(mMVPMatrix, 0, mTempMatrix, 0, mModelMatrix, 0); 

Aquí hay un tutorial. Digamos que ibas a dibujar una tetera … la modeloMatriz sería una identidad para empezar. La forma se centra en el origen como este:

Rotar y traducir previamente

Compruebe que es lo que tiene antes de continuar …

Una vez que tenga usted debe aplicar la rotación a la matriz del modelo, compilar + ejecutar – obtendrá una copia girada …

Girado

Una vez que tenga esto, puede traducir:

Girado y traducido

Así que para usted, todo lo que necesita hacer parece verificar cuando la matriz de rotación es la identidad, por ejemplo, Matrix.setIdentityM (mRotationMatrix, 0); Que la forma está en el centro. Si no se mueve hacia el centro.

Una vez en el centro, aplique la rotación, por ejemplo

  Matrix.setIdentityM( mRotationMatrix,0); <as needed movement to center> Matrix.rotate(mRotationMatrix, 0, -angle, 0, 0, 1.0f); <any other translation you want> 

Hágalo en pasos para hacer su vida fácil para que vea lo que está pasando.

La rotación se produce generalmente alrededor del origen, por lo que desea girar su quad antes de traducirlo. Si gira después de traducir, entonces el quad primero se alejará del origen, luego girará alrededor del origen.

Sin saber cómo se implementa la función Matrix, no podemos aconsejar si los está utilizando correctamente. Todo lo que nos has mostrado en la interfaz de las funciones.

Pero en general, gire antes de traducir.

Aplicar sus operaciones al revés:

1. Matriz.translateM (mRotationMatrix, 0, -.5f, .5f, 0f);

2º-Matrix.setRotateM (mRotationMatrix, 0, -angle, 0, 0, 1.0f);

Girará alrededor de su propio centro

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.