0

Ich entwickle eine Augmented-Reality-Anwendung, bei der Objekte auf dem Bildschirm in Bezug auf die Ausrichtung des Telefons verschoben werden sollen. Wenn das Telefon beispielsweise nicht bewegt wird, bleibt das Objekt in der Mitte des Bildschirms. Wenn das Telefon im Hochformat um seine vertikale Achse nach links gedreht wird, bewegt sich das Objekt nach rechts. Dies ist der Sensor I in AndroidAnwenden von Rotationsvektor auf OpenGL-Kamera oder "Ansichtsmatrix"

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

Dies ist, wie ich es meine OpenGL-Renderer bin Anwendung:

@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); 
} 

Wie Sie sehen, ich bin Berechnen des Produkts

MVRP

und übergeben Sie das in meine Vertex-Shader. Das Ergebnis ist das Quadrat in der Mitte des Bildschirms, das sich um seine eigene Achse dreht, nicht in Bezug auf das Telefon.

Antwort

0

Sie könnten genau das Richtige Variablen Matrix.setLookAtM() ohne Multiplikation mit Rotationsmatrix passieren:

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 und cameraZ sind die Kamerakoordinaten. cameraLookAtX, cameraLookAtY und cameraLookAtZ sind die Koordinaten eines Punktes, den die Kamera betrachtet. pitch und yaw sind die Euler-Drehwinkel der Kamera. Sie können auch roll hinzufügen und den Vektor für die setLookAtM()-Funktion berechnen.

Verwandte Themen