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

Aktuelle Zeit: Mi Jul 16, 2025 20:38

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Verzerrung bei Rotation beheben
BeitragVerfasst: Do Apr 05, 2012 14:23 
Offline
DGL Member

Registriert: Mi Apr 04, 2012 15:21
Beiträge: 12
Programmiersprache: C++
Hallo liebe Comm,

ich habe das Problem, dass sich meine Objekte bei Rotation verzerren. Und zwar hat das Fenster die Maße 1280:800 und wenn ich dann z.b. ein Quadrat zeichne, wird es sowieso verzerrt und wenn ich es rotieren lasse dann verzerrt es sich immer in die Breite und wird in Höhe hin zusammengedrückt..

Kann man da etwas einstellen oder mit einem Trick das Problem beheben??

Danke im Voraus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Do Apr 05, 2012 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Kannst du einen Screenshot anhängen? Ich bin mir nicht sicher, ob sich dein Problem auf gluPerspective zurückführen lässt (während du eigentlich glOrtho haben willst), oder eher auf ein Missverständnis der Projektion oder auf ein Problem mit dem Seitenverhältnis bei gluPerspective.

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  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Fr Apr 06, 2012 10:58 
Offline
DGL Member

Registriert: Mi Apr 04, 2012 15:21
Beiträge: 12
Programmiersprache: C++
Ich habe jetzt nochmal 2 Bilder angehängt. Beim ersten sieht man die Waffe (momentan der schwarze Balken) horizontal und beim zweiten Bild vertikal, wobei beim Vertikalen der Balken in die Länge gezogen wird und somit dicker erscheint. Zur darstellung verwende ich glOrtho.

mfg


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Fr Apr 06, 2012 18:34 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Zeig doch mal den Code der das zeichnet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: So Apr 08, 2012 15:23 
Offline
DGL Member

Registriert: Mi Apr 04, 2012 15:21
Beiträge: 12
Programmiersprache: C++
Hallo,

das hier ist der Code:

Code:
  1.     this->weaponSteigung = ((y1 - y2) / (x1 - x2));
  2.     this->weaponRotation = atan(this->weaponSteigung) * 180 / PI;
  3.  
  4.     //writeToLogfile("weaponRotation = ", this->weaponRotation);
  5.  
  6.     /*if (this->weaponRotation > 0)
  7.     {
  8.         x = ((bw / 360) * this->weaponRotation) / 2;
  9.     }
  10.     else
  11.     {
  12.         x = ((bw / 360) * this->weaponRotation) / 2;
  13.         x = x * (-1);
  14.     }*/
  15.  
  16.     glTranslatef((player.X), (player.Y), 0);
  17.     glRotatef(this->weaponRotation, 0, 0, 1);
  18.  
  19.     glBegin(GL_QUADS);
  20.     glTexCoord2f(0, 1 - (5 * tbs));
  21.     glVertex3f(((-1 * (bw / 2)) - x), ((bh / 2) - y), (player.spawnZ + player.Z));
  22.     glTexCoord2f(tbs, 1 - (5 * tbs));
  23.     glVertex3f(((bw / 2) + x), ((bh / 2) - y), (player.spawnZ + player.Z));
  24.     glTexCoord2f(tbs, 1 - (6 * tbs));
  25.     glVertex3f(((bw / 2) + x), ((-1 * (bh / 2)) + y), (player.spawnZ + player.Z));
  26.     glTexCoord2f(0, 1 - (6 * tbs));
  27.     glVertex3f(((-1 * (bw / 2)) - x), ((-1 * (bh / 2)) + y), (player.spawnZ + player.Z));
  28.     glEnd();


Kleine Erklärungen:

-weaponSteigung und weaponRotation sind dafür da, den Rotationswinkel relativ zum Cursor zu berechnen.
-glTranslatef verschiebt die Matrix zur Mitte des Spielers
-glRotatef ist selbstverständlich :P
-Und beim Zeichnen sind bw (blockwidth) und bh (blockheight) #define Angaben, damit ein Viereck ohne Rotation quadratisch gezeichnet wird, da die Objekte ja wie schon gesagt im Verhältnis zum Fenster verzerrt werden.

Es ist also eigentlich ein Problem, dass ich immer habe. Ich habe es nur mit bw und bh behoben. Bei der Rotation geht das jetzt nicht mehr.

-Bei den X und Y Koordinaten ist noch ein "-x" bzw. "+y" dabei. Das sollte ein Versuch sein der Verzerrung entgegenzuwirken. Klappte aber nicht. Diese Werte stehen konstant auf 0.


mfg

_________________
Konfuzius sagt: "其實你懶得翻譯?"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Mo Apr 09, 2012 08:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Der Fehler könnte (wie Lord Horazont schon sagte) daran liegen, wie du die Perspektive einstellst. Für 2D solltest du glOrtho(2D) benutzen, nicht gluPerspective. Zeig mal den Code der das macht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Mo Apr 09, 2012 09:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Was sind denn bw, bh und tbs?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Mo Apr 09, 2012 10:35 
Offline
DGL Member

Registriert: Mi Apr 04, 2012 15:21
Beiträge: 12
Programmiersprache: C++
Markus hat geschrieben:
Der Fehler könnte (wie Lord Horazont schon sagte) daran liegen, wie du die Perspektive einstellst. Für 2D solltest du glOrtho(2D) benutzen, nicht gluPerspective. Zeig mal den Code der das macht.


bin grad auch verwirrt um den init code, vielleicht seht ihr einen fehler...

Code:
  1. GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
  2. // Initialisierung des OpenGL-Fensters
  3. {
  4.     if (height == 0)
  5.     {
  6.         height = 1;
  7.     }
  8.  
  9.     glMatrixMode(GL_PROJECTION);
  10.     glLoadIdentity();
  11.     glViewport(0, 0, width, height);
  12.     glOrtho(0, 1280, 0, 800, 0, 128);
  13.  
  14. }

Code:
  1. int InitGL(GLvoid)
  2. {
  3.  
  4.     if (!engine.LoadGLTextures())
  5.     {
  6.         return FALSE; // Texturen konnten nicht geladen werden...
  7.     }
  8.  
  9.     glEnable(GL_TEXTURE_2D); // Texture Mapping aktivieren
  10.  
  11.     glShadeModel(GL_SMOOTH);
  12.     // Das Smooth Shading wird aktiviert, das
  13.     // sehr schöne Farbübergänge auf Körpern ermöglicht.
  14.  
  15.     glClearColor(0.0f, 0.0f, 0.8f, 0.0f);
  16.     // In diesem Falle ein schwarzer Hintergrund
  17.  
  18.     glClearDepth(1.0f);
  19.     // depht buffer zurückgesetzt
  20.  
  21.     glEnable(GL_DEPTH_TEST);
  22.     // Aktivierung des depht Tests (dazu später mehr.)
  23.  
  24.     glDepthFunc(GL_LEQUAL);
  25.     // Der Typ des Depht Tests wird festgelegt
  26.  
  27.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  28.     // Perspektive wird festgelegt
  29.     glEnable(GL_BLEND);
  30.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  31.  
  32.     BuildFont(); // Build The Font (NEW)
  33.     engine.loadWorld("Data/World/datw.dat");
  34.  
  35.     return TRUE; // Initialisierung scheint geklappt zu haben!
  36. }


Philip hat geschrieben:
Was sind denn bw, bh und tbs?


bw und bh sind höhe und breite eines blocks in der welt. sie haben bestimmte angaben, damit ein viereck quadratisch erscheint. (die welt besteht aus blöcken, ähnlich wie bei minecraft) und tbs ist eine angabe um aus einer textur nur einen ausschnitt zu nehmen.


Edit: Die Zitate in den Codes stimmen nicht alle. Das ist noch vom Guttenbergen aus einem Tutorial...

_________________
Konfuzius sagt: "其實你懶得翻譯?"


Zuletzt geändert von kralo9 am Mo Apr 09, 2012 14:51, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Mo Apr 09, 2012 10:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Philip hat geschrieben:
Was sind denn bw, bh und tbs?

Zitat:
-Und beim Zeichnen sind bw (blockwidth) und bh (blockheight) #define Angaben



Fehlt da vielleicht irgendwo ein glLoadIdentity?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Mo Apr 09, 2012 14:49 
Offline
DGL Member

Registriert: Mi Apr 04, 2012 15:21
Beiträge: 12
Programmiersprache: C++
kralo9 hat geschrieben:
Fehlt da vielleicht irgendwo ein glLoadIdentity?


wo meinst du?

_________________
Konfuzius sagt: "其實你懶得翻譯?"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Mo Apr 09, 2012 15:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
wo meinst du?

Kann ich so nicht sagen ohne Überblick über den ganzen Code.

Vielleicht fehlt auch ein glMatrixMode(GL_MODELVIEW)? Wo schaltetst du nach dem ReSizeGLScene wieder zurück in den Modelview-Mode?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Mo Apr 09, 2012 15:38 
Offline
DGL Member

Registriert: Mi Apr 04, 2012 15:21
Beiträge: 12
Programmiersprache: C++
Die code ausschnitte oben sind die kompletten resizeglszene und initgl funktionen. anscheinend fehlt da was :P könnt ihr mir sagen was?

mfg

_________________
Konfuzius sagt: "其實你懶得翻譯?"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Mo Apr 09, 2012 17:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Schaltest du beim rendern zur Modelview-Matrix? Irgendwo am Anfang deiner Zeichenfunktion sollte so etwas stehen:

Code:
  1.     glMatrixMode(GL_MODELVIEW);
  2.     glLoadIdentity();


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Mo Apr 09, 2012 19:33 
Offline
DGL Member

Registriert: Mi Apr 04, 2012 15:21
Beiträge: 12
Programmiersprache: C++
Markus hat geschrieben:
Schaltest du beim rendern zur Modelview-Matrix? Irgendwo am Anfang deiner Zeichenfunktion sollte so etwas stehen:

Code:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();


Hm also ich hab vor jedem Zeichenvorgang glLoadIdentity(); ... muss glMatrixMode immer dazu?? Wenn ja dann fehlt in meinem Programm mächtig viel... :S

Ich probier jetzt vor jedem Zeichnen glMatrixMode einzubauen.. Mal sehen, ob sich was tut.
Meld mich gleich in einem Edit wieder :)

EDIT: Also ich hab jetzt vor jede Zeichensequenz immer vor das glLoadIdentity(); das glMatrixMode(GL_MODELVIEW); gemacht. Keine Änderung... :(

EDIT 2: Und wenn ich glMatrixMode(GL_MODELVIEW); am Anfang der drawGLSzene Funktion schreibe:

Code:
  1. int DrawGLScene(GLvoid)
  2. {
  3.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  4.     // Die vorherige Szene wird vom Bildschirm gelöscht,
  5.     // damit die neuen nicht einfach über die alten
  6.     // Objekte gezeichnet werden
  7.     glMatrixMode(GL_MODELVIEW);
  8.     glLoadIdentity();


dann sehe ich nichts mehr außer der Hintergrundfarbe :(

_________________
Konfuzius sagt: "其實你懶得翻譯?"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verzerrung bei Rotation beheben
BeitragVerfasst: Di Apr 10, 2012 20:08 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Du musst nicht überall "glMatrixMode(GL_MODELVIEW);" davor schreiben. Wenn du das einmal machst, bleibt das so bis es wieder geändert wird. Da man zum größten Teil alle Transformationen in der ModelView-Matrix macht, reicht es wenn man direkt nach den Einstellungen mit glOrtho einmal "glMatrixMode(GL_MODELVIEW);" schreibt.

Das mit dem bw und bh würde ich auch definitiv nochmal überdenken. Eigentlich müsste es auch ohne das gehen und bei Rotationen scheint es ja auch wieder nicht zu funktionieren und macht vielleicht sogar mehr Probleme als es löst.

Außerdem: Das Fenster ist auch wirklich immer 1280x800 Pixel groß? Bzw. das innere des Fensters. Titelleiste und so sind für OpenGL uninteressant, weil da nicht hineingezeichnet werden kann, und müssen von der Größe abgezogen werden.
Bei deinem ReSizeGLScene stellst du den Viewport auf width x height ein, glOrtho wird aber immer mit konstanten Werten verwendet. Wenn jetzt das Verhältnis von width/height ungleich 1280/800 ist, kommt es zu Verzerrungen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 2 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]