Forum: PC-Programmierung Drehung einer Matrix im Raum


von j. c. (jesuschristus)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe ein dreidimensionales Volumen als Matrix von Binärwerten. Darin 
befindet sich ein zylindrisches/kegelförmiges Objekt, mittig, aber in XZ 
und YZ Ebene gedreht, also schief. Ein Beispielbild hängt an.
Für die Länge des Objekts will ich jetzt an jeder Stelle den Durchmesser 
bestimmen, sowie Fläche und Rundheit.

Die erste Herangehensweise wäre, das Objekt parallel zur Z-Achse drehen, 
und dann für jede Slice die Paramter zu bestimmen: Dafür habe ich den 
Drehwinkel in den beiden Ebenen bestimmt, und nacheinander um diese 
Winkel die Matrix gedreht. Und in diesem Moment stoße ich an ein 
Problem: da Matrixmultiplikationen nicht kommutativ sind, führt die 
Drehung um diese Winkel nicht zu einem Objekt, welches gerade im Volumen 
steht. Durch die erste Drehung, drehe ich nicht nur das Objekt, sondern 
auch das Koordinatensystem mit. Daher versagt die zweite Drehung.
Wie kann ich das Problem lösen? Nur um eine Achse drehen, dann den 
Winkel neu bestimmen? Um beliebige Achse im Raum drehen? Da steige ich 
durch die Mathe nicht durch...
Gibt es vielleicht eine andere Herangehensweise? Beispielsweise eine 
virtuell gedrehte Slice aus dem Volumen zu berechnen, statt das ganze 
Volumen zu drehen?

Danke für Eure Hilfe!

von Klaus T. (gauchi)


Lesenswert?

Versteh ich dich richtig, dass du die echte Achse deines Objektes kennst 
und du diese jetzt auf die z-Achse drehen willst? Oder willst du die 
Achse des Objekts bestimmen? Wenn du die Achse hast: in welcher Form ist 
sie denn gegeben?

Edit:
noch mal nachgedacht: Das erzeugen einer virtuellen Slice durch dein 
Gebilde bedeutet, dass du die Voxel-Positionen in eine Ebene 
projizierst. Dafür musst du ein lokales Koordinatensystem definierten, 
in dem eine Achse in der Achse des Objekts liegt. Wenn du dieses 
Koordinatensystem bestimmt hast, hast du auch die gesuchte Drehmatrix 
gefunden, d.h. mathematisch macht es keinen Unterschied, ob du den Raum 
drehst oder die Schnittebene.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

j. c. schrieb:
> Um beliebige Achse im Raum drehen? Da steige ich
> durch die Mathe nicht durch...

Normalerweise verschiebt man das Objekt zunächst in den Nullpunkt des 
Koordinatensystems, dreht um die gewünschte Achse und verschiebt dann 
zurück.

von j. c. (jesuschristus)


Lesenswert?

Genau, so habe ich das auch gemacht. Meine Frage ist nur, wie mache ich 
das mit der Drehung genau?
Ich habe die Achse des Objekts nicht wirklich, sondern bestimme sie nur 
aus den Mittelpunkten der Querschnitte entlang der Z-Achse (das Objekt 
hat nicht mehr als 45° Neigungswinkel und ändert sich relativ stetig 
über die Länge).

von Quat (Gast)


Lesenswert?

In der 3D-Computergraphik werden zur Rotation neben
den Std.Rotationsmatrizen Quaternionen eingesetzt.
In der Anwendung eigentlich sehr einfach, aber die
Theorie dahinter ein wenig komplex.
Vereinfacht ist ein Quaternion ein skalierter Vektor
(um den gedreht werden soll) um einen vieten Wert
ergänzt  (= 2X Drehwinkel). Falls du Windows hast:
Schau mal in der Direct3D-SDK nach, die enthält alle
notwendigen Umrechnungen. Oder schau mal in Wiki nach.
Es gibt insegsamt 3 Definitionen/Ableitungen, hoffe
eine davon ist für dich verständlich.

=> Ansatz: erster Vektor+Winkel rotiert Achse in
eine Ebene, zweiter Vektor+Winkel rotiert dann die
Achse auf die Zielachse.

Viel Spass

von j. c. (jesuschristus)


Lesenswert?

Hmm, interessant. Danke. Irgendwie wäre eine Seite schön, auf der das 
ganze in matlab beschrieben wird. Da habe ich das nur für Drehungen in 
den Achsen selbst gefunden, und das habe ich ja schon/ macht Probleme. 
Das ganze soll noch für einen Kongressvortrag fertig werden und da stehe 
ich etwas unter Zeitdruck und habe keine Zeit mehr, mich so tiefgründig 
damit zu beschäftigen, wie ich das gern tun würde...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Dann hau doch hier mal rein was du hast + Beschreibung was du dir anders 
vorstellst, eventuell kann dir jemand helfen... Manchmal hat man auch 
nur die Reihenfolge der Operationen vertauschst etc...

von j. c. (jesuschristus)


Lesenswert?

Hallo nochmal. Ich mache es jetzt so, dass ich erst um die eine Achse 
drehe. Damit richte ich die Struktur aus, und ändere den Winkel in der 
zweiten Dimension. Dann bestimme ich den neu und drehe um die zweite 
Achse. Da nun der Winkel in der ersten Dimension 0 ist, wird er auch 
nicht mit verzerrt. Da löst zwar ncht das Problem der kardanischen 
Blockade, aber meine Strukturen richten sich auf und ich kann die 
Paramter ausreichend genau bestimmen.
Eure Ideen waren sehr hilfreich, danke. Wenn ich Zeit habe, gehe ich das 
alles nochmal durch. Wenn jemand eine Quelle im NEtz oder in Büchern 
kennt, wo das alles mal für die Dummen beschrieben ist, wäre ich 
trotzdem sehr, sehr dankbar!

Grüße,
jc

von Quat (Gast)


Lesenswert?

Einen richtig guten Link habe ich nicht (Wiki liefert
hier nicht das Sahnehäupchen), aber ein PDF mit einer
kurzen Einführung (geometrisch motiviert):

http://campar.in.tum.de/twiki/pub/Chair/DwarfTutorial/quatut.pdf

Mach dir einfach nur klar, was die ersten 3 Komponenten
eines Einheitsquaternion machen (legen Rotationsachse fest)
und wie die Relation zur vierten Komponente ist (darüber
wird der Rotationswinkel festgelegt). Dann muss du nur noch
dir im klaren sein, wohin du drehen willst und wie du die
Rot.Achse berechnest (z.B. per Kreuzprodukt).

Viel Spass


P.S. deine Aufgabenstellung ist extrem lückenhaft. Sind z.B.
die Rotationswinkel bekannt oder unbekannt (dann muss die
Rotation manuell bestimmt werden oder ein komplexer Algo
aus z.B. Bilderkennung muss die Grundebenen etc. finden
-- puh --)...

von Purzel H. (hacky)


Lesenswert?

>Das ganze soll noch für einen Kongressvortrag fertig werden und da stehe
ich etwas unter Zeitdruck und habe keine Zeit mehr, mich so tiefgründig
damit zu beschäftigen, wie ich das gern tun würde...


Der Troll. Rotationen sind eher was Triviales. Wenn man's nicht 
geschnallt hat, sollte man auch keinen Vortrag drueber halten...

von Quat (Gast)


Lesenswert?

Jedes gute Studium beginnt mit einer recht einfachen
Lektion: Verwende niemals das Wort "Trivial" (siehe
Anekdoten zu "trivial"..).
Speziell zur Rotation: Eine Rotation ist einfach zu
verstehen, mehrere verursachen wegen der fehlenden
Kommutativität schnell Konfusionen.

Frag dich also lieber mal selber: wer ist hier der
Troll!!

von L.E. (Gast)


Lesenswert?

Mach die Drehungen infinitessimal, dann klappt das auch mit der 
Kommutativität.
Die Eulerschen Winkel wären eine Möglichkeit zur Beschreibung der Lage.

von Purzel H. (hacky)


Lesenswert?

Auch infinitesimale Drehungen kommutieren nicht. Sorry. Die Reihenfolge 
muss vorgegeben werden. zB wie bei den Eulerwinkeln.

Trivial bedeutet man kann sich eine Euler Matrize ais einer planaren 
Dreheung herleiten. Aber der Poster hat ja keine Zeit vor dem Vortrag. 
Dann sollte er zumindest faehig sein diese 3D Drehmatrize per Gurgel zu 
ersuchen. Die steht sicher irgendwo am Stueck. Ein Minimum an Linearer 
Algebra sollte bekannt sein fuer sowas. Zb die Eigenschaften einer 
Drehmatrix, zB Determinante gleich Eins und so.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.