AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi (OpenGL) 2x Rotieren um selbes Koordinatensystem
Thema durchsuchen
Ansicht
Themen-Optionen

(OpenGL) 2x Rotieren um selbes Koordinatensystem

Ein Thema von dizzy · begonnen am 12. Apr 2006 · letzter Beitrag vom 14. Apr 2006
Antwort Antwort
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#1

(OpenGL) 2x Rotieren um selbes Koordinatensystem

  Alt 12. Apr 2006, 22:19
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Phobeus

Registriert seit: 14. Sep 2003
Ort: Tespe
65 Beiträge
 
Delphi 7 Professional
 
#2

Re: (OpenGL) 2x Rotieren um selbes Koordinatensystem

  Alt 13. Apr 2006, 19:39
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
Angehängte Dateien
Dateityp: pas rotate_541.pas (3,0 KB, 25x aufgerufen)
Florian Sievert
http://www.delphigl.com/
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: (OpenGL) 2x Rotieren um selbes Koordinatensystem

  Alt 13. Apr 2006, 23:44
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 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 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 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 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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Phobeus

Registriert seit: 14. Sep 2003
Ort: Tespe
65 Beiträge
 
Delphi 7 Professional
 
#4

Re: (OpenGL) 2x Rotieren um selbes Koordinatensystem

  Alt 14. Apr 2006, 10:35
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 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.
Florian Sievert
http://www.delphigl.com/
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz