Man muss eine mögliche Lösung vorher skizzieren, bevor man irgendeinen Code verwendet.
Möglichkeiten, einen Vektor in eine Ebene zu rotieren:
1. Projektion des Vektors in die Ebene
2. Irgendeinen der beiden Richtungsvektoren der Ebene nehmen
3. Irgendeine Linearkombination der beiden Richtungsvektoren der Ebene nehmen
Was man hier aber keineswegs braucht, sind irgendwelche Drehmatrizen.
Man muss eine mögliche Lösung vorher skizzieren, bevor man irgendeinen Code verwendet.
Möglichkeiten, einen Vektor in eine Ebene zu rotieren:
1. Projektion des Vektors in die Ebene
2. Irgendeinen der beiden Richtungsvektoren der Ebene nehmen
3. Irgendeine Linearkombination der beiden Richtungsvektoren der Ebene nehmen
Was man hier aber keineswegs braucht, sind irgendwelche Drehmatrizen.
Man muss eine mögliche Lösung vorher skizzieren, bevor man irgendeinen Code verwendet.
Möglichkeiten, einen Vektor in eine Ebene zu rotieren:
1. Projektion des Vektors in die Ebene
2. Irgendeinen der beiden Richtungsvektoren der Ebene nehmen
3. Irgendeine Linearkombination der beiden Richtungsvektoren der Ebene nehmen
Was man hier aber keineswegs braucht, sind irgendwelche Drehmatrizen.
hm das Problem, das ich habe ist, dass ich eben eine solche Matrix brauche, denn was ich eigentlich tun will ist die Drehung eines Quaders im Raum festzustellen um ihn dann mit der ihn umgebenden Puntkwolke so zu drehen, dass der Quader danach achsparallel ist.
Achsparallel bedeute, dass alle Kanten parallel zu einer Koordinatenachse sind.
Den Quader habe ich anhand der 6 Normalenvektoren seiner Ebenen gegeben.
Also wenn du so willst habe ich quasi ein quaderfestes Koordinatensystem mit dem Ursprung in einer Quaderecke und 3 Vektoren die senkrecht aufeinander stehen. Für dieses Koordinatensystem brauche ich jetzt die Drehwinkel um es mit einer Rotationsmatrix in die Ausrichtung des erdfesten Koordinatensystem zu drehen. (keine Verschiebung des Ursprungs des quaderfesten Koordinatensystems)
Ich habe mir jetzt noch überlegt, dass es eine simple Basistransformation ist. Schaue dir erstmal den Anhang an...
Die drei Normalvektoren des Quaders (diese sollten normiert sein) beschreiben ein transformiertes, rotiertes Koordinatensystem. Die Problematik hier ist scheinbar schlicht, auf ein Standardkoordinatensystem abzubilden. Dazu nimmst die drei normierten Normalenvektoren des Quaders und trägst diese spaltenweise in eine Matrix ein. Dann bildest du die Inverse dieser Matrix. Die Invertierbarkeit ist stets sichergestellt, da es sich um eine Basis handelt.
Diese inverse Matrix kannst du auf die Normalenvektoren und die Punktwolke anwenden und erhältst das von dir Gewünschte.
Ich habe mir jetzt noch überlegt, dass es eine simple Basistransformation ist. Schaue dir erstmal den Anhang an...
Die drei Normalvektoren des Quaders (diese sollten normiert sein) beschreiben ein transformiertes, rotiertes Koordinatensystem. Die Problematik hier ist scheinbar schlicht, auf ein Standardkoordinatensystem abzubilden. Dazu nimmst die drei normierten Normalenvektoren des Quaders und trägst diese spaltenweise in eine Matrix ein. Dann bildest du die Inverse dieser Matrix. Die Invertierbarkeit ist stets sichergestellt, da es sich um eine Basis handelt.
Diese inverse Matrix kannst du auf die Normalenvektoren und die Punktwolke anwenden und erhältst das von dir Gewünschte.
Oh cool das ist genau das, was ich für den Quader machen will.
Versteh ich das richtig, dass ich das, dann so machen muss?
Data'=inv([N1,N2,N3])*Data
/ N1 ⊥ N2 ⊥N3 (gegeben)
Dafür brauche ich aber dann alle 3 senkrecht aufeinander stehenden Ebenen-Normalen oder? (Das ist im allgemeinen kein Problem, da ich die beim Quader habe)
Mein Problem ist, dass ich das gleiche auch für einen Kegel raus bekommen will.
Ich hab dir ein Bild angehängt. Leider gab es in PowerPoint kein Kegel deswegen habe ich ersatzweise einen Zylinder genommen. Ich hab allerdings einen Kegel, dh mit Spitze oben.
Von dem Kegel habe ich nur die Spitze und die Ebenen-Normale, von der Ebene auf der er steht (die kann leider beliebig im Raum liegen).
Den Kegel würde ich jetzt gerne genauso wie den Quader so hindrehen, dass die Kegelachse parallel oder gleich der Z-Achse ist.
Oh cool das ist genau das, was ich für den Quader machen will.
Versteh ich das richtig, dass ich das, dann so machen muss?
Data'=inv([N1,N2,N3])*Data
/ N1 ⊥ N2 ⊥N3 (gegeben)
Dafür brauche ich aber dann alle 3 senkrecht aufeinander stehenden Ebenen-Normalen oder? (Das ist im allgemeinen kein Problem, da ich die beim Quader habe)
Bis hierhin ist alles korrekt soweit.
D-RSPhoenix hat Folgendes geschrieben:
Mein Problem ist, dass ich das gleiche auch für einen Kegel raus bekommen will.
Ich hab dir ein Bild angehängt. Leider gab es in PowerPoint kein Kegel deswegen habe ich ersatzweise einen Zylinder genommen. Ich hab allerdings einen Kegel, dh mit Spitze oben.
Von dem Kegel habe ich nur die Spitze und die Ebenen-Normale, von der Ebene auf der er steht (die kann leider beliebig im Raum liegen).
Den Kegel würde ich jetzt gerne genauso wie den Quader so hindrehen, dass die Kegelachse parallel oder gleich der Z-Achse ist.
Das muss doch auch irgendwie gehen.
Wenn du nur die Normale der Ebene hast, dann muss man, um eine Basis zu erhalten, zwei weitere Basisvektoren finden. Da aber ein Kegel, ebenso ein Zylinder, rotationssymmetrisch ist, würde ich zu einer Orthnormalbasis ergänzen mit dem Gram-Schmidtschen Orthogonalisierungsverfahren und dem Normalenvektor der Ebene als Startvektor für dieses Verfahren. Das klingt dramatisch, ist aber recht simpel.
Wenn du nur die Normale der Ebene hast, dann muss man, um eine Basis zu erhalten, zwei weitere Basisvektoren finden. Da aber ein Kegel, ebenso ein Zylinder, rotationssymmetrisch ist, würde ich zu einer Orthnormalbasis ergänzen mit dem Gram-Schmidtschen Orthogonalisierungsverfahren und dem Normalenvektor der Ebene als Startvektor für dieses Verfahren. Das klingt dramatisch, ist aber recht simpel.
Ich habe es bei mir mal ausprobiert und läuft recht gut. Lustigerweise wird der Kegel bei deiner Lösung in die XY-Ebene gelegt also mit Rotationsachse vom Kegel parallel zur Y-Achse Koordinatensystem aber da das immer so ist hab ich ihn einfach um weitere 90° gedreht dann passt alles
Code:
%Normalenvektor der Ebene, parallel zur Kegelhöhenlinie
c0=RANSAC_model;
%kanonische Basisergänzung
c1=[010]';
c2=[001]';
%Basis als Matrix dargestellt
A=[c0, c1, c2];
%Berechnung der QR-Zerlegung von A
[Q,R]=qr(A);
%Sicherstellen, dass c0 in der neuen Basis dieselbe Orientierung hat
Rotation=-1*Q';
%Q ist nun die Orthonormalbasis und Q' (Transponierte) die Inverse. Sodann gilt DataRot=Rot*Data, wobei Data jede bel. Punktmenge sein kann.
Data=Rotation*Data;
Data=Rot(Data,0,-90,0);
%Überprüfung ob dir Rücktrafo das Original ergibt
ata=Rot(Data,0,90,0);
ata=Rotation'*ata;
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.