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!
-
- Es heisst Drehmatrix
- 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' = ZX - 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.