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

Aktuelle Zeit: Sa Jul 12, 2025 21:09

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 31, 2005 19:29 
Offline
DGL Member

Registriert: Mo Jan 31, 2005 18:25
Beiträge: 4
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:
  1.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  2.   glBegin(GL_TRIANGLES);
  3.     glColor3f(1,0,0);
  4.     glVertex3f(-1.0,-1.0, 1.0);
  5.     glColor3f(0,1,0);
  6.     glVertex3f( 0.0, 1.0, 1.0);
  7.     glColor3f(0,0,1);
  8.     glVertex3f( 1.0,-1.0, 1.0);
  9.   glEnd;
  10.   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:
Code:
  1. function glInit: Boolean;
  2. begin
  3.   FrameRate := 0;
  4.   FillChar(pfd, SizeOf(pfd), 0);
  5.   h_DC := GetDC(Form1.Handle);
  6.   with pfd do
  7.   begin
  8.     nSize           := SizeOf(TPIXELFORMATDESCRIPTOR);
  9.     nVersion        := 1;
  10.     dwFlags         := PFD_DRAW_TO_WINDOW
  11.                        or PFD_SUPPORT_OPENGL
  12.                        or PFD_DOUBLEBUFFER;
  13.     iPixelType      := PFD_TYPE_RGBA;
  14.     cColorBits      := 32;
  15.     cRedBits        := 0;
  16.     cRedShift       := 0;
  17.     cGreenBits      := 0;
  18.     cGreenShift     := 0;
  19.     cBlueBits       := 0;
  20.     cBlueShift      := 0;
  21.     cAlphaBits      := 0;
  22.     cAlphaShift     := 0;
  23.     cAccumBits      := 0;
  24.     cAccumRedBits   := 0;
  25.     cAccumGreenBits := 0;
  26.     cAccumBlueBits  := 0;
  27.     cAccumAlphaBits := 0;
  28.     cDepthBits      := 16;
  29.     cStencilBits    := 0;
  30.     cAuxBuffers     := 0;
  31.     iLayerType      := PFD_MAIN_PLANE;
  32.     bReserved       := 0;
  33.     dwLayerMask     := 0;
  34.     dwVisibleMask   := 0;
  35.     dwDamageMask    := 0;
  36.   end;
  37.   PixelFormat := ChoosePixelFormat(h_DC, @pfd);
  38.   SetPixelFormat(h_DC, PixelFormat, @pfd)
  39.   h_RC := wglCreateContext(h_DC);
  40.   wglMakeCurrent(h_DC, h_RC)
  41.   glEnable(GL_TEXTURE_2D);         // Aktiviert Texture Mapping
  42.   glShadeModel(GL_SMOOTH);         // Aktiviert weiches Shading
  43.   glClearColor(0.0, 0.0, 0.0, 0.0);    // Bildschirm löschen (schwarz)
  44.   glClearDepth(1.0);               // Depth Buffer Setup
  45.   glEnable(GL_DEPTH_TEST);         // Aktiviert Depth Testing
  46.   glDepthFunc(GL_LEQUAL);          // Bestimmt den Typ des Depth Testing
  47.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  48. end;
  49.  
  50. procedure TForm1.FormCreate(Sender: TObject);
  51. begin
  52.   if not glInit then Application.Terminate;
  53.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  54.   glViewPort(0,0,ClientWidth,ClientHeight);
  55.   glMatrixMode(GL_PROJECTION);
  56.   glLoadIdentity;
  57.   gluPerspective(0,ClientWidth/ClientHeight,0,10);
  58.   glTranslatef(0,0,-2);
  59.   glMatrixMode(GL_MODELVIEW);
  60.  
  61.   Application.OnIdle := OnIdle;
  62. end;
  63.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 31, 2005 19:42 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2.   gluPerspective(0,ClientWidth/ClientHeight,0,10);      
  3. //Den vorletzten Wert auf > 0 setzen und denn letzten erhöhen (128)
  4.   glTranslatef(0,0,-2);                                              
  5. //Das hier ist komplettt fehl am Platze (normalerweise <!-- s;) --><img src=\"{SMILIES_PATH}/icon_wink.gif\" alt=\";)\" title=\"Wink\" /><!-- s;) --> )
  6.  


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 31, 2005 20:04 
Offline
DGL Member

Registriert: Mo Jan 31, 2005 18:25
Beiträge: 4
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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 31, 2005 20:19 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ladt dir mal ein Template hier von der Seite runter (das 1.2VCL z.B. Da musst du nur noch den Header austauschen).

Du kannst dann entweder dieses als Basis nehmen, oder an diesem mal studieren was du falsch machst. :wink:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 31, 2005 20:30 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 31, 2005 20:53 
Offline
DGL Member

Registriert: Mo Jan 31, 2005 18:25
Beiträge: 4
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:
  1. Procedure DrawObjects;
  2. Begin
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.   glLoadIdentity;
  5.   glTranslatef(0,0,-n);
  6.   glBegin(GL_TRIANGLES);
  7.     glColor3f(1,0,0);
  8.     glVertex3f(-1.0,-1.0, 0.0);
  9.     glColor3f(0,1,0);
  10.     glVertex3f( 0.0, 1.0, 0.0);
  11.     glColor3f(0,0,1);
  12.     glVertex3f( 1.0,-1.0, 0.0);
  13.   glEnd;
  14.   SwapBuffers(h_DC);
  15. End;
  16.  
ist meine Renderroutine. mit 0<=n<=1 funktioniert sie, mit n>1 nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 01, 2005 01:04 
Offline
Guitar Hero
Benutzeravatar

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)

Code:
  1. unit UMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   dglOpenGL;
  8.  
  9. const
  10.   NearClipping = 1;
  11.   FarClipping  = 1000;
  12.  
  13. type
  14.   TForm1 = class(TForm)
  15.     procedure FormCreate(Sender: TObject);
  16.     procedure IdleHandler(Sender: TObject; var Done: Boolean);
  17.     procedure FormResize(Sender: TObject);
  18.     procedure FormDestroy(Sender: TObject);
  19.   private
  20.     { Private-Deklarationen }
  21.     StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
  22.     Frames, DrawTime                  : Cardinal; //& Timebased Movement
  23.     GLError                           : Cardinal;
  24.     procedure SetupGL;
  25.     procedure Init;
  26.     procedure Render;
  27.     procedure ErrorHandler;
  28.   public
  29.     { Public-Deklarationen }
  30.     DC                                : HDC;  //Handle auf Zeichenfläche
  31.     RC                                : HGLRC;//Rendering Context
  32.   end;
  33.  
  34. var
  35.   Form1: TForm1;
  36.  
  37. implementation
  38.  
  39. {$R *.DFM}
  40.  
  41. procedure TForm1.FormCreate(Sender: TObject);
  42. begin
  43.   DC:= GetDC(Handle);
  44.   Application.OnIdle:= IdleHandler;
  45.  
  46.   if not InitOpenGL then Application.Terminate;
  47.  
  48.   RC:= CreateRenderingContext( DC,
  49.                                [opDoubleBuffered],
  50.                                32,
  51.                                24,
  52.                                0,0,0,
  53.                                0);
  54.   ActivateRenderingContext(DC, RC);
  55.  
  56.   SetupGL;
  57.   Init;
  58. end;
  59.  
  60. procedure TForm1.SetupGL;
  61. begin
  62.   glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe
  63.   glEnable(GL_DEPTH_TEST);          //Tiefenpuffer aktivieren
  64.   glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  65. end;
  66.  
  67. procedure TForm1.Init;
  68. begin
  69.   GLError:= GL_NO_ERROR;
  70. end;
  71.  
  72. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  73. begin
  74. //
  75.   StartTime:= GetTickCount;
  76.  
  77.   Render;
  78.  
  79.   DrawTime:= GetTickCount - StartTime;
  80.  
  81.   inc(TimeCount, DrawTime);
  82.   inc(FrameCount);
  83.  
  84.   if TimeCount >= 1000 then begin
  85.     Frames:= FrameCount;
  86.     TimeCount:= TimeCount - 1000;
  87.     FrameCount:= 0;
  88.  
  89.     Caption:= InttoStr(Frames) + 'FPS';
  90.     ErrorHandler;
  91.   end;
  92.  
  93.   Done:= false;
  94. end;
  95.  
  96. procedure TForm1.Render;
  97. begin
  98. //
  99.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  100.  
  101.   glMatrixMode(GL_PROJECTION);
  102.   glLoadIdentity;
  103.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  104.  
  105.   glTranslatef(0, 0, -5);
  106.  
  107.   glMatrixMode(GL_MODELVIEW);
  108.   glLoadIdentity;
  109.  
  110.   glBegin(GL_QUADS);
  111.     glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
  112.     glColor3f(0, 1, 0); glVertex3f(1, 0, 0);
  113.     glColor3f(0, 0, 1); glVertex3f(1, 1, 0);
  114.     glColor3f(1, 1, 0); glVertex3f(0, 1, 0);
  115.   glEnd;
  116.  
  117.   SwapBuffers(DC);
  118. end;
  119.  
  120. procedure TForm1.ErrorHandler;
  121. begin
  122.   GLError := glGetError;
  123.   if GLError <> GL_NO_ERROR then
  124.      Caption := gluErrorString(GLError);
  125.  
  126. end;
  127.  
  128. procedure TForm1.FormResize(Sender: TObject);
  129. var tmpBool : Boolean;
  130. begin
  131.   glViewport(0, 0, ClientWidth, ClientHeight);
  132.   glMatrixMode(GL_PROJECTION);
  133.   glLoadIdentity;
  134.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  135.   glMatrixMode(GL_MODELVIEW);
  136.   glLoadIdentity;
  137.   IdleHandler(Sender, tmpBool);
  138. end;
  139.  
  140. procedure TForm1.FormDestroy(Sender: TObject);
  141. begin
  142.   DeactivateRenderingContext;
  143.   DestroyRenderingContext(RC);
  144.   ReleaseDC(Handle, DC);
  145. end;
  146.  
  147. end.
  148.  


Copy Paste. Brauchst nur ne leere Form.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 01, 2005 11:07 
Offline
DGL Member

Registriert: Mo Jan 31, 2005 18:25
Beiträge: 4
Danke, hat mir sehr geholfen.
Mein Fehler war ganz einfach, dass ich
Code:
  1. gluPerspective(0,ClientWidth/ClientHeight,1,128);
gemacht hab, wobei ich davon ausging, dass es sich um den Winkel zur z-Achse handelt. Es ist aber der Winkel zur y-Achse. Mit
Code:
  1. gluPerspective(90.0,ClientWidth/ClientHeight,1,128);
funktionierts.

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 01, 2005 16:48 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
Die Delphi-Unit "OpenGL" ist veraltet. dglopengl unterstützt sogar schon die neuesten ARB-Extensions(meines wissens nach)!

Mit der Unit arbeitet hier niemand mehr.

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 01, 2005 16:57 
Offline
Guitar Hero
Benutzeravatar

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.) :wink:

_________________
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 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]