Rotationsmatrix bestimmen



  • In einem kartesischen Koordinatensystem (3D) ist eine Ebene in der Form Ax + By + Cz + D = 0 gegeben. Nun suche ich eine Rotationsmatrix, mit welcher ich das Koordinatensystem so drehen kann, damit die z-Achse in die gleiche Richtung wie der Normalenvektor der Ebene n_v = (A,B,C) zeigt [1]. Wie kann ich aus der Ebenen-Gleichung diese Rotationsmatrix bestimmen?

    Angenommen ich habe nun diese Rotationsmatrix. Kann ich dann einfach die Punkte P_i aus dem ursprünglichen Koordinatensystem mit der Matrix multiplizieren und erhalte dann die Punkte P_i' im neuen Koordiatensystem? Weitere Berechnungen mit den Punkten P_i' im neuen Koordinatensystem kann ich danach durchführen wie "gewohnt"?

    Viele Fragen, ich weiss 🙂
    Hoffe trotzdem, dass ihr mir helfen könnt...

    [1] Am Besten wäre es zudem, wenn die x- und y-Achse des neuen Koordinatensystems in der erwähnten Ebene liegen, so dass ein Punkt auf der Ebene in der z-Komponente "die Höhe" Null hat. Wäre aber nur ein "nice to have"...



  • Um die Drehmatrix zu bestimmen muss ich ja den Drehwinkel alpha bestimmen und die Achse, um welche gedreht werden soll. Wenn ich das richtig sehe, muss ich zwei Drehungen durchführen; einmal mittels x-Achse und danach noch die y-Achse. Den jeweiligen Drehwinkel würde ich mittels Skalarpodukt vom Einheitsvektor der Achse mit dem Normalenvektor der Ebene berechnen:

    cos(alpha_1) = ((1,0,0) * n) / (|(1,0,0)| * |n|) (für die y-Achse)

    cos(alpha_2) = ((0,1,0) * n) / (|(0,1,0)| * |n|) (für die x-Achse)

    Als Drehmatrix würde ich diese von wikipedia http://de.wikipedia.org/wiki/Rotationsmatrix nehmen mit vertauschtem Vorzeichen für die Sinus-Einträge.

    Ist das soweit korrekt? Wenn ich mir das grafisch vorstelle, müsste ich wohl vor der Rotation die Drehwinkel noch von pi/2 subtrahieren, also:

    alpha_1 = pi/2 - alpha_1
    alpha_2 = pi/2 - alpha_2



  • Hi,

    poiz schrieb:

    Um die Drehmatrix zu bestimmen muss ich ja den Drehwinkel alpha bestimmen und die Achse, um welche gedreht werden soll.

    Das ist nicht nötig, wenn du die Basisvektoren kennst:
    Um aus dem System der Standardbasis (1,0,0) (0,1,0) (0,0,1) in ein system (v1,v2,v3) (w1,w2,w3) (n1,n2,n3) zu transformieren, benutzt man die Matrix

    [ v1 w1 n1 ]
    [ v2 w2 n2 ] = M
    [ v3 w3 n3 ]
    

    v,w und n müssen orthogonal und normiert sein.
    Die Rücktransformation M^-1 ist gleich M transponiert, da M eine orthogonale Matrix ist.
    Du musst nur v und w so wählen, dass sie normiert und auf n und aufeinander senkrecht stehen. Dabei kannst du auch deine andere Bedingung einfließen lassen.



  • Danke für die Antwort!

    1. Ich nehme zwei Punkte P1 und P2, die auf der Ebene mit der Normalen n = (n1,n2,n3) liegen. Aus den zwei Punkten berechne ich den Vektor w = P2 - P1. Dieser ist orthogonal zur Normalen n.

    2. Ich verschiebe die Normale n an den Punkt P1.

    3. Jetzt berechne ich mittels Kreuzprodukt den Vektor v, welcher zu n und zu w orthogonal ist: v = n x w

    4. Die Vektoren w und v normieren

    Somit habe ich die "neue" Basis bzw. die Matrix bestimmt. Soweit korrekt?
    (Bin mir nicht sicher, ob ich jetzt (1,0,0)<>(v1,v2,v3) und (0,1,0)<>(w1,w2,w3) vertauscht habe)

    Mit dieser Matrix M transformiere ich dann alle "ursprünglichen" Punkte in das neue System. Mit diesen transformierten Punkten kann ich dann "rechnen" wie gehabt?



  • Hab das Ganze mal in MatLab ausprobiert. Doch leider scheint bei meiner Vorgehensweise (siehe vorheriges Posting) etwas falsch zu sein. Denn die Transformation eines Punktes und anschliessende Rücktransformation mit der transponierten Matrix liefert nicht den ursprünglichen Punkt. Auch sollte doch die Determinante der (orthogonalen) Matrix 1 sein, wenn ich das bei wikipedia richtig interpretiert habe?

    Die Vektoren v,w und n haben übrigens alle den Betrag 1. Und als Test habe ich das Skalarprodukt von (n,w), (n,v) und (v,w) ausgerechnet; alle 0 (so bis zur 16-ten Nachkomma stelle :))

    Hat jemand einen Tipp, was falsch sein könnte?



  • poiz schrieb:

    Auch sollte doch die Determinante der (orthogonalen) Matrix 1 sein, wenn ich das bei wikipedia richtig interpretiert habe?

    ja, wenn du zwei vektoren vertauscht hast, -1. alles andere ist ein fehler.

    Die Vektoren v,w und n haben übrigens alle den Betrag 1. Und als Test habe ich das Skalarprodukt von (n,w), (n,v) und (v,w) ausgerechnet; alle 0 (so bis zur 16-ten Nachkomma stelle :))

    zeig' mal dein matlab-notebook, klingt eigentlich alles richtig.



  • hier der code:

    %Equation of the plane
    A = 0.104147;
    B = 0.374972;
    C = 0.921167;
    D = -12.8989;
    
    %with the normal vector
    n = [A B C];
    
    %point p1 on the plane
    p1 = [21.4435 5.0538 9.5212];
    %test must be zero
    %point_on_plane = A*p1(1) + B*p1(2) + C*p1(3) + D
    
    %point p2 on the plane
    p2 = [3.8097 14.9123 7.5018];
    %point_on_plane = A*p2(1) + B*p2(2) + C*p2(3) + D
    
    %vector w
    w = p2 - p1;
    
    %add plane normal to p1
    %does something goes wrong here?
    n_v = p1 + n;
    
    %vector v
    v = cross(n_v,w);
    
    w = w/norm(w);
    v = v/norm(v);
    
    %create Matrix
    M = [v(1) w(1) n(1); v(2) w(2) n(2); v(3) w(3) n(3)];
    %test
    det_equals_one = det(M)
    


  • Hi,

    wieso addierst du etwas zur normalen? die zeigt doch schon in die richtige richtung.
    wenn du eine verschiebung zusätzlich zur drehung haben willst, dann musst du diese auf jeden punkt einzeln anwenden:

    x' = M ( x - p )
    

    und da du v = n_v x w machst, aber n in die matrix packst, ist diese auch nicht mehr orthogonal



  • Ok, ich hab mir da was falsch überlegt. Ich wollte damit keine Verschiebung erreichen 🙄

    Jetzt sieht's aber gut aus:

    [snip]
    %vector w
    w = p2 - p1;
    
    %vector v
    v = cross(w,n); %why not cross(n,w)?
    
    w = w/norm(w);
    v = v/norm(v);
    
    %create Matrix
    M = [v(1) w(1) n(1); v(2) w(2) n(2); v(3) w(3) n(3)];
    

    Wobei mir nicht ganz klar ist, ob ich

    v = cross(w,n)
    

    oder

    v = cross(n,w)
    

    rechnen muss? Die erste Variante gibt eine Determinante von 1, die Zweite -1. n steht ja orthogonal auf der Ebene in Richtung der positiven z-Achse. Und der Vektor w liegt in der Ebene. Also müsste v doch n x w sein, was aber -1 als Determinante gibt.
    Bei Wikipedia steht, dass die Determinante von 1 der orthogonalen Matrix einer Drehung entspricht, was ich ja möchte.



  • poiz schrieb:

    rechnen muss? Die erste Variante gibt eine Determinante von 1, die Zweite -1. n steht ja orthogonal auf der Ebene in Richtung der positiven z-Achse. Und der Vektor w liegt in der Ebene. Also müsste v doch n x w sein, was aber -1 als Determinante gibt.
    Bei Wikipedia steht, dass die Determinante von 1 der orthogonalen Matrix einer Drehung entspricht, was ich ja möchte.

    Determinante = 1 ist auf jedenfall richtig, sonst wird das ganze nicht nur gedreht, sondern auch noch gespiegelt.

    für v = n x w ist (v,n,w) ein rechtshändiges system. das bildest du ab auf (v -> e_x, n -> e_z, w -> e_y), was ein linkshändiges system ist. deswegen determinante -1.



  • Vielen Dank für deine Hilfe 👍

    Dann rechne ich v = w x n und geh mal davon aus, dass das für jeden Vektor w der in der Ebene liegt, richtig rauskommt.

    Danke!



  • Ich bin mir nicht sicher, ob wir das nicht schon in einem anderen Thread hatten, aber wie heißt eine Matrix M, für die M = M^(-1) gilt?



  • D-U-D-E schrieb:

    Ich bin mir nicht sicher, ob wir das nicht schon in einem anderen Thread hatten, aber wie heißt eine Matrix M, für die M = M^(-1) gilt?

    einheitsmatrix 😉



  • thordk_ schrieb:

    D-U-D-E schrieb:

    Ich bin mir nicht sicher, ob wir das nicht schon in einem anderen Thread hatten, aber wie heißt eine Matrix M, für die M = M^(-1) gilt?

    einheitsmatrix 😉

    und alle wurzeln davon 🤡



  • Ich glaube nicht, dass es dafür einen feststehenden Begriff gibt, das ist eine ziemlich große Klasse von Matrizen, mindestens schonmal alle Matrizen, die zu einer Diagonalmatrix mit nur 1en und -1en auf der Diagonalen ähnlich sind, beispielsweise [5 -2; 12 -5].

    EDIT: Es sind sogar genau diese Matrizen.



  • Selbstinvers (involutorisch?) vielleicht?


Anmelden zum Antworten