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);
Où 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?