Moin!
Für ein Projekt muss ich auch 6 Punkten in den jeweiligen Raumrichtungen (+X,-X,+Y,-Y,+Z,-Z) ein lokales Rechte-Hand-Koordinatensystem konstruieren. Dazu gibt es bekanntermaßen 48 Lösungen, ich suche die mit der geringsten Rotation gegenüber einem Referenzsystem, sollten 2 gleich gut sein, dann das, dessen (1,1,1)-Vektor im positiven Oktanten des Referenzsystems liegt. (
Beispiel)
Mein aktuelles Vorgehen sieht so aus:
Quelltext
1: 2: 3: 4:
| Aus der Menge der Nachbarn N, Mittelpunkt C: finden: kleinster winkel (C->N) zu (1,0,0), speichern als "A" finden: kleinster winkel (C->N) zu (0,1,0), welcher senkrecht auf (C->"A") steht, speichern als"B" (0,0,1) ist dann "A" x "B" (Überprüfung: da muss auch ein N sein) |
Funktioniert sehr gut, aber wenn eine Achse genau 45° gedreht ist gibt es immer 2 gleich gute Lösungen für die betreffende Richtung, nämlich mit +45 und -45° (was als Winkel zwischen Vektoren beides 45° ergibt, da ist das Problem). Da werfe ich im Moment mit Sonderfallbehandlungen drauf, aber das kanns nicht so ganz sein.
Das könnte man einfacher machen, wenn ich aus den 3 Vektoren direkt eine Matrix konstruiere und dann die Eulerwinkel zwischen der Referenzmatrix und der neuen Matrix bestimme (also: "wie müsste ich das rotieren, um das ermittelte zu bekommen?") und diese minimiere. Sind ja nur 48, das ist von der Rechenzeit nicht so schlimm.
Erschwerend kommt hinzu, dass meine Deformation keine reine Rotation ist, sondern geringe Scher- und Stauchkomponenten enthält. Das Koordinatensystem wird also nicht exakt Orthogonal sein, aber definitiv in >85°.
Hat da jemand eine clevere Idee?
Viele Grüße,
Sebastian
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."