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

Aktuelle Zeit: Do Apr 25, 2024 21:58

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Mär 31, 2015 12:39 
Offline
DGL Member

Registriert: Di Jun 10, 2014 06:59
Beiträge: 17
Programmiersprache: Delphi XE6
Hallo zusammen,

ich möchte die Bedienung meines aktuellen Programms verbessern bzw. intuitiver machen. Ein Punkt der mich ziemlich stört ist die Rotation. Ich versuche es mal zu erklären.

Derzeit rotiere ich mein Modell beim Bewegen der Maus (bei gedrückter Taste) um zwei feste Achsen. Vereinfacht sieht das etwa so aus:

Code:
  1.     // rotieren X/Y
  2.     if Shift = [ssMiddle] then
  3.     begin
  4.       ObjRotX := ObjRotX + DeltaY;
  5.       ObjRotY := ObjRotY + DeltaX;
  6.     end;


Was natürlich dann später entsprechend umgesetzt wird:

Code:
  1.     // Rotation X, Y, Z
  2.     glRotatef(ObjRotZ, 0.0, 0.0, 1.0);
  3.     glRotatef(ObjRotY, 0.0, 1.0, 0.0);
  4.     glRotatef(ObjRotX, 1.0, 0.0, 0.0);


Das haut natürlich nur korrekt hin, wenn das Koordinatensystem in "Grundstellung" ist bzw. wenn nur die aktuell zu drehende Achse gedreht wurde.

Ich möchte nun erreichen, dass um ein virtuelles Koordinatensystem rotiert wird. Unabhängig von der aktuellen Lage meines Koordinatensystems möchte ich z.B. immer beim Links- bzw. Rechtsbewegen der Maus, dass sich das Modell um eine senkrechte Achse bewegt. Rechnerisch ergibt sich dadurch natürlich eine Kombination aus allen drei Achsen. Beim Hoch- und Runterbewegen soll das Objekt immer um die waagerechte Achse gedreht werden.

Hat das schonmal irgendwer gemacht bzw. hat jemand eine Idee wie sowas zu implementieren wäre? Ich hoffe es ist verständlich was ich meine. Irgendwie habe ich keine Idee wie ich anfangen soll. Wäre cool, wenn sich die Chef-Mathematiker da mal ihren Senf dazu geben könnten :-).

Alex


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 31, 2015 12:55 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Das ist zwar wahrscheinlich nicht was du hören willst, aber das Problem ist leider mit Eulerwinkel gar nicht zu beheben.
Es nennt sich Gimbal Lock und prinzipiell können leider immer verdrehte Achsenstellungen auftreten. Das mag komisch klingen, aber es ist schlicht und ergreifend unmöglich mehrmals um globale Achsen zu drehen. Eine der Achsen verdreht immer eine andere. Das Beste was du daraus machen kannst, ist die Reihenfolge der Achsen so zu verändern, dass das Problem nicht mehr auftritt und am ehesten der Erwartungen des Nutzers entspricht,. Es gibt da ein bekanntes Video dazu.

Eine andere Möglichkeit könnte es sein, kein Eulerwinkel einzusetzen, sondern stattdessen zum Beispiel Quaternions zur Repräsentation der Richtung zu verwenden.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 31, 2015 13:35 
Offline
DGL Member

Registriert: Di Jun 10, 2014 06:59
Beiträge: 17
Programmiersprache: Delphi XE6
OpenglerF hat geschrieben:
Das ist zwar wahrscheinlich nicht was du hören willst, aber das Problem ist leider mit Eulerwinkel gar nicht zu beheben.
Es nennt sich Gimbal Lock und prinzipiell können leider immer verdrehte Achsenstellungen auftreten. Das mag komisch klingen, aber es ist schlicht und ergreifend unmöglich mehrmals um globale Achsen zu drehen. Eine der Achsen verdreht immer eine andere. Das Beste was du daraus machen kannst, ist die Reihenfolge der Achsen so zu verändern, dass das Problem nicht mehr auftritt und am ehesten der Erwartungen des Nutzers entspricht,. Es gibt da ein bekanntes Video dazu.

Eine andere Möglichkeit könnte es sein, kein Eulerwinkel einzusetzen, sondern stattdessen zum Beispiel Quaternions zur Repräsentation der Richtung zu verwenden.


Hi,
Du hast recht: Das war nicht das was ich hören wollte :-). Ich kann es nur noch nicht ganz glauben. Evtl. habe ich mich auch falsch ausgedrückt. Ich will nicht erreichen, dass sich das Koordinatensystem um eine bestimmte Achse dreht sondern ich möchte das gesamte Koordinatensystem drehen. Klingt ein bisschen verwirrend. Prinzipiell mache ich das auch schon:

Ich setze ein Objekt in meine Welt. Dieses Objekt hat sein lokales Koordinatensystem. Als Parameter für dieses Objekt gebei ich noch Verschiebung und Drehung an um das Teil zu positionieren. Anschließend rotiere ich die Welt (und nicht das eigentliche Objekt). Das Objekt bringt seine Rotation (und Verschiebung) immer als Offset zu der ursprünglichen Drehung. Nun möchte ich eigentlich ein zusätzliches Koordinatensystem generieren, welches aber bei jeder Berechnung dynamisch neu erstellt wird. Jede Drehung geht also von einem Koordinatnsystem in "Grundstellung" aus. Bei der nächsten Drehung wird eben wieder ein Koordinatensystem in "Grundstellung" verwendet. Ich drehe also das Koordinatensystem um ein virtuelles Koordinatensystem. Das Resultat der Drehung soll aber dann im Zielsystem abgelegt werden. Ist irgendwie voll doof zu erklären... Ich hatte aber schon CAD-Systeme in der Hand, die das so konnten. Muss mal noch etwas forschen welche das waren. (Sketchup gehört definitv nicht dazu)

Alex


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 31, 2015 13:56 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Du kannst schon ein Objekt um eine Achse drehen. Wenn du dann allerdings nochmal um eine andere Achse drehst, verdrehst du unweigerlich auch die Drehachse um die du zuerst gedreht hast. "globale Achsen" gibt es nicht. Bzw. gibt es sie, aber sie werden selbstverständlich eben verdreht, sobald du anfängst zu drehen. Überleg dir einfach mal im Kopf, wie du zwei aufeinander folgende Rotationen mit Eulerwinkeln definieren willst, wenn beide vollständig unabhänig sein sollen. Das ist ein bisschen schwer vorzustellen, allerdings gibt es dafür tatsächlich keine Lösung.

Die CAD Systeme werden vermutlich intern nicht Eulerwinkel an 3 Achsen zur Speicherung der Rotation verwendet haben.


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 95 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.117s | 18 Queries | GZIP : On ]