[gelöst] Rotation aus Matrix lesen



  • Pk3 schrieb:

    Ich will nur die X-, Y- und Z-Rotation aus dieser Matrix lesen.

    Wozu?



  • Weil ohne die Rotationsdaten das Objekt net richtig angezeigt wird 🙂 ...



  • Um dein Objekt mit OpenGL zu rendern brauchst du keine Eulerwinkel sondern ne Matrix und die hast du. Wo liegt also das Problem!?



  • Ja, kann man natürlich auch machen, aber angenommen man will die Rotation
    eines Objektes ändern, dann währe es doch angebracht, den Eulerwinkel zu verwenden, oder nicht 🙂 ?



  • Kannst du nicht glRotate() verwenden?



  • Du verwendest doch eine Physikengine, warum genau willst du die Rotation denn nochmals verändern!?



  • @Nexus
    Doch, mach ich auch, aber genau da is der Punkt: Dafür brauch ich die X,Y und Z-Rotation.

    @dot
    Ich verwende die PhysikEngine in meiner Engine, also ne Engine in einer Engine :D.
    Und da kann es schonmal vorkommen das man von einem Objekt die Rotation verändern will.



  • Verrat uns doch bitte einfach was genau du tun willst. Die Rotation einfach irgendwie verändern kannst du auch indem du die Rotationsmatrix mit einer weiteren Rotationsmatrix multiplizierst...



  • Ich bin grad dabei eine Engine zu basteln. Darin ist ein PhysicSystem welches mit der Physic-Engine "Tokamak" verbunden ist. Bei dieser Physic-Engine kann man Objekte "registrieren". In meinen PhysicSystem sind PhysikObjekte, in denen Position, Rotation, EntityLinks usw. stehen und diese Objekte sind "verlinkt" mit den Objekten der PhysikEngine. Und in jedem Frame wird die Position und Rotation vom Objekt der Physic - Engine zu meinem PhysicSystem - Objekt übertragen.

    Das RenderSystem nimmt dann die Position und Rotation eines PhysicObjects und rendert es. Das mit der Position funktioniert, nur das mit dem Rotieren nicht...

    Hier ein kleiner Codeausschnitt vom RenderSystem:

    glLoadIdentity();
    	    // Rotation für die Kameraansicht
    	    glRotatef(Render.Camera.Angle.Y, 1.0f, 0.0f, 0.0f);
                glRotatef(360 - Render.Camera.Angle.X, 0.0, 1.0f, 0.0f);
    
    	    // Positionieren
                glTranslatef(Render.Camera.Pos.X + PhysicSystem.Object[i].Pos.X, Render.Camera.Pos.Y + PhysicSystem.Object[i].Pos.Y, Render.Camera.Pos.Z + PhysicSystem.Object[i].Pos.Z);
    
    	    // Rotation
    	    glRotatef(PhysicSystem.Object[i].Angle.X, 1.0f, 0.0f, 0.0f);
                glRotatef(PhysicSystem.Object[i].Angle.Y, 0.0, 1.0f, 0.0f);
                glRotatef(PhysicSystem.Object[i].Angle.Z, 0.0, 0.0f, 1.0f);
    
    	    // Rendern
    	    // ...
    

    Hoffe ihr versteht, wie ichs meine :).



  • Pk3 schrieb:

    Hier ein kleiner Codeausschnitt vom RenderSystem:

    ...
    

    Das ist sehr ungeschickt. Du hast sicherlich Kamera-Pose und Objekte-Pose als Matrix/Translationsvektor vorliegen (wenn nicht, warum nicht?!). Dann benutze die doch einfach. Die Rotationsmatrizen in Eulerwinkel umrechnen, nur damit Du glRotate aufrufen kannst ist ... um's politisch korrekt auszudrücken ... "ungeschickt".



  • Habs so umgeändert, dass ich kein "glRotatef(...)" verwenden muss, also mit "glMultMatrixf(...)". Klappt jetzt auch. Vielen Dank 🙂 !



  • Weil ein Vektorprodukt nicht kommutativ ist, ist es nur dann sinnvoll die Eulerwinkel zu berechnen, wenn man die Reihenfolge der Multiplikationen kennt, die zur vorliegenden Rotationsmatrix geführt haben. Die Reihenfolge der Multiplikationen kann je nach Aufgabenfeld anders definiert sein. Die Vorgehensweise zur Berechnung der einzelnen Winkel bei beliebiger Reihenfolge der Multiplikationen ist nahezu identisch.

    Wenn man die Matrizen symbolisch:

    R[t]x,y,z[/t] = R[t]x[/t]R[t]y[/t]R[t]z[/t]
    

    multipliziert, dann kann man mit trigonometrischen Funktionen arbeiten.

    Im Oberen Beispiel wären die Rotationswinkel der Achsen:

    tan[x] = -R[1][2]/R[2][2]
    sin[y] =  R[0][2]
    tan[z] = -R[0][1]/R[0][0]
    

Anmelden zum Antworten