android rotation opengl-es-2.0 translate-animation quad

android - Usando Matrix. Girar en OpenGL ES 2.0



rotation opengl-es-2.0 (4)

Aquí hay un tutorial. Digamos que debiste dibujar una tetera ... la MatrizMáquina sería una identidad para empezar. La forma se centra en el origen de esta manera:

Verifique que esto es lo que tiene antes de continuar ...

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

Una vez que tenga esto, puede traducir:

Entonces, para usted, todo lo que necesita hacer parece verificar cuándo la matriz de rotación es identidad, por ejemplo, Matrix.setIdentityM (mRotationMatrix, 0); que la forma está en el centro. Si no es moverlo al centro.

Una vez que esté 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>

Hazlo en pasos para facilitar tu vida para que veas lo que está pasando.

Editar - Se agregó más código

Tengo muchos problemas al intentar rotar correctamente mi quad usando OpenGL ES 2.0.

Siempre parece girar alrededor del centro de las coordenadas de la pantalla. Estoy tratando de hacer que gire alrededor de su propio centro (para 2d, solo para el eje z).

He estado experimentando con Matrix.translate como se muestra a continuación. Sin embargo, cambiar la posición x o y aquí simplemente dibuja el cuadrante en un lugar diferente en la pantalla, pero cuando gira, nuevamente gira alrededor del centro de la pantalla. ¿Podría alguien explicar cómo hacer que gire alrededor de su propio eje z (como una rueda)?

Gracias, aquí están las líneas de código relevantes. Si necesita más, pregunte y lo publicaré. (Tenga en cuenta que he visto muchas preguntas similares en SO y en Internet, pero hasta ahora no he logrado encontrar una respuesta).

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

Desde onSurfaceChanged

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

En el método My 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);


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

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

Pero, en general, rota antes de traducir.


Aplica tus operaciones al revés:

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

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

Girará alrededor de su propio centro


Me he encontrado con los mismos problemas (he visto distorsiones extrañas y todo lo demás), mi solución está basada en Android Training> Visualización de gráficos con OpenGL ES> Adding Motion a continuación.

(Dirígete a mi publicación detallada si es necesario: OpenGL ES Android Matrix Transformations ).

  1. Establecer una matriz mModelMatrix para la matriz de identidad

    Matrix.setIdentityM(mModelMatrix, 0); // initialize to identity matrix

  2. Aplicar la traducción a mModelMatrix

    Matrix.translateM(mModelMatrix, 0, -0.5f, 0, 0); // translation to the left

  3. Aplicar rotación a mRotationMatrix (ángulos en grados)

    Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f);

  4. Combina la rotación y la traducción a través de Matrix.multiplyMM

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

  5. Combina 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);