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

Aktuelle Zeit: Mi Jul 16, 2025 01:29

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Position eines Objektes im Raum
BeitragVerfasst: Fr Apr 22, 2011 19:29 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Ich hatte diese Frage schon mal ähnlich im Einsteigerforum gestellt, muss aber Feststellen, das es sich hier um
keine Einsteigerfrage handelt. :(

Ich versuch mich mal so genau wie möglich auszudrücken.

So wie ich es bisher in den Tutorials gesehen habe gehe ich beim Rendern so vor:

In meiner OnIdle-Schleife rufe ich folgendes auf:
Code:
  1.  
  2.   CheckMouse;
  3.   CheckKeys;
  4.   RenderSzene;
  5.  


In meiner Funktion RenderSzene, die immer wiederholt wird, passiert folgendes:
Code:
  1.  
  2.   // Puffer löschen
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.   glLoadIdentity;
  5.  
  6.   // Maus- und Tastaturbewegung umsetzen
  7.   glRotatef(RotX,1,0,0);
  8.   glRotatef(RotY,0,1,0);
  9.   glTranslatef(Px, Py, Pz);
  10.  
  11.   // Objekte rendern
  12.   RenderObjekte;
  13.  
  14.  // Auf den Bildschirm zaubern
  15.   glFinish;
  16.   SwapBuffers(DC);
  17.  


In der Funktion RenderObjekte werden mehrere Objekte gezeichnet. Für meinen "Planeten" passiert das so:
Code:
  1.  
  2.   glPushMatrix;
  3. //  glLoadIdentity;
  4.  
  5.   glTranslatef(0,-2,-14);
  6.   glRotatef(90,1,0,0);
  7.   glRotatef(PlanetRot,0,0,1);
  8.   glTranslatef(2,-2,0);
  9.  
  10.  
  11.   gluQuadricDrawStyle(Planet, GLU_LINE);
  12.   glColor3f(0,1,0);
  13.   gluSphere(Planet, 0.5, 32, 32);
  14.  
  15.   // Aktuelle Position des Planeten
  16.   glGetFloatv(GL_MODELVIEW_MATRIX, @OD[0]);
  17.   // Position alle 200ms im Puffer ablegen
  18.   if DoDot then  AddDot;
  19.  
  20.   glPopMatrix;
  21.  
  22.   PlanetRot := PlanetRot + 0.5;
  23.  


Wenn ich das Programm starte habe ich den Planeten -10 Einheiten vor meiner Nase. Er rotiert in einem
schönen Kreis vor mir hin und her.
Alle 200 ms wird mit AddDot die aktuelle Position des Planeten festgehalten und in einem Array mit 50 Positionen gespeichert.

Ich nutze dabei nur OD[12], OD[13] und OD[14] der Matrix als x,y,z.

Ich laufe in einer Renderschleife durch dieses Array und zeichne Linien entlang der Punkte.
Im Grunde zieht der Planet einen Streifen hinter sich her.
Das sieht aus wie auf diesem Bild

Bild

Sobald ich die Maus aber bewege, kommen die Punkte total durcheinander und die Linien werden wie Wild hin und her gezeichnet.
So wie hier

Bild


Dabei entspricht die Mausbewegung nach links einem starken Ausschlag der Linie nach rechts und umgekehrt. Das gleiche gilt für die X- als auch die Y-Achse der Maus. Bewegungen auf der X/Y/Z Achse verwedeln die Linie ebenfalls.

Jetzt wirds seltsam:
Wenn ich die Funktion glLoadIdentity in der Funktion aktiviere, dann habe ich eine perfekte Positions-Schleife.
Kreisrund und immer an der richtigen Position. Selbst wenn ich wie Wild auf Maus und Tastatur rumwerkele...alles bleibt so wie es sein soll.
Bis auf den Planeten. Der klebt jetzt plötzlich an meinem Fadenkreuz, während die Linien an der genau richtigen Position weiterhin ihre runden ziehen. Sichtbar in diesem Bild

Bild


Wie kann ich es hinkriegen, das beides (Planet und sein Schweif) an der richtigen Position bleibt?
Bin schon seit 3 Tagen an diesem Problem dran und seh wahrscheinlich den Wald vor lauter Gräsern nicht mehr. :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Position eines Objektes im Raum
BeitragVerfasst: Fr Apr 22, 2011 19:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, ich würde davon abraten, deine Objekte auf diese Weise zu positionieren. Wenn du die Position um eine “externe” Achse drehen willst, solltest du das durch entsprechende Formeln behandeln und weniger durch glRotate. Dazu bieten sich die Trigonometrischen Funktionen sinus und cosinus an. Als denkanstoß, in der xy-Ebene kannst du die Position eines Objektes, welches um die Z-Achse mit Radius r rotiert mit folgenden Gleichungen darstellen:
Code:
  1. x = r*cos(α);
  2. y = r*sin(α);
(wobei α der aktuelle Winkel der Drehung ist, siehe dazu auch: Einheitskreis)

Generell wirst du später so komplexe Bewegungen haben, dass du sie nicht mehr jeden Frame durch glTranslate/glRotate abbliden kannst/wollen wirst (*sith-kräfte einsetz*). Es spricht jedoch (außer OpenGL 3-Kompatibilität) nichts dagegen, deine endgültige Position durch glTranslate und Rotation um die Objekteigenen Achsen (also *nach* glTranslate) mit glRotate zu erledigen.

In deinem Konkreten Fall würdest du also obige Gleichungen benutzen, um die Position deines Planeten zu berechnen. Sogar die Linie kannst du on-the-fly erzeugen, ohne ein Array zu brauchen. α berechnest du dann dynamisch, indem du pro Zeiteinheit einen konstanten Wert addierst, z.B. so:
Code:
  1. α = α + 2*π*ω*t
, wobei t die vergangene Zeit in Sekunden (seit dem letzten Frame) und ω die Winkelgeschwindigkeit in 1/s ist. Die Einheit für die Winkelgeschwindigkeit (in der Formel nachgebildet durch die multiplikation mit 2π) hat den Vorteil, dass eine Winkelgeschwindigkeit von 1.0 exakt einer Umdrehung pro Sekunde entspricht.
Alternativ kannst du α auch absolut berechnen, wenn es sich um eine gleichförmige Bewegung handelt (also wenn sich ω über die Zeit nicht ändert):
Code:
  1. α = 2*π*ω*T
, wobei T die verstrichene Zeit in Sekunden seit Start der Rotation ist.

Weitere Fragen? Einfach Nachfragen!

greetings

PS: Wenn du OnIdle benutzt, ist es sinnvoller, auch OnMouseMove/OnKeyPress zu verwenden anstatt im OnIdle-Event auf Tastendrücke/Mausbewegung zu prüfen.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Position eines Objektes im Raum
BeitragVerfasst: So Apr 24, 2011 00:07 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Zitat:
x = r*cos(α);
y = r*sin(α);


Jo. Das nutze ich bereits für meine Maus/Tastaturbewegungen.

Code:
  1.  
  2.   //VORWÄRTS
  3.   Move.X := Move.X + sin(POS.ry * piover180) * 0.05;
  4.   Move.Z := Move.Z + cos(POS.ry * piover180) * 0.05;
  5.  


und für Hoch und Runter dann

Code:
  1.  
  2.   Move.y := Move.y + 0.05;
  3. bzw.
  4.   Move.y := Move.y - 0.05;
  5.  


Das mit dem PushMatrix und PopMatrix hab ich so verstanden:

Wenn ich PushMatrix auslöse, dann wird eine Kopie des aktuellen Zustandes der aktuellen Matrix erzeugt.
Ändere ich jetzt die Matrix, d.h. wohl meist die Position, dann bezieht sich das nur auf die Objekte
die ich zeichne, bis ich wieder PopMatrix aufrufe.

Ob ich die Position jetzt per Hand berechne oder über glRotate ausführen lasse bleibt sich doch für dieses
einfache Beispiel gleich. Wenn ich versuchen würde diese Position festzuhalten hätte ich in beiden Fällen das
gleiche Problem: Wenn ich die Position in meiner Renderschleife aufrufen möchte, dann hat sich die Position
meiner "Kamera" geändert. Dies wird bei mir nicht berücksichtigt. Zumindest die X- und Y- Rotation nicht.

Ich habe bisher noch nicht rausgefunden, was die Matrix eigentlich genau beinhaltet.
Der letzte Vektor enthält offensichtlich die Positionsdaten.
Die Werte der drei ersten Vektoren bewegen sich aber alle nur im Bereich von -1 bis +1. Weiss man um welche
Werte es sich hier handelt?

Ich denke ich muss die X- und Y-Rotation meiner Kamera beim Rendern rückgängig machen, oder die beim
"aufnehmen" der Positionsdaten erhaltene Sicht kurz wiederherstellen um den Punkt zu zeichnen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Position eines Objektes im Raum
BeitragVerfasst: So Apr 24, 2011 08:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Die Werte der drei ersten Vektoren bewegen sich aber alle nur im Bereich von -1 bis +1. Weiss man um welche
Werte es sich hier handelt?
Die drei ersten Vektoren in der Matrix sind deine X, Y und Z Achse (also die Richtung). Solange du dich nur drehst (und nicht zB skalierst), haben die die Länge 1, deswegen sind die Werte zwischen -1 und 1.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Position eines Objektes im Raum
BeitragVerfasst: So Apr 24, 2011 09:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Die Werte der drei ersten Vektoren bewegen sich aber alle nur im Bereich von -1 bis +1. Weiss man um welche
Werte es sich hier handelt?

Es handelt sich um die neue X, Y und Z-Achse die du nach Anwendung deiner Matrix benutzt. Die Vektoren haben die Länge 1 und sind normalerweise orthogonal zueinander.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Position eines Objektes im Raum
BeitragVerfasst: So Apr 24, 2011 21:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
BionicWave hat geschrieben:
Ob ich die Position jetzt per Hand berechne oder über glRotate ausführen lasse bleibt sich doch für dieses
einfache Beispiel gleich. Wenn ich versuchen würde diese Position festzuhalten hätte ich in beiden Fällen das
gleiche Problem: Wenn ich die Position in meiner Renderschleife aufrufen möchte, dann hat sich die Position
meiner "Kamera" geändert. Dies wird bei mir nicht berücksichtigt. Zumindest die X- und Y- Rotation nicht.

Ich glaube dein Problem liegt eher darin, dass du die Position der Linienpunkte ungünstig ausliest. Ich bin mir immer noch nicht 100%ig sicher, wie genau du das machst, aber wenn du die Positionen vorberechnest und diese auch in der Linie benutzt und das ganze dann mit der *gleichen* matrix renderst, werden Linie und Planet immer passend sein, und sich auch wie erwartet verhalten, wenn du die Kamera bewegst und drehst.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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 ]