Koordinatentransformation
-
Ich versuch grad gegen zwei 3D Programme anzukämpfen und suche eine Matrix, mit der ich die koordinaten des einen in die koordinaten des anderen drehen kann
Soviel hab ich schon mal über die Achsen rausgefunden:
xa = yb
ya = xb
za = -zbMein ansatz wäre, die Koordinaten jetzt um -90 Grad um die z Achse und dann um -180 Grad um die x-Achse zu drehen. Mein Problem jetzt - muss ich dann wirklich um die X-Achse drehen? Denn bevor die erste Drehung durchgeführt wurde wäre die Drehachse ja die y achse...
ich weiß nicht ob man sich das von der beschreibung da vorstellen kann. Hinzuzufügen gilt noch dass beide Koordinatensysteme rechtshändig sind...
-
Azrael, il Meraz schrieb:
Mein ansatz wäre, die Koordinaten jetzt um -90 Grad um die z Achse und dann um -180 Grad um die x-Achse zu drehen.
mit spiegelungen ist das einfacher vorzustellen. einmal an der fläche <(1,1,0), (0,0,1)> (diagonale zwischen x und y achse) und einmal an der fläche <(1,0,0), (0,1,0)> (x-y-ebene)
Mein Problem jetzt - muss ich dann wirklich um die X-Achse drehen? Denn bevor die erste Drehung durchgeführt wurde wäre die Drehachse ja die y achse...
das hängt davon ab, was dein programm macht. ich gehe aber davon aus, dass es nach der ersten drehung nicht mehr weiß, wie der gegenstand vorher drin war? dann scheint das richtig, was du sagst
-
Ich habs grad mit spiegelungen versucht irgendwie kann da totaler mist raus. Trotzdem danke. Ist aber meine eigene schuld - ich glaub ich hab die Programminnereien nicht richtig verstanden
Es geht hier hauptsächlich um Rotationen
beim ersten Programm ist Y die Standardachse, d.h ist ein gegenstand nach Y ausgerichtet, hat er eine rotationmatrix von:
1 0 0 0 1 0 0 0 1
beim anderem Programm ist X die Standardachse, d.h ist ein gegenstand nach X ausgerichtet, hat er eine rotationmatrix von:
1 0 0 0 1 0 0 0 1
Die Koordinaten selber scheinen hingegen übereinzustimmen, wenn man jetzt Drehungen durchführt, kriegt man mathematisch dasselbe Ergebnis raus.
Ich brauchs aber so, dass ich Gegenstände im ersten Programm genauso wie im zweiten ausrichten kann und damit arbeiten kann ohne verfälschte Ergebnisse zu bekommen. Denn wenn ich jetzt wollte dass in beiden Programmen der Gegenstand nach oben (z-Achse) zeigen würde, würde im ersten Programm eine Drehung um 90 Grad um die x-Achse gespeichert und im zweiten -90 Grad um die y-Achse.Ich weiß garnicht wie ich an das Problem rangehen soll >_<
-
Du kannst vom ersten zum zweiten Koordinatensystem mit folgender Matrix wechseln:
(0 1 0) S = (1 0 0) (0 0 -1)
Damit kannst Du auch die Rotationsmatritzen zwischen den beiden Koordinatensystemen hin- und herschieben:
Matrix A im einen Koordinatensystem entspricht SAS im anderen Koordinatensystem, da S selbstinvers ist.
-
hm ja , die matrix würde die Achsen so transformieren:
x = y
y = x
z = -zAllerdings hab ich das auch schon versucht und das Ergebnis war nicht richtig
Ich habe jetzt versucht auf folgende art zu transformieren:
M = ST
mit M als Transformierte Rotationsmatrix,
S =[ 0, 1, 0] [-1, 0, 0] [ 0, 0, 1]
Und T der Rotationsmatrix des Objekts im ersten Programm.
Damit kriege ich die richtigen Drehungen aber den negativen Winkel!!
Ich merk grad dass das was ich im ersten Post geschrieben habe quatsch ist...
-
Vergiss Rotationsmatrizen, Basistransformation heisst das Zauberwort.
Und die Transformationsmatrix hat dir Jester schon gegeben...
http://de.wikipedia.org/wiki/Basistransformation
-
[quote="Azrael, il Meraz"
M = STmit M als Transformierte Rotationsmatrix,
[/quote]versuch mal M = STS, mit dem S, das ich oben angegeben habe.
-
Ich hab gesagt dass ich mit genau dieser Matrix schon versucht hab, die Koordinaten zu transformieren. Hier ist das Ergebnis:
Bei beiden Programmen ist der betrachtete Gegenstand nach X ausgerichtet:
Programm Nr.1 mit M = T:0 1 0 -1 0 0 0 0 1
Programm Nr.1 mit M = STS:
0 -1 0 1 0 0 0 0 1
Programm Nr.2:
1 0 0 0 1 0 0 0 1
-
Und das funktioniert nicht? Sicher, dass die Basistransformation, die Du angegeben hast stimmt?
edit: und was genau heißt "an der X-Achse ausgerichtet"?
-
Azrael, il Meraz schrieb:
Ich merk grad dass das was ich im ersten Post geschrieben habe quatsch ist...
Hier hab ich eine graphische darstellung:
http://xcpp.org/ressources/Problem.png
-
Azrael, il Meraz schrieb:
Hier hab ich eine graphische darstellung:
http://xcpp.org/ressources/Problem.pngAuf jedem der drei Bilder ist nur genau ein Koordinatensystem zu sehen. Und nur auf dem obersten Bilder sind die Achsen X,Y und Z beschriftet.
Wo ist da also eine Koordinatentransformation?Weiter zeigen Bild 2 und Bild 3 genau das gleiche. Die Matrix rechts daneben ist aber verschieden. Was willst Du damit ausdrücken?
-
Sorry beim zweiten bild ist rot die X-, grün die Y- und Blau die Z-Achse.
Das ist gerade mein Problem - das ist absolut das gleiche, allerdings speichern die Programme die relative Drehung auf unterschiedliche Art und Weise.
Während für das erste Programm (3ds max übrigens) diese Position die Ausgangsposition ist und deshalb die Einheitsmatrix als Drehung gespeichert hat, sieht das zweite Programm (Blender3D) darin eine 90° Drehung um die Z Achse.
Ein Versuch, die Matrix wieder um -90° zurückzudrehen liefert falsche Ergebnisse.
Meine frage ist wie man die Drehmatrix "richtig" umwandelt
-
ok habs hinbekommen. Hier meine Lösung in python:
# turn the matrix (Y becomes the X axis) tm = (YtoXMatrix*tm) # translation part trpart = rtrpart = tm.translationPart() # obvious rotpart = tm.rotationPart() rm = rotpart.copy() rm.resize4x4() if not righthanded: rm[3][0] = trpart.x rm[3][1] = trpart.y rm[3][2] = trpart.z rm[3][3] = 1.0 else: rm[3][0] = -trpart.x rm[3][1] = -trpart.y rm[3][2] = -trpart.z rm[3][3] = 1.0 rotation = rm.rotationPart().invert() translation = rm.invert().translationPart()
mit YtoXMatrix =
[ 0,1,0,0] [-1,0,0,0] [ 0,0,1,0] [ 0,0,0,1]
Liefert das richtige ergebnis