Ich habe vor wenigen Tagen mit OpenGL angefangen und hatte gehofft, jetzt bereits ein (für einen Anfänger) ordentliches Programm beisammen zu haben. Ich nehme dabei die Einsteiger-Tuts von Phobeus zur Hilfe. Leider versuche ich seit gestern vergeblich, mit Translatef(-1.5,0,-6) ein Dreieck etwas von der Kamera wegzubewegen, ohne dass es dabei ganz verschwindet. Ich hab übrigens nicht sofort gemerkt, dass es an Translatef liegt, sondern hab davor mehrere Stunden rumprobiert und im Internet nach möglichen Erklärungen gesucht.
Das Dreieck wird wie im Tutorial gezeichnet:
Code:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1,0,0);
glVertex3f(-1.0,-1.0, 1.0);
glColor3f(0,1,0);
glVertex3f( 0.0, 1.0, 1.0);
glColor3f(0,0,1);
glVertex3f( 1.0,-1.0, 1.0);
glEnd;
SwapBuffers(h_DC);
Ich kann es sehen, sofern der z-Wert aller Eckpunkte (also in diesem Fall 0) in einem Bereich von 0 bis 1 von der Kamera entfernt ist. Wenn ich also mit Translatef(0,0,-1) um 1 nach hinten gehe, ist das Ding gerade noch sichtbar (folglich mit Translatef(0,0,-1.1) nicht mehr). Es füllt übrigens immer die ganze Höhe/Breite des Fensters aus.
Und bevor jemand fragt, hier noch der gesamte Initialisierungscode:
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Hmmm. Du hast da einen etwas komischen Aufbau in deinem Programm, vor allem im Create-Teil.
Code:
gluPerspective(0,ClientWidth/ClientHeight,0,10);
//Den vorletzten Wert auf > 0 setzen und denn letzten erhöhen (128)
glTranslatef(0,0,-2);
//Das hier ist komplettt fehl am Platze (normalerweise <!-- s;) --><img src=\"{SMILIES_PATH}/icon_wink.gif\" alt=\";)\" title=\"Wink\" /><!-- s;) --> )
Das Translate muss in deine Application.Idle-Prozedur, da sie bei jedem Frame ausgeführt werden muss. Probiers mal aus und sag Bescheid!
EDIT: Und gib Translatef einen größeren Z-Wert!
_________________ "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
Danke für die schnelle Antwort.
Das mit dem 'komischen' Programmaufbau liegt wahrscheinlich daran, dass ich aus dem Tutorial nicht ganz genau herauslesen konnte, wohin ich welche Anweisung schreiben muss.
Jetzt hab ich "gluPerspective(0,ClientWidth/ClientHeight,1,128)"; und glTranslatef(0,0,-6) ist direkt nach dem Zeichnen des Dreiecks, was dazu führt, dass es nur einmal kurz aufblitzt. (wenn ichs vorher mache, kommt gar nichts)
(ich hab jetzt einfach mal angenommen, dass du mit größerem z-Wert mehr negativ meinst, da positiv ja keinen Sinn machen würde)
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Zitat:
(wenn ichs vorher mache, kommt gar nichts)
Auch vor dem glBegin(GL_TRIANGLES), denn nachher ist es total sinnlos
_________________ "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
Das Problem mit diesem Template ist, dass schon soviel Zeug drin ist, dass es schon wieder zu kompliziert wird.
Außerdem hab ich eine unit namens "Geometry" nicht, ohne die das ganze nicht kompilieren will.
Ok, ich hab jetzt mal die entsprechende Stelle im Template gefunden und ein "glLoadIdentity" vor dem glTranslatef in meiner Renderroutine eingefügt. Es funktioniert allerdings immer noch nicht. Und ich hab auch keine Lust, den ganzen Code einfach zu kopieren, ohne zu verstehen, wozu er gut ist.
Edit: ja, dass es vor dem glBegin kommen muss, ist mir jetzt auch klar. Bewirkt aber nichts.
Edit2:
um das nochmal genauer auszudrücken:
Code:
Procedure DrawObjects;
Begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glTranslatef(0,0,-n);
glBegin(GL_TRIANGLES);
glColor3f(1,0,0);
glVertex3f(-1.0,-1.0,0.0);
glColor3f(0,1,0);
glVertex3f(0.0,1.0,0.0);
glColor3f(0,0,1);
glVertex3f(1.0,-1.0,0.0);
glEnd;
SwapBuffers(h_DC);
End;
ist meine Renderroutine. mit 0<=n<=1 funktioniert sie, mit n>1 nicht.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ok...dann nimm mal mein Template. Das hat nur das wichtigste. Is net wirklich schön, und die Pros wie Sascha würden bestimmt manches anders machen. Aber es geht bei mir (Delphi 5)
Mir ist übrigens aufgefallen, dass mit 'dglOpenGL' ein paar Dinge anders gemacht werden müssen als mit der Delphi-eigenen unit 'OpenGL'. Gibt es dazu vielleicht noch ein Turorial? Ansonsten werde ich versuchen, selbst herauszufinden, wie man damit umgeht. Dein Template scheint mir da ein guter Anfang zu sein.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Veraltet? Ungenau is richtiger. Die orginal OpenGL.pas von Borland hat teilweise anders benannte Befehle (entsprechen nicht der OpenGL Synthax) und außerdem ist sie auf dem stand von OpenGL 1.0 (?). Unser Header is auf dem Stand von OpenGL 1.5 und wird immer gepflegt. Außerdem entspricht er Synthaxmäßig wirklich dem OpenGL Standart.
Die Initialisierung wurde durch den DGLOpenGL-Header vereinfacht. Das sollte vorallem Anfänger recht gelegen kommen. (Außerdem bleibt der Code dann hübscher, wenn man die Initialisierung net so sieht.)
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: 0 Mitglieder und 7 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.