Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi (OpenGL) 2x Rotieren um selbes Koordinatensystem (https://www.delphipraxis.net/67309-opengl-2x-rotieren-um-selbes-koordinatensystem.html)

dizzy 12. Apr 2006 22:19


(OpenGL) 2x Rotieren um selbes Koordinatensystem
 
Hiho miteinander!

Ich wurschtel gerade wieder etwas mit OpenGL rum, und stoße mich (wie so oft) an dem Thema Rotation.
Folgende Situation: Ich möchte ein via OGl dargestelltes Objekt mit der Maus rotieren lassen. Zu diesem Zweck lasse ich die Szene 2 Mal rotieren, und zwar einmal um die Y-Achse um die Menge, die die Maus links-recht verschoben wurde, und einmal um die X-Achse entsprechend der oben-unten Verschiebung.
Das Problem dabei ist leider: Wenn ich bereits ein Mal gedreht habe, ist die Achse um die ich das 2. Mal drehen will mit verdreht, so dass die Rotation um die verdrehte Achse passiert. Sie soll aber jedoch um die Achsen wie sie ursprünglich standen passieren.

So, dass immer wenn ich oben-unten verschiebe, das Objekt um die Bildschirmachse gedreht wird. Wie im anderen Fall auch, unabhängig davon, wie das Objekt bereits gedreht ist.
Eine Möglichkeit wäre es, die erste Rotation nicht auf Matrizenebene zu machen, sondern bereits in den Vertexdaten. Jedoch wäre das ein Schlag für die Performance, den ich nicht hinnehmen kann (will ;)).

Mir fällt grad nichts mehr dazu ein. *braindeadbin* Hülfeee :)

(Verwendete Lib ist die dglOpenGL.pas)

Danks im Voraus, und gute Nacht!
Fabian

Phobeus 13. Apr 2006 19:39

Re: (OpenGL) 2x Rotieren um selbes Koordinatensystem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe wirklich echte Probleme Dir zu folgen, da das von Dir beschriebene Verhalten doch eigentlich genau das ist, was man erwarten würde. Im Anhang ein lieblos zusammengefrickeltes Sample basierend auf der SVN-Version von easySDL, dass Dir vielleicht weiter hilft. Bedenken solltest Du zwei Dinge: Es ist hilfreich, wenn das Objekt sich im Mittelpunkt befindet. Sprich: Ein Quad von -0.5/-0.5 nach 0.5/0.5 ist leichter zu rotieren als eines von 0/0 nach 1/1. Ansonsten dreht sich das Gebilde halt nicht ums Zentrum, sondern wie ein Planet um die Sonne. Auch solltest Du bedenken, dass Matrix-Operationen eine eigenart haben: A*B != B*A. Es spielt also eine große Rolle um welche Achse Du zunächst drehst. In deinem Fall bietet sich vermutlich an erst die X und dann um die Y-Achse zu drehen. Sollte ich Dich also nun nicht gänzlich Mißverstanden haben und das ganze zum gewünschten Effekt geführt haben, würde ich dir als weiterführende Lektüre die beiden letzteres Tutorials aus der mathematischen Rubrik unserer Tutorials verordnen: DGL-Tutorials

dizzy 13. Apr 2006 23:44

Re: (OpenGL) 2x Rotieren um selbes Koordinatensystem
 
Zitat:

Zitat von Phobeus
Ich habe wirklich echte Probleme Dir zu folgen, da das von Dir beschriebene Verhalten doch eigentlich genau das ist, was man erwarten würde.

Jain ^^. Stell dir vor, du drehst ein Objekt mit der Maus mit einer Linksbewegung um ca. 90° um die Y-Achse. Du lässt die Maus los, und willst nun das Objekt so neigen, dass es seine Oberseite preis gibt. Also rein intuitiv mit einer Mausbewegung nach unten. Was passiert aber nun? Das Objekt neigt sich nach links! Weil durch die vorige Drehung ja die X-Achse verdreht wurde, und von nun an auf einmal die Z-Achse die richtige Wahl wäre um das Objekt wie gewünscht zu neigen.
Das selbe gilt verkehrt, wenn die Drehoperationen vertauscht ausgeführt werden.
Zumindest die erste Drehung soll also geschehen, OHNE dass sich die Achsen mitdrehen!

Zitat:

Zitat von Phobeus
Im Anhang ein lieblos zusammengefrickeltes Sample basierend auf der SVN-Version von easySDL, dass Dir vielleicht weiter hilft.

Lieben Dank dafür - leider habe ich die verwendeten Units nicht, bzw. kenn ich (noch) keine Bezugsquelle. Aber das ist u.U. auch nicht mehr nötig (s.u.) :)

Zitat:

Zitat von Phobeus
Bedenken solltest Du zwei Dinge: Es ist hilfreich, wenn das Objekt sich im Mittelpunkt befindet. Sprich: Ein Quad von -0.5/-0.5 nach 0.5/0.5 ist leichter zu rotieren als eines von 0/0 nach 1/1. Ansonsten dreht sich das Gebilde halt nicht ums Zentrum, sondern wie ein Planet um die Sonne.

Das hatte ich bereits bedacht, so dass ich erst rotiere, und dann verschiebe. (Mathe-LK'ler 8))

Zitat:

Zitat von Phobeus
Auch solltest Du bedenken, dass Matrix-Operationen eine eigenart haben: A*B != B*A. Es spielt also eine große Rolle um welche Achse Du zunächst drehst. In deinem Fall bietet sich vermutlich an erst die X und dann um die Y-Achse zu drehen.

Nunja, daher rührt letztlich das eigentliche Problem. Aber:
Zitat:

Zitat von Phobeus
die beiden letzteres Tutorials aus der mathematischen Rubrik unserer Tutorials

bzw. das letzte dieser hat mich auf eine Idee gebracht! Da so wie dort beschrieben eine Drehung um ein beliebiges Koordinatensystem sehr einfach geht, könnte ich mir vorstellen, dass wenn ich zwischen den beiden Drehungen das lokale Koordinatensystem zurück setze, ich den von mir gewünschten Effekt erzielen kann. So dass beim lokalen KO-System des Objektes quasi die Achsen immer in Ausgangsausrichtung bleiben. Dieses Zurücksetzen war mit dem Welt-KO-System ja nicht so einfach drin, da dort ja die "Kamera" an und für sich verdreht wird.

Ich werd's einfach mal testen, und mich im Vorfeld ganz kräftig bei dir bedanken :)

Gruss,
Fabian

Phobeus 14. Apr 2006 10:35

Re: (OpenGL) 2x Rotieren um selbes Koordinatensystem
 
Hi Fabian,

Zitat:

Jain ^^. Stell dir vor, du drehst ein Objekt mit der Maus mit einer Linksbewegung um ca. 90° um die Y-Achse. Du lässt die Maus los, und willst nun das Objekt so neigen, dass es seine Oberseite preis gibt. Also rein intuitiv mit einer Mausbewegung nach unten. Was passiert aber nun? Das Objekt neigt sich nach links! Weil durch die vorige Drehung ja die X-Achse verdreht wurde, und von nun an auf einmal die Z-Achse die richtige Wahl wäre um das Objekt wie gewünscht zu neigen.
Das selbe gilt verkehrt, wenn die Drehoperationen vertauscht ausgeführt werden.
Zumindest die erste Drehung soll also geschehen, OHNE dass sich die Achsen mitdrehen!
;) *kopfkratz* Liegt vielleicht an meinem Koffeinentzug, aber genau das sollte er ja machen. Erst ein Rotate um die X-Achse, dann eines um die Y-Achse und das Ergebnis sollte genauso sein, wie Du es beschrieben hast. Ich vermute, dass der Mittelpunkt des Objektes (Pivot-Punkt) außerhalb des Weltursprunges liegt und Du deswege ein merkwürdiges Ergebnis erhälst.
//edit: Oder um ein weiteres Horror-Szenario auszuschließen: Du verwendest schon in deiner Szene glLoadIdentity? Also: Du steuerst die Rotations über zwei(3) Variablen in dem Du einfach mit den dort gespeicherten Positionen das Objekt renderst und im Falle einer Bewegung diese nur bei den Variablen veränderst? Man möge mir verzeihen, wenn ich Dir dein Wissen unterschätzen sollte, aber ich kenne Dich soweit nicht und habe schon die abenteuerlichsten Dinge erlebt ;)

Zitat:

Lieben Dank dafür - leider habe ich die verwendeten Units nicht, bzw. kenn ich (noch) keine Bezugsquelle. Aber das ist u.U. auch nicht mehr nötig (s.u.) :)
Stoss Dich nicht so sehr an der Unit. Ich bin selbst Linux-Nutzer und kann daher nur vernünftig mit SDL arbeiten. EasySDL sind einige Units, die ein schnelles Prototyping ermöglichen sollen, damit ich innerhalb von kurzer Zeit ein Beispiel zusammenkloppen kann. Schau Dir also das DrawScene an und haus in deine Render-Prozedure und lasse die Variablen rotx,roty dort verändern, wo Maus oder Tastatur-Ereignis geschieht. Entweder klappts dann oder ich stehe ich immer noch aufm Schlauch ;) (EasySDL ist Bestandteil der DGLSDK, die von mir verwendete Version stammt allerdings aus der SVN-Version und kann daher massiven Veränderungen unterliegen: DGLSVN)

Zitat:

Zitat von Phobeus
Bedenken solltest Du zwei Dinge: Es ist hilfreich, wenn das Objekt sich im Mittelpunkt befindet. Sprich: Ein Quad von -0.5/-0.5 nach 0.5/0.5 ist leichter zu rotieren als eines von 0/0 nach 1/1. Ansonsten dreht sich das Gebilde halt nicht ums Zentrum, sondern wie ein Planet um die Sonne.

Das hatte ich bereits bedacht, so dass ich erst rotiere, und dann verschiebe. (Mathe-LK'ler 8))

Zitat:

Dieses Zurücksetzen war mit dem Welt-KO-System ja nicht so einfach drin, da dort ja die "Kamera" an und für sich verdreht wird.
Hm? Das Zurücksetzen sollte aber nur dann interessant werden, wenn Du mehre Objekte in der Szene hast. Dann kannst Du ja mit glPushMatrix bzw. glPopMatrix die aktuelle World-Matrix einfrieren, ein paar Operationen (meist scale oder rotate) durchführen und wieder die ursprüngliche Matrix zurück setzen. Aber egal, ob ich aufm Schlauch stehe oder nicht... die beiden Tutorials werden Dir offentlich weiterhelfen. Insbesondere dann, wenn sich das Objekt irgendwann auch einmal frei durch die Welt bewegen soll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz