Fixt nicht die Wikipedia. Sowohl Wikipedia wie auch mein letzter Post sind korrekt, und ich erkläre auch wieso.
verwenden, haben wir am Nord- und Südpol sowohl eine Singularität in der Parametrisierung, als auch einen Gimbal-Lock. In allen anderen Fällen haben wir am Nord- und Südpol jeweils eine Singularität in der Parametrisierung, aber keinen Gimbal-Lock dort.
bei einem solchen Fernrohr vorliegt, könnte durchaus ein Gimbal-Lock vorliegen. Schließlich wird beim Anvisieren des Helikopters die euklidische Koordinatenposition anvisiert, und wir haben keinen Funker, der uns zwei Kugelwinkel durchgibt. Damit gibt es dort auch keinen Zwischenschritt wie hier mit
und dann erst einer Euler-Rotation.
Wir haben dummerweise nun einmal nur eine zweidimensionale Mausposition als Eingabe; daher müssen wir parametrisieren und erzeugen dabei Singularitäten. Hätten wir ein magisches Eingabegerät, mit der wir einfach sagen können „schau dir mal den Punkt
an“, hätten wir keine Probleme.
besonders gut für eine First-Person-Kamera geeignet ist (sofern man überhaupt für die Berechnung dieser Kamera wirklich Euler-Winkel, und nicht gleich Quaternionen verwenden will):
Das GIF habe ich übrigens mittels Mathematica ausgegeben lassen. Hier mal der ganze Code, falls der interessant ist:
Code: Alles auswählen
Rx[\[Theta]_] = RotationMatrix[\[Theta], {1, 0, 0}]
Ry[\[Theta]_] = RotationMatrix[\[Theta], {0, 1, 0}]
Rz[\[Theta]_] = RotationMatrix[\[Theta], {0, 0, 1}]
(* Generate all Euler notations *)
R1[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Rx[\[Theta]].Ry[\[Phi]].Rz[\[Psi]]];
R2[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Rx[\[Theta]].Rz[\[Phi]].Ry[\[Psi]]];
R3[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Ry[\[Theta]].Rx[\[Phi]].Rz[\[Psi]]];
R4[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Ry[\[Theta]].Rz[\[Phi]].Rx[\[Psi]]];
R5[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Rz[\[Theta]].Rx[\[Phi]].Ry[\[Psi]]];
R6[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Rz[\[Theta]].Ry[\[Phi]].Rx[\[Psi]]];
R7[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Rx[\[Theta]].Ry[\[Phi]].Rx[\[Psi]]];
R8[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Rx[\[Theta]].Rz[\[Phi]].Rx[\[Psi]]];
R9[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Ry[\[Theta]].Rx[\[Phi]].Ry[\[Psi]]];
R10[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Ry[\[Theta]].Rz[\[Phi]].Ry[\[Psi]]];
R11[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Rz[\[Theta]].Rx[\[Phi]].Rz[\[Psi]]];
R12[\[Theta]_, \[Phi]_, \[Psi]_] =
Simplify[Rz[\[Theta]].Ry[\[Phi]].Rz[\[Psi]]];
(* In these angles we will have a gimbal lock - visible because of \
the addition of angles in the resulting matrix *)
Simplify[R1[\[Theta], 90 Degree, \[Psi]]]
Simplify[R2[\[Theta], -90 Degree, \[Psi]]]
Simplify[R3[\[Theta], -90 Degree, \[Psi]]]
Simplify[R4[\[Theta], 90 Degree, \[Psi]]]
Simplify[R5[\[Theta], 90 Degree, \[Psi]]]
Simplify[R6[\[Theta], -90 Degree, \[Psi]]]
Simplify[R7[\[Theta], 0 Degree, \[Psi]]]
Simplify[R8[\[Theta], 0 Degree, \[Psi]]]
Simplify[R9[\[Theta], 0 Degree, \[Psi]]]
Simplify[R10[\[Theta], 0 Degree, \[Psi]]]
Simplify[R11[\[Theta], 0 Degree, \[Psi]]]
Simplify[R12[\[Theta], 0 Degree, \[Psi]]]
(* We want to use a left-handed coordinate system, like in Direct3D. \
Invert some axis. Here, we invert the z-Axis. *)
InvertZ[x_] := {x[[1]], x[[2]], -x[[3]]};
(* Use a simpe mouse to Euler-angle transformation for R2 *)
MouseToAngle[mx_, my_] = {Pi/2,
Mod[2 Pi*mx + Pi/2 , 2 Pi], -Pi*my + Pi/2};
(* Play with R2: Use \[Phi] and \[Psi] *)
Manipulate[Graphics3D[{Thick,
Red, Line[{{0, 0, 0}, InvertZ [{1, 0, 0}]}],
Green, Line[{{0, 0, 0}, InvertZ[{0, 1, 0}]}],
Blue, Line[{{0, 0, 0}, InvertZ[{0, 0, 1}]}],
Orange,
Line[{{0, 0, 0}, InvertZ[R2[\[Theta], \[Phi], \[Psi]].{1, 0, 0}]}],
Gray, Line[{{0, 0, 0},
InvertZ[R2[\[Theta], \[Phi], \[Psi]].{0, 0.5, 0}]}],
Gray, Line[{{0, 0, 0},
InvertZ[R2[\[Theta], \[Phi], \[Psi]].{0, 0, 0.5}]}]},
{PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}},
ViewVertical -> {0, 1, 0}, ViewPoint -> {1.5, 2, 1}}], {{\[Theta],
90 Degree}, 0, 2 Pi}, {\[Phi], 0, 2 Pi}, {{\[Psi], 100 Degree}, 0,
2 Pi}]
(* Play with R2: Use mx and my *)
Manipulate[Graphics3D[{Thick,
Red, Line[{{0, 0, 0}, InvertZ [{1, 0, 0}]}],
Green, Line[{{0, 0, 0}, InvertZ[{0, 1, 0}]}],
Blue, Line[{{0, 0, 0}, InvertZ[{0, 0, 1}]}],
Orange,
Line[{{0, 0, 0}, InvertZ[R2 @@ MouseToAngle[mx, my].{1, 0, 0}]}],
Gray, Line[{{0, 0, 0},
InvertZ[R2 @@ MouseToAngle[mx, my].{0, 0.5, 0}]}],
Gray, Line[{{0, 0, 0},
InvertZ[R2 @@ MouseToAngle[mx, my].{0, 0, 0.5}]}]},
{PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}},
ViewVertical -> {0, 1, 0}, ViewPoint -> {1.5, 2, 1}}],
{mx, 0, 1}, {my, 0, 1}]
(* Plot the R2 rotation animation *)
rotationAnimation = Table[Graphics3D[{Thick,
Red, Line[{{0, 0, 0}, InvertZ [{1, 0, 0}]}],
Green, Line[{{0, 0, 0}, InvertZ[{0, 1, 0}]}],
Blue, Line[{{0, 0, 0}, InvertZ[{0, 0, 1}]}],
Orange,
Line[{{0, 0, 0},
InvertZ[R2 @@ MouseToAngle[mx, 0.05].{1, 0, 0}]}],
Gray,
Line[{{0, 0, 0},
InvertZ[R2 @@ MouseToAngle[mx, 0.05].{0, 0.5, 0}]}],
Gray,
Line[{{0, 0, 0},
InvertZ[R2 @@ MouseToAngle[mx, 0.05].{0, 0, 0.5}]}]},
{PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}},
ViewVertical -> {0, 1, 0}, ViewPoint -> {1.5, 2, 1}}],
{mx, 0, 1, 0.025}];
(* Safe the animation as a GIF *)
Export["animation.gif", rotationAnimation, "DisplayDurations" -> 0.01]