Drehmatrize: Objekt im R³ um Alpha auf X-Achse drehen



  • Guten Tag,
    ich möchte ein Objekt im R³ um einen Winkel alpha drehen. Leider komme ich damit nicht wirklich zurecht..

    Ich habe ein Alpha (zwischen 0. und 2.*Pi) und möchte jetzt Y und Z jeweils um Alpha drehen. X soll gleich bleiben, das Objekt soll also nur auf der X-Achse gedreht werden (Richtung egal). (Das ganze muss ich in C++ umsetzen..) Die Erklärung auf Wikipedia (Drehmatrize) verstehe ich nicht recht.. Wie muss ich denn Y und Z berechnen, wenn ich das Objekt um Alpha drehen möchte?

    Was ist denn mit folgendem gemeint (s. Wikipedia)?

    1    0       0
    0  cos(a)  -sin(a)
    0  sin(a)  cos(a)
    

    Muss ich dann sowas in der Art machen?

    // a ist Alpha
    Y = cos(a) + sin(a);
    Z = cos(a) - sin(a);
    

    Ich komme gerade nicht weiter und bin für jede Hilfe dankbar!



    1. Es heisst Drehmatrix 😉
    2. Wenn du die Drehmatrix A=
    1     0     0
    0   cos(a) -sin(a)
    0   sin(a) cos(a)
    

    gegeben hast(Dies ist eine Drehung um die X-Achse!), musst du jeden Punkt x mit dieser Matrix multiplizieren. Ergebnis x' = A * x ist dann der gedrehte Punkt.



  • Ok, also muss ich Y' = Y * A(alpha), wobei A = dieser Matrix entspricht:

    1     0     0
    0   cos(a) -sin(a)
    0   sin(a) cos(a)
    

    .. Da liegt mein Problem! Wie multipliziere ich denn eine Matrix mit einem Punkt?

    Ich habe X, Y, Z und Alpha.
    X' = X
    Y' = YX + cos(a) + sin(a)
    Z' = Z
    X - sin(a) + cos(a)

    Stimmt das so? Kann ich mir nicht vorstellen..

    Ich glaube ich verstehe außerdem die Drehmatrix nicht:

    ist es:
    
    X     Y     Z
    1     0     0
    0   cos(a) -sin(a)
    0   sin(a) cos(a)
    
    oder:
    
    X  1     0     0
    Y  0   cos(a) -sin(a)
    Z  0   sin(a) cos(a)
    
    .. und was stellt sie eigentlich dar?
    


  • Einen "Punkt" kannst du dir als Vektor hernehmen (1*n Matrix) - und dann die ganz normale Matrixmultiplikation ausführen:

    / x \   / 1     0       0   \
    P * R = | y | * | 0   cos a  -sin a |
            \ z /   \ 0   sin a   cos a /
            / x*1 + y*0     + z*0     \
          = | x*0 + y*cos a - z*sin a |
            \ x*0 + y*sin a + z*cos a /
    


  • etcpp schrieb:

    Ok, also muss ich Y' = Y * A(alpha),

    Nein: Y' = A(alpha) * Y

    Google mal nach Matrixmultiplikation, hier aber mal ein Beispiel:

    b' = A * b
    
    b= (b_x, b_y, b_z)^T 
    
       a11 a12 a13
    A =a21 a22 a23
       a31 a32 a33
    
    b_x' = a11*b_x + a12*b_y + a13*b_z
    b_y' = a21*b_x + a22*b_y + a23*b_z
    b_z' = a31*b_x + a32*b_y + a33*b_z
    

    @CStoll : Vertausch mal den Vektor und die Matrix 😉



  • CStoll schrieb:

    Einen "Punkt" kannst du dir als Vektor hernehmen (1*n Matrix) - und dann die ganz normale Matrixmultiplikation ausführen:

    / x \   / 1     0       0   \
    P * R = | y | * | 0   cos a  -sin a |
            \ z /   \ 0   sin a   cos a /
            / x*1 + y*0     + z*0     \
          = | x*0 + y*cos a - z*sin a |
            \ x*0 + y*sin a + z*cos a /
    

    Du meinst natürlich andersrum (R*P), sonst ist das keine normale Matrixmuliplikation, sondern gar nicht erst definiert.



  • megaweber schrieb:

    @CStoll : Vertausch mal den Vektor und die Matrix 😉

    Daniel E. schrieb:

    Du meinst natürlich andersrum (R*P), sonst ist das keine normale Matrixmuliplikation, sondern gar nicht erst definiert.

    OK, überstimmt.

    (das sind die Feinheiten der Mathematik, die ich mir nach dem Abi "abgewöhnt" habe :D)



  • Okay, also sieht das Ganze folgendermaßen aus?

    / 1     0       0   \   / x \
    R * P =  | 0   cos a  -sin a | * | y |
             \ 0   sin a   cos a /   \ z /
    
            / 1*x + 0*y       + 0*z     \
          = | 0*x + cos(a)*y - sin(a)*z |
            \ 0*x + sin(a)*y + cos(a)*z /
    

    bzw.

    Y = cos(alpha)*Y - sin(alpha)*Z;
    Z = sin(alpha)*Y + cos(alpha)*Z;
    

    Ist das so in Ordnung? Dann muss ich mir nur noch überlegen, wie ich das testen kann..

    Besten Dank!!



  • Du solltest vorsichtig sein, wenn Du das so hinschreibst wie in deiner letzten Formel, dann änderst Du mit der ersten Zuweisung schon den y-Wert und rechnest dann in der zweiten Formel schon mit dem neuen Wert. Das wird dann aber falsch. Lieber

    x' = x
    y' = ...
    z' = ...

    und dann am schluß die Werte setzen:
    x = x'
    y = y'
    z = z'.



  • Ohja, Du hast recht.. Danke für den Tipp!



  • etcpp schrieb:

    Ohja, Du hast recht.. Danke für den Tipp!

    Bitte, wärst sicher nicht der erste, dem dieser Fehler passiert... und auch nicht der letzte. 😉


Anmelden zum Antworten