Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 21, 2024 21:43

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Nov 24, 2007 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Hiho!

nach gefühlten 1000 Jahren verschlägts mich mal wieder hier hin, und dann gleich mit sowas ;)

Also, eventuell kennts ja wer: GTA speichert in seinen Map-Dateien Rotationen von Objekten als Quaternionen. So als normaler Mensch hätte ich aber lieber normale Eulersche Winkel (nicht nur ich; das ganze kommt später mal in ein SA:MP Skript, was die als rx, ry, rz erwartet... muss jetzt aber keiner verstehen^^)

Jedenfalls, ich hab mich etwas belesen und weiß jetzt was Quaternionen sind, aber irgendwie nutzt mir das jetzt gar nichts. Wie berechne ich jetzt aus den 4 Komponenten der Quaternion die 3 Winkel für die Drehungen um die Achsen? Da steig ich nicht so wirklich durch...

Kann mir das mal wer so erklären, dass man das ohne Studium versteht? :roll:

Danke schonmal,
Martok

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 24, 2007 16:00 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Euler winkel sind so ziemlich das schlechteste, wie man rotationen speichern will, weil sie in unangenehmer weise nicht eindeutig sind und man auch noch wissen muss, in welcher Reihenfolge sie gespeichert werden. Quaternionen legen dagegen die Rotationen sehr einfach ab: Im realteil (normalerweise 1. komponente) liegt der cosinus des drehwinkels. Die drei Imaginären komponenten stellen die drehachse dar (einfach wie einen vektor behandeln), der mit dem sinus des drehwinkels multipliziert wurde - wenn du also den imaginären teil normierst, bekommst Du die Drehachse heraus. Ist jedenfalls die Essenz aus http://wiki.delphigl.com/index.php/Quat ... rien_auf_V:
Code:
  1. Q = cos(α) + sin(α)*P, 0<=α<=π, P aus V, ||P|| = 1,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 24, 2007 16:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Genau das meinte ich... so weit war ich auch schon, aber ich verstehe nicht, wie ich da draus jetzt Winkel machen kann.

Dass die eventuell nicht das beste sind, kann ich im Moment nicht ändern, denn die Funktion erwartet die nun mal so... Das mit dem nicht eindeutig würde aber erklären, warum im MapEditor die Achsen (der für die Anzeige Eulerwinkel nimmt) immer mal spontan von 180,180,180+x auf 0,0,360-x oder so wechseln... wenn das die gleiche Quaternion ist, wäre das ja nicht mal ein Bug.

EDIT:
Code:
  1.   a:= ArcCos(q.RealPart);
  2.   s:= sin(a);
  3.   ScaleVector(q.ImagPart, 1 / s);

Womit a den Winkel und ImagPart den Drehvektor in 'Einzelteilen' enthalten sollte. Völliger Blödsinn oder ist was richtiges dran?

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 24, 2007 19:55 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
http://en.wikipedia.org/wiki/Gimbal_lock Ist z.B. eines der Probleme, die Euler Winkel erzeugen. Ansonsten, wenn Du die Quaternionisometrie auf die vektoren i,j,k anwendest, bekommst du, wenn du die bilder als spalten nebeneinander schreibst und die reele koordinate streichst, genau die matrix, die die gleiche rotation beschreibt. aus der kannst du dann unter bestimmten voraussetzungen (dort wo euler eindeutig ist), die winkel berechnen. http://en.wikipedia.org/wiki/Euler_rotation da pakcst du einfach die matrix, die die euler winkel in der reihenfolge beschreibt, die du brauchst, z.b. die xyz variante. und da siehst du, daß den ersten winkel den du zurückrechnen kannst, -s2 ist (das ist wohl ohne die notation genau durchgecheckt zu haben -sinus vom y-winkel sein). Und dann hangelste dich durch - ist ne unschöne rechnerei, aber machbar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 24, 2007 21:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
:shock:

Tja. Die Lösung mit der Matrix hatte ich als erstes probiert, hab aber die Ursprungs-Winkel auch nicht rausgekriegt.

Der Artikel 'Euler Rotation' enthält aber einen interessanten Link auf http://en.wikipedia.org/wiki/Conversion ... ler_angles und weiter auf EuclideanSpace, was aber in diesem besonderen Fall auch nicht hilft, da die Ergebnisse nicht nachvollziehbar manchmal stimmen und manchmal nicht. Übrigens kommen beide Seiten zu unterschiedlichen Gleichungen, bei denen EuclideanSpace auch noch am Ende der Seite eine ganz andere verwendet als vorher hergeleitet...
Code:
  1.   test:= q[0]*q[1] + q[2]*q[3];
  2.   if (test > 0.499) then begin
  3.     heading := 2*ArcTan2(q[0],q[3]);
  4.     attitude := pi/2;
  5.     bank := 0;
  6.   end else
  7.   if (test < -0.499) then begin
  8.     heading := -2*ArcTan2(q[0],q[3]);
  9.     attitude := pi/2;
  10.     bank := 0;
  11.   end else
  12.   begin
  13.     attitude:= ArcSin(2*(q[0]*q[1] + q[2]*q[3]));
  14.     heading:= ArcTan2(2*(q[2]*q[3] - q[0]*q[2]),1-2*(sqr(q[0])-sqr(q[2])));
  15.     bank:= ArcTan2(2*(q[0]*q[3] - q[1]*q[2]),1-2*(sqr(q[1])-sqr(q[2])));
  16.   end;

Hier stimmt attitude, aber sobald einer der beiden ArcTan2-Ausdrücke ins Spiel kommt, passt nichts mehr.
Beispielsweise wird aus (-0.515458646873, -0.515458646873, -0.484049966046, 0.484045862598) (rx: -45.915 ry: -46.800 rz: 3.600), richtig wäre (270, 270, 3.60). Im Prinzip also so ein 90°-Grenzfall, aber die werden doch behandelt?

Ich werd hier noch verrückt. Wenn der Programmierer vom MapEditor eine Kontaktadresse hätte, hätte ich ja den schon befragt... Gibts aber nur nen Forum-Thread dazu, und da war er schon länger nicht mehr.

Edit: 11-25 02:16 Ein paar Klammern waren falsch. Aber trotzdem kommt nicht immer das richtige raus...

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 27, 2007 00:00 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hallo,

Villeicht hilft dir folgendes...Das sollte eigentlich fuktionieren
PS: ich hatte auch mal mit einer direkten umwandlung versucht, bin aber irgendwie auch gestrandt.

Code:
  1.  
  2.  
  3. function QuaternionToEuler(Q: TQuaternion): Vector3f;
  4. begin
  5.   Result:= OGL_MatrixtoEuler(QuaternionToMatrix(Q))
  6. end;
  7.  
  8. function OGL_MatrixToEuler(M: GLMatrix4f): Vector3f;
  9. //calcules Euler Angles form a Matrix
  10. var c: Single;
  11. begin
  12.   Result[2]:= arcsin(M[8]);
  13.   c:= cos(Result[2]);
  14.   if Abs(c) > 0.005 then begin
  15.     Result[1]:= arctan2(-M[9] / c, M[10] / c);
  16.     Result[3]:= arctan2(-M[4] / c, M[0] / c);
  17.   end
  18.   else begin
  19.     Result[1]:= arctan2(M[1], M[5]);
  20.     Result[3]:= 0;
  21.   end;
  22.   Result[1]:= Result[1] * 180 / PI;
  23.   Result[2]:= Result[2] * 180 / PI;
  24.   Result[3]:= Result[3] * 180 / PI;
  25.   //return only positive angles in [0,360]
  26.   if (Result[1] < 0) then Result[1]:= Result[1] + 360;
  27.   if (Result[2] < 0) then Result[2]:= Result[2] + 360;
  28.   if (Result[3] < 0) then Result[3]:= Result[3] + 360;
  29. end;
  30.  
  31. function QuaternionToMatrix(Q: TQuaternion): GLMatrix4f;
  32. // Constructs rotation matrix from (possibly non-unit) quaternion.
  33. // Assumes matrix is used to multiply column vector on the left:
  34. // vnew = mat vold.  Works correctly for right-handed coordinate system
  35. // and right-handed rotations.
  36. var Norm, S,
  37.   XS, YS, ZS,
  38.     WX, WY, WZ,
  39.     XX, XY, XZ,
  40.     YY, YZ, ZZ: Single;
  41.  
  42. begin
  43.   Norm:= Q.Vector[0] * Q.Vector[0] + Q.Vector[1] * Q.Vector[1] + Q.Vector[2] * Q.Vector[2] + Q.RealPart * Q.RealPart;
  44.   if Norm > 0 then S:= 2 / Norm
  45.   else S:= 0;
  46.  
  47.   XS:= Q.Vector[0] * S; YS:= Q.Vector[1] * S; ZS:= Q.Vector[2] * S;
  48.   WX:= Q.RealPart * XS; WY:= Q.RealPart * YS; WZ:= Q.RealPart * ZS;
  49.   XX:= Q.Vector[0] * XS; XY:= Q.Vector[0] * YS; XZ:= Q.Vector[0] * ZS;
  50.   YY:= Q.Vector[1] * YS; YZ:= Q.Vector[1] * ZS; ZZ:= Q.Vector[2] * ZS;
  51.  
  52.   Result[0]:= 1 - (YY + ZZ); Result[4]:= XY + WZ; Result[8]:= XZ - WY; Result[12]:= 0;
  53.   Result[1]:= XY - WZ; Result[5]:= 1 - (XX + ZZ); Result[9]:= YZ + WX; Result[13]:= 0;
  54.   Result[2]:= XZ + WY; Result[6]:= YZ - WX; Result[10]:= 1 - (XX + YY); Result[14]:= 0;
  55.   Result[3]:= 0; Result[7]:= 0; Result[11]:= 0; Result[15]:= 1;
  56. end;
  57.  
  58.  


Grüße
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 27, 2007 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Danke!

Das war bis jetzt das was mich am weitesten gebracht hat. Trotzdem stimmen immer noch ca 40% nicht. Allerdings ist der Fehler diesmal eingrenzbar: entweder links und rechts falschrum drehend, oder aber 90° zu wenig um die senkrechte Achse. Wie man diese Fälle dann aber erkennen soll..

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 02, 2007 16:41 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Das Problem ist halt, daß die Winkel nicht eindeutig sind und deren Anwednugsreihenfolge ein Rolle spielt.
Es kann also mehre Winkelkombinatonen geben, die zu dem selben Ergebnis führen können.

Grüße
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 02, 2007 17:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Das hier hab ich im SAMP-Forum gefunden, als mal jemand anders das versucht hat:
Zitat:
The PAWN code is not incorrect, the functions GTA uses to rotate the objects are incorrect. IIRC z rotation is done around the world's z axis, x and y rotation are done around the object's x and y axies respecitvely.

(http://forum.sa-mp.com/index.php?topic=21572.0)

Sagt mir aber gar nix. Ich persönlich hab damit abgeschlossen. Ich versteh zwar mittlerweile was passiert, aber nicht warum jeder andere Zahlen raus kriegt...

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]