[gelöst] Rotation aus Matrix lesen
-
Hi,
ich versuche schon seit einiger Zeit die Rotation (X, Y, Z) aus einer
3x3 - Matrix zu lesen. Klappt aber leider nicht ganz. Dabei geht es um
die Physik - Engine "Tokamak", bei der ich von allen physikalischen Objekten
die Position und Rotation auslesen moechte. Das Problem ist, das die Rotation
falsch ist und somit z.B. ein Würfel manchmal auf einer Ecke steht, obwohl er nirgends angelehnt ist.Hier mal der Code:
neT3 transformData; GLfloat angle_x, angle_y, angle_z; // Matrix auslesen transformData = Object[i].physic.rigidBody->GetTransform(); // Rotation berechnen if(transformData.rot[0][2] < 1.0f) { if(transformData.rot[0][2] > -1.0f) { angle_x = (float)atan2(-transformData.rot[1][2], transformData.rot[2][2]); angle_y = (float)asin((double)transformData.rot[0][2]); angle_z = (float)atan2(-transformData.rot[0][1], transformData.rot[0][0]); } else { angle_x = (float)-atan2(transformData.rot[1][0], transformData.rot[1][1]); angle_y = (float)(-NE_PI/ 2); angle_z = 0.0f; } } else { angle_x = (float)atan2(transformData.rot[1][0], transformData.rot[1][1]); angle_y = (float)(NE_PI / 2); angle_z = 0.0f; } angle_x = NE_RAD_TO_DEG(angle_x); angle_y = NE_RAD_TO_DEG(angle_y); angle_z = NE_RAD_TO_DEG(angle_z);Das mit dem berechnen der Rotation hab ich von
dem Tokamak - Forum, das aber leider seit 5 Jahren gesperrt ist :/.
Weiß jemand wie man das richtig macht?
Freue mich auf jede Antwort
.Mfg, Pk3
-
Wieso interessieren Dich Eulerwinkel?
Die sind doch so extrem unpraktisch.Was willst Du wirklich?
-
Ich will nur die X-, Y- und Z-Rotation aus dieser Matrix lesen.
Keine Ahnung was es da sonst noch für "Rotationsmoeglichkeiten" gibt.
Jedenfalls brauch ich diese um die Objekte in OpenGL darzustellen
.
-
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]