0

Je construis une application de réalité augmentée dans laquelle je souhaite déplacer des objets sur l'écran en fonction de l'orientation du téléphone. Par exemple, si le téléphone est maintenu immobile, l'objet reste au centre de l'écran. Si le téléphone tourne à gauche autour de son axe vertical en mode portrait, l'objet se déplace vers la droite. Ce capteur est le j'accéder à AndroidApplication de Rotation Vector à une caméra OpenGL ou "view matrix"

@Override 
public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { 
     SensorManager.getRotationMatrixFromVector(mRotationMatrix, event.values); 
     mGLAssetSurfaceView.getRenderer().setRotationMatrix(mRotationMatrix); 
    } 
} 

Voici comment je l'appliquer à mon OpenGL renderer:

@Override 
public void onDrawFrame(GL10 gl) { 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 

    Matrix.multiplyMM(mViewMatrix, 0, mViewMatrix, 0, mRotationMatrix, 0); 

    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); 

    // Draw shape 
    mSquare.draw(mMVPMatrix); 
} 

Comme vous pouvez le voir, je suis calculer le produit

MVRP

et en passant cela dans mon vertex shader. Le résultat de ceci est le carré au milieu de l'écran tournant autour de son propre axe, pas par rapport au téléphone.

Répondre

0

Vous pouvez tout simplement passer des variables à droite Matrix.setLookAtM() sans multiplier par la matrice de rotation:

cameraLookAtX = cameraX + (float) Math.cos(Math.toRadians(yaw)) * (float) Math.cos(Math.toRadians(pitch)); 
cameraLookAtY = cameraY - (float) Math.sin(Math.toRadians(pitch)); 
cameraLookAtZ = cameraZ + (float) Math.cos(Math.toRadians(pitch)) * (float) Math.sin(Math.toRadians(yaw)); 
Matrix.setLookAtM(viewMatrix, 0, cameraX, cameraY, cameraZ, cameraLookAtX, cameraLookAtY, cameraLookAtZ, 0f, 1.0f, 0.0f); 

cameraX, cameraY et cameraZ les coordonnées caméra. cameraLookAtX, cameraLookAtY et cameraLookAtZ sont les coordonnées d'un point que la caméra regarde. pitch et yaw sont les angles de rotation d'Euler de la caméra. Vous pouvez également ajouter roll et calculer le vecteur pour la fonction setLookAtM().