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

Aktuelle Zeit: Fr Apr 19, 2024 11:56

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Quaternion > Eula Angles
BeitragVerfasst: So Sep 21, 2014 20:12 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Moin,

ich hab hier gerade ein ziemlich kniffliges Problem mit Rotationen. Ich speichere für meine Objekte die Rotationen immer in Eula-Winkeln bzw der User kann diese auch in Eula eingeben. Beim Rotieren über einen 3D gimbal nutze ich allerdings Quaternions für die korrekte Rotation um alle Achsen. Das funktioniert soweit auch gut. Hierfür habe ich mir damals ein paar nette routinen "zusammen" gesucht für Quaternion<>Eula, welche bis heute eigentlich ihren Dienst getan haben. Doch nun arbeite ich gerade an einer art Snapping funktion wo ich zwei Objekte (mit spez. Ankern) zusammen "heften" kann. Hieraus berechne ich mir am ende eine Matrix wie das Objekt zum schluss transformiert werden soll damit sie zusammen passen. Die resultierende Matrix scheint auch korrekt zu sein (gerendert isses korrekt), doch wenn ich nun hieraus die Rotation mit meiner alten Eula routine berechne gibt es so ein paar Fälle (meist wenn ein Objekt bereits gedreht wurde) wo Käse raus kommt.

Hier mal bissl Code wie ich aktuell die Eulas aus einer Quaternion bekomme
Code:
  1.  
  2.  
  3.     Public Shared Function CalculateRotX(q As Quaternion) As Single
  4.         Return Math.Atan2(((2.0! * ((q.W * q.X) + (q.Y * q.Z)))), ((1.0! - (2.0! * ((q.X * q.X) + (q.Y * q.Y))))))
  5.     End Function
  6.  
  7.     Public Shared Function CalculateRotY(q As Quaternion) As Single
  8.         Return Math.Asin(((-2.0! * ((q.X * q.Z) - (q.Y * q.W)))))
  9.     End Function
  10.  
  11.     Public Shared Function CalculateRotZ(q As Quaternion) As Single
  12.         Return Math.Atan2(((2.0! * ((q.W * q.Z) + (q.X * q.Y)))), ((1.0! - (2.0! * ((q.Y * q.Y) + (q.Z * q.Z))))))
  13.     End Function
  14.  


Noch zur info ich habe ein Left-Handed Koordinaten system.
Ich habe hier ein nettes Paper gefunden wo allerdings noch ein paar Bedingungen angesprochen werden (wie auch gimbal lock).. doch ich steig hier irgendwie nicht durch..
http://www.soi.city.ac.uk/~sbbh653/publ ... /euler.pdf


ADD:
und hier noch der Code wie ich aus den Eula's wieder die Quaternion für meine Objekte zaubere:
Code:
  1.  
  2.     'Erstellt eine Yaw Pitch Roll Quaternion mit Winkel in Radianten
  3.     Private Function NewQ(ByVal axis As Vector3, ByVal angle As Single) As Quaternion
  4.         Dim Q As New Quaternion
  5.         Dim num As Single = (Math.Sqrt(((((axis.X * axis.X) + (axis.Y * axis.Y)) + (axis.Z * axis.Z)))))
  6.         If (num > Single.Epsilon) Then
  7.             Dim num2 As Single = (0.5! * angle)
  8.             num = ((Math.Sin((num2))) / num)
  9.             Q.X = (num * axis.X)
  10.             Q.Y = (num * axis.Y)
  11.             Q.Z = (num * axis.Z)
  12.             Q.W = (Math.Cos((num2)))
  13.         Else
  14.             Q.X = 0.0!
  15.             Q.Y = 0.0!
  16.             Q.Z = 0.0!
  17.             Q.W = 1.0!
  18.         End If
  19.         Return Q
  20.     End Function
  21.  
  22.     Private Function QFromEulaAngle(pitch As Single, yaw As Single, roll As Single) As Quaternion
  23.         Dim Q As Quaternion = Quaternion.Identity
  24.         Q *= NewQ(New Vector3(1, 0, 0), pitch)
  25.         Q *= NewQ(New Vector3(0, 1, 0), yaw)
  26.         Q *= NewQ(New Vector3(0, 0, 1), roll)
  27.         Q.Normalize()
  28.         Return Q
  29.     End Function
  30.  




Grüße,
Thomas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quaternion > Eula Angles
BeitragVerfasst: Mi Sep 24, 2014 22:44 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Du meinst nicht zufällig Eulerwinkel, oder?

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quaternion > Eula Angles
BeitragVerfasst: Mi Sep 24, 2014 23:01 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Wenn bisher alles geklappt hat, wieso betrachtest Du die Objekte bezüglich der Rotation nicht als unabhängig, dann sollte es weiterhin klappen. Du musst eh jeden Vertex rotieren.
Ansonsten, wenn du die Teile zusammenklebst, ändert sich ja die Koordinaten der Vertices (im untransformierten Zustand, also gl_Vertex), das hat Auswirkungen auf die Rotation...

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 63 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.291s | 17 Queries | GZIP : On ]