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:
// rotieren X/Y
if Shift = [ssMiddle] then
begin
ObjRotX := ObjRotX + DeltaY;
ObjRotY := ObjRotY + DeltaX;
end;
Was natürlich dann später entsprechend umgesetzt wird:
Code:
// Rotation X, Y, Z
glRotatef(ObjRotZ, 0.0, 0.0, 1.0);
glRotatef(ObjRotY, 0.0, 1.0, 0.0);
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 .
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.
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)
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.
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.