2017-07-10 2 views
0

J'ai une application de génération aléatoire de l'île pour Android, développé avec Opengl ES 2.0 et j'essaie d'implémenter un appareil photo de type FPS. Le principal problème est de traduire le point de vue selon la caméra rotation.This est comment je tourner et translater la vue:Opengl ES 2.0 Android - Traduire la caméra en fonction de la rotation

Matrix.setIdentityM(mCurrentRotation, 0); 
    Matrix.rotateM(mCurrentRotation, 0, mAngleX, 0.0f,1.0f, 0.0f); 
    Matrix.setIdentityM(mCurrentTranslation, 0); 
    Matrix.translateM(mCurrentTranslation,0,xrot,-7.0f,yrot); 
    mAngleX = 0.0f; 

    Matrix.multiplyMM(mTemporaryMatrix, 0, mCurrentRotation, 0, mAccumulatedRotation, 0); 

    System.arraycopy(mTemporaryMatrix, 0, mAccumulatedRotation, 0, 16); 
      . 
      . 
      . 
    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0); 
    Matrix.multiplyMM(mMVPMatrix, 0, mCurrentTranslation, 0, mMVPMatrix, 0); 
    Matrix.multiplyMM(mMVPMatrix, 0, mTemporaryMatrix, 0, mMVPMatrix, 0); 
    // This multiplies the modelview matrix by the projection matrix, and stores the result in the MVP matrix 
    // (which now contains model * view * projection). 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0); 

mTemporaryMatrix stocke la rotation de la caméra sur une trame donnée en fonction de l'ancienne rotation et mAngleX c'est une entrée tactile. Idem pour mCurrentTranslation et xrot, yrot. Donc quand je me déplace après une rotation, le mouvement continue d'être en accord avec les coordonnées du monde. Mon xrot,yrot équation de mise à jour sont les suivantes:

void setXYrot(float x, float y){ 
     Matrix.transposeM(temp,0,mTemporaryMatrix,0); 
     Matrix.invertM(temp,0,temp,0); 
     xrot-=(x*Math.sin(Math.acos(temp[5]))); 
     yrot+=(y*Math.cos(Math.acos(temp[5]))); 
    } 

Je suis tout à fait sûr que le problème repose sur eux. Je transpose et inverser la matrice de rotation, puis je prends Arccosine le sixième élément de la matrice qui devrait être la rotation sur l'axe Y. Est-ce que quelqu'un voit un bug quelque part dans la fonction de mise à jour? Mais surtout, il existe une façon standard de le faire?

Répondre

0

J'ai trouvé le bogue. tout ce que je garde d'abord le montant cumulé des mAngleX je tourne dans une variable flottante appelée angle, puis simplement:

void setXYrot(float x, float y){ 

    xrot-=(y*Math.sin((angle*Math.PI)/180f))+(x*Math.cos((angle*Math.PI)/180f)); 
    yrot+=(y*Math.cos((a*Math.PI)/180f))-(x*Math.sin((angle*Math.PI)/180f)); 
} 

fonctionne comme un charme