OpenGL: Koordinaten eines Punktes nach der Rotation?



  • Ich arbeite gerade mit OpenGL und habe ein grundlegendes Verständnisproblem mit der Rotation. Ich arbeite zwar nicht mit C++ sondern mit Java, aber meine Frage ist nicht sprachensepzifisch. Wäre toll wenn mir jemand weiterhelfen könnte.

    Der relevante Teil meines Programms sieht in Pseudocode etwa so aus:

    display(){
          gl.glLoadIdentity();
          // alle objekte verschieben
          gl.glTranslatef(0.0f, 0.0f, this.z);
          gl.glTranslatef(0.0f, this.y, 0.0f);
          gl.glTranslatef(this.x, 0.0f,  0.0f);
    
          // alle objekte drehen
          gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
          gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
          gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f);
    
          for(alle objekte){
            gl.glPushMatrix();
                //einzelnes object verschieben
                gl.glTranslatef(objX, objY, objZ);
                gl.glBegin(GL.GL_QUADS);
                   rechteck mit mittlepunkt im nullpunkt zeichnen
                gl.glEnd();
           gl.glPopMatrix();
        }
    }
    }
    

    Wenn ich nun alle Objekte um die Y und um die Z Achse rotiere verändert sich natürlich die X Koordinate aller Objekte. Nun möchte ich gerne die neue X Koordinate berechnen. Gibt es viileicht irgendeine openGL Funktion welcher ich einfach die ursprünglichen Koordinaten geben und diese mir dann die neuen Koordinaten zurückliefert?
    Wenn nicht, muss ich es wohl manuell über die Rotationsmatrizen berechnen. Aber in welcher Reihenfolge? Matrizenmultiplikation ist ja nicht kommutativ, deshalb müsste ich wissen in welcher Reihenfolge OpenGL die Matrizen miteinander multipliziert. Weiß das jeamand?



  • PunkyDuck schrieb:

    Wenn nicht, muss ich es wohl manuell über die Rotationsmatrizen berechnen. Aber in welcher Reihenfolge? Matrizenmultiplikation ist ja nicht kommutativ, deshalb müsste ich wissen in welcher Reihenfolge OpenGL die Matrizen miteinander multipliziert.

    Die Matrizen werden in der Reihenfolge von rechts nach links angewandt. Analog zur Verkettung von Funktionen.

    Ist also T eine Transformation und R eine Rotation und du willst erst Rotieren und dann Verschieben, erhältst du

    y = T  R  x
    

    .



  • Das heißt also wenn ich bei meinem Code alles um 10° um die X Achse und um 20° um die Z Achse rotiere erhalte ich die neue Position jedes beliebigen Punktes folgendermaßen:
    P´ = Rx * Rz * P
    Wobei es sich hierbei um eine Linksmultiplikation handelt.

    Muss ich nun tatsächlich eigenhändig eine Matrizenmultiplikation implementieren umd das zu berechnen? OpenGL muss das ja auch berechenen, gibts da keine Möglickkeit das Ergebnis für einen bestimmten Punkt abzufragen?



  • PunkyDuck schrieb:

    Das heißt also wenn ich bei meinem Code alles um 10° um die X Achse und um 20° um die Z Achse rotiere erhalte ich die neue Position jedes beliebigen Punktes folgendermaßen:
    P´ = Rx * Rz * P
    Wobei es sich hierbei um eine Linksmultiplikation handelt.

    Wenn du als erstes um die z und dann um die x Achse rotieren willst. Bedenke: Rotationen sind auch nicht kommutativ.

    PunkyDuck schrieb:

    Muss ich nun tatsächlich eigenhändig eine Matrizenmultiplikation implementieren umd das zu berechnen? OpenGL muss das ja auch berechenen, gibts da keine Möglickkeit das Ergebnis für einen bestimmten Punkt abzufragen?

    Mir ist keine bekannt. Was du tun kannst ist, die Model View Matrix aus OpenGL wieder herauslesen. Dann musst du nur die Matrix-Vektor-Multiplikation selber schreiben.

    glGetFloatv(GL_MODELVIEW_MATRIX , modelview);
    

    Berücksichtige aber, dass in der Model View Matrix normalerweise auch schon die Kamera-Position mit eingerechnet ist!

    Wenn du es also wirklich richtig machen willst, solltest du des selber implementieren.



  • Danke, hat jetzt geklappt.



  • Hey,

    habe ähnliches Problem.
    Wie hast du es denn nun am Ende gelöst???

    Danke.


Anmelden zum Antworten