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

Aktuelle Zeit: Mi Jul 16, 2025 12:07

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem bei Tutorial 3
BeitragVerfasst: Di Sep 26, 2006 19:46 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Hi,

ich wollte in Tutorial 3 das mit der Sonne, der Erde und dem Kometen namens Mond testen, eigentlich klingt auch alles recht logisch nur leider leider mache ich scheinbar immer einen Fehler.

Wenn ich das Projekt kompiliere steht in der Mitte ein Dreieck (so solls auch) und es gibt zwei weitere Dreiecke die jedoch leider nicht um die Sonne kreisen sondern eher um sie pendeln, der "Mond" pendelt auch nur um die Erde (bzw. unter der Erde) hin und her und dreht sich dabei jedesmal einmal. (vermutlich drehen sich beide beim Pendeln um die Sonne auch)


Mein Quelltext sieht so aus:


Code:
  1.  
  2. procedure TForm1.Render;
  3. begin
  4.    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.  
  6.   glMatrixMode(GL_PROJECTION);
  7.   glLoadIdentity;
  8.   gluPerspective(45, ClientWidth/ClientHeight, NearClipping, FarClipping);
  9.  
  10.   glMatrixMode(GL_MODELVIEW);
  11.   glLoadIdentity;
  12.  
  13.   glTranslatef(0, 0, -30);
  14.  
  15.   glpushmatrix;
  16.   glBegin(GL_TRIANGLES);
  17.     glColor3f(0.5, 0, 0); glVertex3f(-1, -1, 0);
  18.     glColor3f(0.5, 0, 0); glVertex3f(1, -1, 0);
  19.     glColor3f(0.3, 0.3, 0.3); glVertex3f(0, 1, 0);
  20.   glEnd;
  21.   glpopmatrix;
  22.   glpushmatrix;
  23.  
  24.   glRotatef(x,0,0,0);
  25.   gltranslatef(10,0,0);
  26.   glBegin(GL_TRIANGLES);
  27.     glColor3f(0.5, 0, 0); glVertex3f(-1, -1, 0);
  28.     glColor3f(0.5, 0, 0); glVertex3f(1, -1, 0);
  29.     glColor3f(0.3, 0.3, 0.3); glVertex3f(0, 1, 0);
  30.   glEnd;
  31.  
  32.  
  33.  
  34.   glRotatef(x,0,0,0);
  35.   gltranslatef(-2,0,0);
  36.   glBegin(GL_TRIANGLES);
  37.     glColor3f(0.5, 0, 0); glVertex3f(-1, -1, 0);
  38.     glColor3f(0.5, 0, 0); glVertex3f(1, -1, 0);
  39.     glColor3f(0.3, 0.3, 0.3); glVertex3f(0, 1, 0);
  40.   glEnd;
  41.  
  42.   SwapBuffers(DC);
  43. end;
  44.  
  45. procedure TForm1.Timer1Timer(Sender: TObject);
  46. begin
  47. y := y +1;
  48. if a = 1 then x := x + 3 else x := x -3;
  49. Render;
  50. if y = 20 then
  51.  begin
  52.  ErrorHandler;
  53.  y := 0;
  54.  //if a = 1 then a := 2 else a := 1;
  55.  end;
  56. end;
  57.  
  58. procedure Tform1.errorHandler;
  59. begin
  60. Form1.caption := gluErrorString(glGetError);
  61. end;
  62.  
  63. end.
  64.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 26, 2006 20:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ohne deinen Quelltext jetzt eingehener untersucht zu haben, ist mir gleich aufgefallen, dass deine Rotierungen ja gar nicht funktionieren können. Du schreibst immer
Code:
  1. glRotatef(x,0,0,0);

Da fehlt aber die Angabe, um welche Achse rotiert werden soll. Das erste Argument gibt den Winkel an (in deinem Fall also x), und die nächsten drei die Achsen, um die um diesen Winkel gedreht wird. glRotatef(90,1,0,0); dreht also zum Beispiel um 90° um die x-Achse.

Vielleicht kommst du jetzt selber auf die richtige Lösung - ich wollte nur ein bisschen anstupsen ;)

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 26, 2006 21:39 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Argh, danke!

Ja das hab ich sogar in einem tut gelesen, nur irgendwie hab ich ebend gedacht das man den Punkt angibt um den rotiert wird..

Danke für den Tipp, ich geh jetzt erstmal ins Delphi und schäm mich ne Runde.

EDIT:
Nun macht es das was ich von ihm wollte, das einzige was ich noch komisch finde ist das es auf der rechtn Seite länger zu sehen ist als auf der linken. Also wenn sich ein 2 Dimensionaler Körper dreht ist er, wenn er sich auf 12 oder 6 hr befindet unsichtbar. Das leuchtet mir ein. Nur bleibt er auf der linken Seite noch ungefähr 1 Stunde länger und wird auch eine früher unsichtbar... wodran liegt das? Ist das nur ein Problem das bei 2Dimensionalen Objekten auftritt oder noch ein Fehler von mir?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 27, 2006 08:53 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Setzt du dein x irgendwann wieder zurück, oder dreht das bis zur Wertebereichsgrenze?

Wieso das unsemetrisch drehen soll weiß ich jetzt nicht. Im Zweifelsfall einfach mal im Debuger angucken, ob die Werte überall sinnvoll sind...

Nochwas:

Code:
  1. glPushMatrix;
  2. glBegin(GL_TRIANGLES);
  3.   glColor3f(0.5, 0, 0); glVertex3f(-1, -1, 0);
  4.   glColor3f(0.5, 0, 0); glVertex3f(1, -1, 0);
  5.   glColor3f(0.3, 0.3, 0.3); glVertex3f(0, 1, 0);
  6. glEnd;
  7. glpopmatrix;

Push und Pop sind hier überflüssig, da keine Änderungen an der Matrix gemacht werden. (Nur Translate, Rotate und Scale ändern die Matrix. (Jedenfalls sind nur die Befehle für dich von interesse ;) ) )

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 27, 2006 14:47 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Jup, das hab ich auch bemerkt als ich die Eigenrotation hinzugefügt habe.

x wird nicht zurückgesetzt, sollte ich vielleicht mal einbauen.
Ah Ok es scheint dadran zu liegen das es ein 2 Dimensionales Objekt ist, ich habe jetzt hinter das Dreieck noch ein weiteres mit glscalef(-1,1,-1) gesetzt und nun scheint es zu gehen :)

Danke für eure Hilfe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 27, 2006 15:55 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
:idea: Jetzt weiß ich glaub ich erst was du meinst.

Und zwar hast du vermutlich Backfaceculling aktiviert. Die Rückseiten werden dann nicht angezeigt.

Mach mal deine letzte Änderung Rückgängig, und versuch mal folgendes:

Suche in deinem Quelltext nach glEnable(GL_CULL_FACE); und kommentier das aus. Du solltest dann auch mit deinem 2D Dreieck das gewünschte Ergebnis sehen.

Infos zu Cull Face findest du unter Backfaceculling im Wiki (bei Hintergrundwissen).

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 27, 2006 15:58 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
zum wertebereich beschränken sehr nett:

Code:
  1.  
  2. if x < 0 then
  3.   x := 360 + x; //aus -90 wird +270
  4.  
  5. if x > 359 then
  6.   x := x mod 360; //aus 365 wird 6
  7.  

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 27, 2006 16:38 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Flash hat geschrieben:
:idea: Jetzt weiß ich glaub ich erst was du meinst.

Und zwar hast du vermutlich Backfaceculling aktiviert. Die Rückseiten werden dann nicht angezeigt.

Mach mal deine letzte Änderung Rückgängig, und versuch mal folgendes:

Suche in deinem Quelltext nach glEnable(GL_CULL_FACE); und kommentier das aus. Du solltest dann auch mit deinem 2D Dreieck das gewünschte Ergebnis sehen.

Infos zu Cull Face findest du unter Backfaceculling im Wiki (bei Hintergrundwissen).

Hey, stimmt, dadran lag es. Warum das im Quelltext war weiß ich allerdings auch icht, denke es lag dadran das ich alles aus dem Quickstart_tutorial übernommen habe.

Danke.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 27, 2006 21:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Man sollte diesen Befehl vielleicht aus dem Tutorial entfernen oder augenfälliger auf seine Wirkung hinweisen. Es soll ja eine schnelle Einführung sein, und die meißten Anfänger werden sich deswegen die verlinkten Seiten dazu nicht ansehen und davon ausgehen, dass dieser Befehl keine so großen Auswirkungen hat. Aber ich glaube, es kann da schnell Frust entstehen, wenn man die Ursache nicht so "schnell" findet wie in diesem Thread.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 28, 2006 08:33 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich werd ne Anmerkung im Text machen.

Öhm Luke:
Code:
  1.  
  2. if x > 359 then
  3.   x := x mod 360;


Wieso nicht einfach
Code:
  1.  
  2. if x > 360 then
  3.   x := x - 360;

?

Vorallem da deine Version bei Float Werten nicht ganz korrekt ist (359.1). ;)

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


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.017s | 16 Queries | GZIP : On ]