2016-06-20 19 views
0

Ich habe einige Probleme mit glRotateF. Das Problem ist folgendes:glRotatef unterstützt die zentrale Position

Ich zeichne 3 Linien, die ein kartesisches Koordinatensystem darstellen, sie repräsentieren den Blickwinkel einer Kamera.

Diese Kamera kann ihren Blickwinkel drehen. Wenn es sich dreht, sendet es eine Nachricht mit den Winkeln und der Achse, die sich gedreht hatten.

Meine app bekommt diese Nachricht und sendet sie ein Verfahren, diese Methode wird die Achse, die den Winkel gedreht und und wurde sendet sie an dieser Methode:

Bisher alles funktioniert, ist das Problem danach beginnt.

Wenn ich eine Nachricht sende, um den Winkel X in jedem beliebigen Winkel und Winkel Z in einem beliebigen Winkel zu drehen, dreht er einfach die z-Achse.

Im Debugging habe ich festgestellt, dass zuerst der X-Winkel in dem gegebenen Winkel gedreht wurde, aber wenn er das Z im Winkel dreht, kehrt er zur ursprünglichen Position zurück und dreht dann Z, wobei die X-Drehung verloren geht. wie in diesem Beispiel:

Ausgangsposition:

Normal Coordinate System

drehen X auf 90º:

Rotate 90 on X

drehen Z auf 90º (Was sein sollte):

Rotate 90 on Z right

drehen Z auf 90º (was wirklich passiert):

Wrong Z rotate

Was ich will, ist drehen x und dann z ohne lose x Rotation.

Dies ist, wie ich eine Achse zu drehen, rufen:

openGl.rotateX((float) x); 
openGl.rotateZ((float) z); 

Verfahren rotateX und rotateZ

public void rotateX(float grau) { 
    mCubeRotation = grau; 
    eixoX = 1.0f; 
    eixoY = 0.0f; 
    eixoZ = 0.0f; 
    surfaceView.requestRender(); // line to call onDrawFrame 
} 

public void rotateZ(float grau) { 
    mCubeRotation = grau; 
    eixoX = 0.0f; 
    eixoY = 0.0f; 
    eixoZ = 1.0f; 
    surfaceView.requestRender(); // line to call onDrawFrame 
} 

Dies ist der Code der Drehung ist:

@Override 
public void onDrawFrame(GL10 gl) { 

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 

    gl.glTranslatef(0.0f, 0.0f, -8.0f); 

    // When i rotate x eixoX equal 1 and the other axis is 0. 
    // When i rotate z eixoZ equal 1 and the other axis is 0. 
    gl.glRotatef(mCubeRotation, eixoX, eixoY, eixoZ); 

    mCube.draw(gl); 

    gl.glLoadIdentity(); 

    lock = false; 
} 

, wenn jemand Hilfe Ich werde es zu schätzen wissen.

Antwort

0

Ihre Rotationsmethoden überschneiden die globalen eixo* Variablen, die durch die Rotate-Methode "other" gesetzt wurden, und Ihre Draw-Methode setzt die Rendering-Statusmatrix über glLoadIdentity zurück, weshalb Sie nur eine einzige Rotation erhalten.

Im Allgemeinen können Sie nicht tun, was Sie mit drei einfachen Variablen und einem einzigen Aufruf an glRotatef oben auf einer Identitätsmatrix zu tun versuchen; Rotation verkettet das nicht sauber, es sei denn, Ihre Rotationen sind trivial, weil Sie sie richtig ordnen müssen (indem Sie zwei Rotationen um Welt-Raum X anwenden, dann ist Y nicht dasselbe wie zwei Rotationen um Welt-Raum Y und dann X - Ordnung) .Dies gilt insbesondere für Frames, bei denen Sie generell von einer beliebigen Startdrehung ausgehen möchten. Im Allgemeinen möchten Sie eine Reihe von glRotatef Aufrufen auf eine vorhandene Matrix anwenden, um die Rotation inkrementell zu generieren.

Etwas außerhalb des Themas - wenn Sie hier eine Auswahl haben, würde ich wirklich vorschlagen, um OpenGL ES 2.x zu verwenden und die vollständige Übersetzungsmatrix lokal in Ihrer Anwendung zu pflegen. Die OpenGL ES 1.1 API ist alt und relativ ineffizient, und ihr Push/Pop-Matrixstack nimmt eine sehr spezifische Art an, eine Szenengraph-Rendering-Engine zu schreiben; OpenGL ES 2.x und Shadern ist der Weg vorwärts und auf allen modernen Geräten verfügbar.

Verwandte Themen