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

Aktuelle Zeit: So Jul 20, 2025 00:37

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Okt 12, 2005 23:39 
Offline
DGL Member

Registriert: Mi Okt 12, 2005 23:21
Beiträge: 2
Wohnort: Koblenz
Hallo Community,
erstmal großes Lob für eure vielen hilfreichen Tutorials, Erklärungen und Inspirationen! :)

Ich habe nun leider ein Problem, zu dem ich auch im Forum, im Wiki oder den Tuts keine Lösung finden konnte:
Ein 3D-Objekt wird in einer Editor-Ansicht angezeigt, bleibt immer zentriert. Nun möchte ich dieses Objekt mit der Maus drehen - eigentlich kein Problem (XY-Distanzen der Maus speichern und glRotatef(dMausX,1,0,0); glRotatef(dMausY,0,1,0); aufrufen - fertig.
Leider entsteht so eine Rotation, die ich nicht wirklich gebrauchen kann..
Aus gängigen 3D-Modelern kennt man es ja so, dass die Rotation immer um die aktuellen "Sichtachsen" stattfindet. Wenn ich jetzt aber z.B. zuerst um die y-Achse rotiere, verändert das ja die Lage der x-Achse --> Problem. Eigentlich will ich immer um die Achsen rotieren, wie sie am Anfang waren.

Zur deutlicheren Erklärung hier mal ein paar Bilder:

Ich habe also einen Würfel.
Bild

Der wird jetzt um Y gedreht:
Bild

Dadurch wurde die X-Achse verändert, und eine Rotation um diese endet so:
Bild

Wenn das Objekt jetzt rotiert wurde und ich dann nochmal munter weiterrotieren möchte, sieht das alles sehr verwirrend aus und ist nicht intuitiv.

Eigentlich möchte ich meinen Würfel
Bild

wie gehabt einmal rotieren, und dann für die nächste Rotation wieder meine "alten" Achsen zur Verfügung haben (lokale Achsen sind transparent):
Bild

Die Rotation um diese "neue" X-Achse liefert ein anderes Ergebnis:
Bild

-> Wie kann ich so etwas hinbekommen?
In einem anderen Forum und im #delphi.de IRC-Channel sagte man mir, ich müsste eine Rotations-Matrix für das Objekt haben, eine für die Maus-X-Bewegung (=Rotation) und eine für die Y-Bewegung. Die letzten beiden auf die Objekt-Matrix multipliziert ergäben das gewünschte Ergebnis.
Aber passiert es nicht im Moment schon genau so? Ich rufe zuerst glLoadIdentity auf, dann glTranslatef (um ein Stück von der Kamera weg zu kommen), dann die XY-Rotationen (welche doch auf die aktuelle Matrix multipliziert werden, oder?) und zeichne anschließend die Quads.

Hänge irgendwie fest und wenn mir jemand weiterhelfen kann, wäre ich sehr froh :c)

Viele Grüße,
Michi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 01:00 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmm....das is eine für OpenGL eher untypische rotation... Denn wie du schon festgestellt hast, werden die achsen frisch ausgerichtet.

Du wirst wohl die passende Rotationsmatrix per Hand berechnen müssen und dann mit glMultMatrix mit der aktuellen mutliplizieren.

Ich bin in Sachen Mathe nicht mehr so fitt, kann dir also da jetzt nicht weiter helfen... Eventuell weiß es jemand von den anderen...sind ja einige Mathe 1er hier...

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 01:26 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Flash hat geschrieben:
Ich bin in Sachen Mathe nicht mehr so fitt, kann dir also da jetzt nicht weiter helfen...

Leider nicht, man behandelt auch nur die Rotation um einen bel. Vektor.
Hier ist das Problem, dass wir 2 Vektoren und 2 Winkel haben.
Und mir fällt absolut keine Lösung ein.

Habe mir gerade mal was überlegt:
Wenn du nur den Würfel mit Kantenlänge 2 hast und nur Rotation um x und y gilt das:
Code:
  1.  
  2. /1    0     0  \   /1\ /        1    \
  3. |0 cos a -sin a| * |1|=|cos a - sin a|
  4. \0 sin a  cos a/   \1/ \sin a + cos a/
  5.  \___________/
  6.  Rotations um X-Achse
  7.  
  8. / cos b 0 sin a\  /        1    \ / cos b + sin b (sin a + cos a)  \
  9. |   0   1   0  | *|cos a - sin a|=|          cos a - sin a         |
  10. \-sin b 0 cos b/  \sin a + cos a/ \- sin b + cos b (sin a + cos a) /
  11.  \___________/
  12.  Rotations um Y-Achse mit rotierten Punkt
  13.  

Das musst du dann nur noch für alle Eckpunkte berechnen und sollte dann funktionieren.
Eine Rotation um die Z-Achse sollte man genauso einbauen können.

Noch 2 Dinge:
1. Ich will einen vernünftigen ASCI-Codeeditor
2. #delphigl existiert auch

Edit:
Einfacher funktioniert es übrigens wenn du Y-Rotationsmatrix*Y-Rotationsmatrix*Punkt rechnest.
Alternativ könntest du auch einfach das Produkt der Rotationsmatrizen mit der Objektmatrix multiplizieren, so wie es im Channel gesagt wurde.

Und ja, vorm Edit stand dort, dass dies falsch ist. Kann es immer noch sein um 3 Uhr morgens....
Ich weiss gerade auch nicht wo der Unterschied zu der OpenGL-Methode ist, also ist es vermutlich falsch.
Naja, wenigstens blamiere ich mich richtig.

Oder doch nicht. Habe gerade testweise um a=90° und b=180° getestet. Es funktioniert so wie du es wolltest.
Der vordere links oben wird zum hinteren rechts unten.
Und sollte jetzt auch kein Zufall sein.

Edit2: :D
Natürlich ist es ein Unterschied ob du erst um X oder um Y rotierst.
Das hat die Matrizenmultiplikation so ansich.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 16:10 
Offline
DGL Member

Registriert: Mi Okt 12, 2005 23:21
Beiträge: 2
Wohnort: Koblenz
hi, vielen dank für eure antworten.
dass ich vielleicht alle punkte einzeln berechnen müsste, hatte ich auch schon überlegt - und wohl nicht nur für eine rotation, sondern für beide. denn nach einer mausbewegung will man dann ja weiterrotieren....
könnte aber halt etwas langsam werden, oder nicht? will ja nicht nur munter würfel schubsen, sondern objekte mit 70.000 punkten und mehr, alle noch mit polygonen verbunden.
ich kann mir eigentlich garnicht vorstellen, dass das überhaupt nicht möglich ist? ich meine, jeder 3d-editor kann das doch.. auch, wenn das objekt über 1 mio polygone hat.

gruß, michi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 16:26 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du kannst ja auch die Matrix mit der Objektmatrix multiplizieren.
Dann wird es von OpenGL intern berechnet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 16:33 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nun du könntest auch nur die erste rotation per Hand berechnen und die Ergebniskoordinaten dann von OpenGL für die 2. Rotation drehen lassen. Da sparst du dir schonmal eine Berechnung.

Obwohl...dann kannst du auch gleich beide machen: Also alle Vertexdaten in ein Array legen und dann die Matrix auf alle Vertices anwenden. Dann die nächste Matrix und wieder drüber schippern.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 14, 2005 10:02 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Vielleicht hilft Dir ja das weiter:
Code:
  1.  
  2.   // Datenstruktur zum Speichern von Matrizen
  3.   TGLMatrix=Record
  4.     Case Boolean of
  5.       True: (A: Array[0..15] of GLDouble);
  6.       False: (M: Array[0..3,0..3] of GLDouble);
  7.     //ACHTUNG OpenGL speichert die Elemente Spaltenführend
  8.     //erster Index ist Spalte, zweiter Zeile
  9.     // z.B.: erste Spalte, dritte Zeile ist [0,2] nicht [2,0]
  10.   End;
  11.  
  12.   // Datenstruktur zum Speichern von Vektoren
  13.   TGLVector=Record
  14.    Case Integer Of
  15.     0: (X: GLDouble;
  16.         Y: GLDouble;
  17.         Z: GLDouble);
  18.     1: (Width: GLDouble;
  19.         Depth: GLDouble;
  20.         Height: GLDouble);
  21.     2: (RotX: GLDouble;
  22.         RotY: GLDouble;
  23.         RotZ: GLDouble);
  24.   End;
  25.  
  26. .....
  27.  
  28. Procedure TGLBaseGraphic.SetRotation(_oRotation: TGLVector);
  29. Var
  30.   cx,cy,cz,sx,sy,sz: double;
  31. Begin
  32.   oRotation:=_oRotation;
  33.   //Matrix anpassen
  34.   cx:=Cos(DegToRad(oRotation.RotX));
  35.   cy:=Cos(DegToRad(oRotation.RotY));
  36.   cz:=Cos(DegToRad(oRotation.RotZ));
  37.   sx:=Sin(DegToRad(oRotation.RotX));
  38.   sy:=Sin(DegToRad(oRotation.RotY));
  39.   sz:=Sin(DegToRad(oRotation.RotZ));
  40.   oMatrix.M[0,0]:=cy*cz;
  41.   oMatrix.M[0,1]:=sx*sy*cz+cx*sz;
  42.   oMatrix.M[0,2]:=sx*sz-cx*sy*cz;
  43.   oMatrix.M[1,0]:=-cy*sz;
  44.   oMatrix.M[1,1]:=cx*cz-sx*sy*sz;
  45.   oMatrix.M[1,2]:=cx*sy*sz+sx*cz;
  46.   oMatrix.M[2,0]:=sy;
  47.   oMatrix.M[2,1]:=-sx*cy;
  48.   oMatrix.M[2,2]:=cx*cy;
  49.   ChangeWorld;
  50.  


Rot... ist die Rotation um die globalen (aktuell gültigen, durch glrotatef, gltranslatef und glscalef veränderten) Koordinatenachsen, oMatrix ist ne TGLMatrix mit 16 Elementen, wobei nur die 9 für eine Rotation varantwortlichen Elemente gesetzt werden. Die Elemente hab ich durch Matrixmultiplikation der drei einzelnen Matrizen ermittelt. Wenn Du also die Resultierende Matrix mit der aktuellen Projektionsmatrix multiplizierst, und dann Deinen Würfel zeichnest, sollte er gedreht erscheinen wie Du es willst.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


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


Wer ist online?

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