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

Aktuelle Zeit: Fr Jul 18, 2025 14:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Jul 28, 2010 20:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi!

In einem gewissen Bereich (wirkt als wäre es ein Dreieck mit einem Punkt im Koordinatenursprung und den anderen beiden unten links und unten rechts am Fensterrand) verschiebt sich die Textur auf eines Planeten meines kleinen Sonnensystems - der Screenshot zeigt was ich meine. Mehr als etwas Code geben kann ich wohl Euch leider wohl nicht, ich habe absolut keine Ahnung woran das liegen könnte.
Die folgenden Zeilen sind ein Ausschnitt der Render-Prozedur. Das gluLookAt steht in der Render-Prozedur, da ich später darüber auch noch die Mouselook-Funktion implementieren will, ansonsten stünde es natürlich in der Initialisierungsprozedur.
Code:
glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  gluLookAt(0.0, 0.0, fZoom, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  glRotatef(110.0, 1.0, 0.0, 0.0);

glPushMatrix;
  glRotatef(-RotJupiter, 0.0, 0.0, 1.0);
  DrawSphere(-RotJupiter, 1.5/2, @Pos, 7);
glPopMatrix;

...

Und hier noch DrawSphere:
Code:
procedure TSolar.DrawSphere(AngleX, Radius : Real; Position : pVec3f; TexID : Byte);
var Sphere : pGLUQuadricObj;
begin
  // Verschieben, Rotieren
  glPushMatrix;
  glTranslatef(Position[0], Position[1], Position[2]);
  glRotatef(AngleX, 0.0, 0.0, 1.0);
  // Textur setzen
  Sphere := gluNewQuadric;
  gluQuadricOrientation(Sphere, GLU_OUTSIDE);
  gluQuadricNormals(Sphere, GLU_SMOOTH);
  gluQuadricTexture(Sphere, True);
  if TexID > 0 then
  begin
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, TexID);
  end;
  // Kugel erstellen
  gluSphere(Sphere, Radius, 20, 20);
  gluDeleteQuadric(Sphere);
  if glIsEnabled(GL_TEXTURE_2D) then
    glDisable(GL_TEXTURE_2D);
  glPopMatrix;
end;

Ich weiß nur so viel, dass es vorher als ich noch mit glTranslate und glRotate rumgefummelt habe, diesen Fehler nicht gab. Aber es ist mit gluLookAt wirklich kürzer und einfacher finde ich.
Ich habe den Screenshot aufgrund der Dateigröße extra klein gemacht, daher hier ein paar Worte: Links sieht man wie sich der Jupiter in dem oben kurz geschilderten Dreieck befindet. Rechts davon ist er außerhalb des Dreiecks. Die Texturen sind unterschiedlich und das ist das Problem.

Gruß,
Nils


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

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 28, 2010 23:18 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Probier mal was aus... Zeichne mal die Koordinatenachsen ins Zentrum des Planeten so dass die aus dem Planten rausragen und schau dir mal an wie das aussieht.
Eventuell macht der Planet mal einen Sprung.

Das könnte was so eine Rotationsanomalie sein. Das Passiert gern mal, wenn eine Achse genau 0 ist. Kannst gerade nicht genauer erklären.

Ich denke nicht, dass es was mit der Textur zu tun hat. Falls die Achsen sich nicht bewegen, dann hast du vielleicht bei einem PopMatrix bzw einem gluLookAt Aufruf die Texturmatrix aktiv und nicht die Modelview Matrix.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 29, 2010 20:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Code:
glBegin(GL_LINES);
  glVertex3f(0.0, 0.0, 0.0);
  glVertex3f(0.0, 1.0, 0.0);
glEnd;

Dies habe ich in die oben gezeigte DrawSphere, hinter das glRotate, gesetzt. Angenommen das stimmt, lässt sich beobachten, dass sich die Textur ändert, sobald die Y-Achse des Planten Richtung Sonne zeigt - quasi von ihr angeleuchtet wird (sie ist dann auch heller, sieht man deutlich) <-- die eine Achsenseite, denn an einem Punkt um die Sonne zeigt die Y-Achse wieder zur Sonne hin, doch mit der anderen Seite, also die Achse um 180° gedreht - um 180° gedreht stimmt die Textur dann wieder. Liegt die Y-Achse nicht im Lichtkegel der Sonne, ist die Textur wie sie sein soll. Das sieht für mich nach einem klaren System aus - natürlich nur wenn man annimmt dass die Achsen so wie ich sie zeichne korrekt sind, aber sie sehen korrekt aus und auch von der Logik her müsste das passen, aber ich bin müde und habe aufgrund von Zeitmangel einige Zeit nichts mehr mit OpenGL gemacht und arbeite mich daher zur Zeit erst wieder ein. Einen Sprung macht der Planet scheinbar nicht, da konnte ich jedenfalls nichts sehen von den Achsen her. Könnte da die Lichtquelle eine Rolle spielen ? Was genau meinst Du mit Rotationsanomalie ?

Nachtrag:
Habe eben durch Zufall was entdeckt. Ich habe nämlich in meinem Skinsystem, welches für OpenGL gemacht ist, einfach mal stupide eines meiner Labels (zeichnen einfach nur Text auf eine 2D-Fläche) zeichnen lassen. Und schwupp ist der Fehler weg. Die Sache ist bloß etwas nervig, denn kaum löst man ein Problem kommt ein anderes: Es ist insgesamt alles dunkler geworden und die Saturnringe (eine Scheibe mit einer extrem dünnen Höhe) sind komplett lichtlos. Womit könnte das nun wieder zusammenhängen und warum beseitigt ein total sinnloser Aufruf der folgenden Prozedur den Hauptfehler ?
Code:
// Text zeichnen
procedure TSkinElement.DrawText(s : String; Left, Top : Integer);
var Textur : GluInt;  // Textur zum zwischenrendern
    W, H   : Integer; // Breite und Höhe des Textes
begin
  TTF_SizeText(Form.Schrift, PChar(s), W, H); // Textbreite- und Höhe bestimmen
  LoadTexture(TTF_RenderText_Blended(Form.Schrift, PChar(s), Schema.Schrift), Textur); // Text rendern und in Textur laden
  glBindTexture(GL_TEXTURE_2D, Textur); // Textur binden
  // Blenden
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable(GL_BLEND);
  DrawTexture(Left, Top, W, H, 0); // Textur zeichnen
  glDisable(GL_BLEND);
  glDeleteTextures(1, @Textur);
end;

_________________
Meine Musik: spiker-music.net


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.007s | 14 Queries | GZIP : On ]