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

Aktuelle Zeit: Di Jul 08, 2025 05:33

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



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glTranslatef
BeitragVerfasst: Mi Aug 02, 2006 12:00 
Offline
DGL Member

Registriert: Di Aug 01, 2006 13:31
Beiträge: 4
Hi, absolute Einsteigerfrage, verzweifle aber total...

habe mir mit den Tutorials ein Template gebastelt und ein wenig rumgespielt aber ich verstehe nicht, dass wenn ich glTranslatef(0,0,-5) benutze nix mehr zu sehen ist. Normalerweise sollte doch die "Kamera" um 5 nach hinten verschoben werden (Oder alles andere um 5 nach vorn). Dann hab ich mir einfach mal nen Template geladen und auch dort etwas gezeichnet. Benutze ich glTranslatef und setzte den Wert der z-koordinate größer 1 oder kleiner
-1 so ist mein obekt verschwunden. Hier einfach mal der ganze code:

Code:
  1. // =============================================================================
  2. //   OpenGL1.5 - VCL Template (opengl15_vcl_template.zip)
  3. // =============================================================================
  4. //   Copyright © 2003 by DGL - http://www.delphigl.com
  5. // =============================================================================
  6. //   Contents of this file are subject to the GNU Public License (GPL) which can
  7. //   be obtained here : http://opensource.org/licenses/gpl-license.php
  8. // =============================================================================
  9. //   History :
  10. //    Version 1.0 - Initial Release                            (Sascha Willems)
  11. // =============================================================================
  12.  
  13. unit OpenGL15_MainForm;
  14.  
  15. interface
  16.  
  17. uses
  18.   Windows,
  19.   Messages,
  20.   SysUtils,
  21.   Classes,
  22.   Graphics,
  23.   Controls,
  24.   Forms,
  25.   Dialogs,
  26.  
  27.   dglOpenGL;
  28.  
  29. type
  30.   TGLForm = class(TForm)
  31.     procedure FormCreate(Sender: TObject);
  32.     procedure FormDestroy(Sender: TObject);
  33.     procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  34.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  35.   private
  36.     { Private-Deklarationen }
  37.   public
  38.     RC        : HGLRC;
  39.     DC        : HDC;
  40.     ShowFPS   : Boolean;
  41.     FontBase  : GLUInt;
  42.     StartTick : Cardinal;
  43.     Frames    : Integer;
  44.     FPS       : Single;
  45.     procedure GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  46.     procedure BuildFont(pFontName : String);
  47.     procedure PrintText(pX,pY : Integer; const pText : String);
  48.     procedure ShowText;
  49.     procedure Render;
  50.   end;
  51.  
  52. const
  53.   NearClipping = 0.1;
  54.   FarClipping  = 1000;
  55. var
  56.   GLForm: TGLForm;
  57.  
  58. implementation
  59.  
  60. {$R *.dfm}
  61.  
  62. // =============================================================================
  63. //  TForm1.GoToFullScreen
  64. // =============================================================================
  65. //  Wechselt in den mit den Parametern angegebenen Vollbildmodus
  66. // =============================================================================
  67. procedure TGLForm.GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  68. var
  69.  dmScreenSettings : DevMode;
  70. begin
  71. // Fenster vor Vollbild vorbereiten
  72. WindowState := wsMaximized;
  73. BorderStyle := bsNone;
  74. ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  75. with dmScreenSettings do
  76.  begin
  77.  dmSize              := SizeOf(dmScreenSettings);
  78.  dmPelsWidth         := pWidth;                    // Breite
  79.  dmPelsHeight        := pHeight;                   // Höhe
  80.  dmBitsPerPel        := pBPP;                      // Farbtiefe
  81.  dmDisplayFrequency  := pFrequency;                // Bildwiederholfrequenz
  82.  dmFields            := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  83.  end;
  84. if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
  85.  begin
  86.  MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
  87.  exit
  88.  end;
  89. end;
  90.  
  91. // =============================================================================
  92. //  TForm1.BuildFont
  93. // =============================================================================
  94. //  Displaylisten für Bitmapfont erstellen
  95. // =============================================================================
  96. procedure TGLForm.BuildFont(pFontName : String);
  97. var
  98.  Font : HFONT;
  99. begin
  100. // Displaylisten für 256 Zeichen erstellen
  101. FontBase := glGenLists(96);
  102. // Fontobjekt erstellen
  103. Font     := CreateFont(16, 0, 0, 0, FW_MEDIUM, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
  104.                        ANTIALIASED_QUALITY, FF_DONTCARE or DEFAULT_PITCH, PChar(pFontName));
  105. // Fontobjekt als aktuell setzen
  106. SelectObject(DC, Font);
  107. // Displaylisten erstellen
  108. wglUseFontBitmaps(DC, 0, 256, FontBase);
  109. // Fontobjekt wieder freigeben
  110. DeleteObject(Font)
  111. end;
  112.  
  113. // =============================================================================
  114. //  TForm1.PrintText
  115. // =============================================================================
  116. //  Gibt einen Text an Position x/y aus
  117. // =============================================================================
  118. procedure TGLForm.PrintText(pX,pY : Integer; const pText : String);
  119. begin
  120. if (pText = '') then
  121.  exit;
  122. glPushAttrib(GL_LIST_BIT);
  123.  glRasterPos2i(pX, pY);
  124.  glListBase(FontBase);
  125.  glCallLists(Length(pText), GL_UNSIGNED_BYTE, PChar(pText));
  126. glPopAttrib;
  127. end;
  128.  
  129. // =============================================================================
  130. //  TForm1.ShowText
  131. // =============================================================================
  132. //  FPS, Hilfstext usw. ausgeben
  133. // =============================================================================
  134. procedure TGLForm.ShowText;
  135. begin
  136. // Tiefentest und Texturierung für Textanzeige deaktivieren
  137. glDisable(GL_DEPTH_TEST);
  138. glDisable(GL_TEXTURE_2D);
  139. // In orthagonale (2D) Ansicht wechseln
  140. glMatrixMode(GL_PROJECTION);
  141. glLoadIdentity;
  142. glOrtho(0,640,480,0, -1,1);
  143. glMatrixMode(GL_MODELVIEW);
  144. glLoadIdentity;
  145. PrintText(5,15, FloatToStr(FPS)+' fps');
  146. glEnable(GL_DEPTH_TEST);
  147. glEnable(GL_TEXTURE_2D);
  148. end;
  149.  
  150. // =============================================================================
  151. //  TForm1.FormCreate
  152. // =============================================================================
  153. //  OpenGL-Initialisierungen kommen hier rein
  154. // =============================================================================
  155. procedure TGLForm.FormCreate(Sender: TObject);
  156. begin
  157. // Wenn gewollt, dann hier in den Vollbildmodus wechseln
  158. // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
  159. // Gerätekontext ungültig wird!
  160. // GoToFullscreen(1600, 1200, 32, 75);
  161.  
  162. // OpenGL-Funtionen initialisieren
  163. InitOpenGL;
  164. // Gerätekontext holen
  165. DC := GetDC(Handle);
  166. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  167. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  168. // Erstellten Renderkontext aktivieren
  169. ActivateRenderingContext(DC, RC);
  170. // Tiefenpuffer aktivieren
  171. glEnable(GL_DEPTH_TEST);
  172. // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  173. glDepthFunc(GL_LESS);
  174. // Löschfarbe für Farbpuffer setzen
  175. glClearColor(0,0,0,0);
  176. // Displayfont erstellen
  177. BuildFont('MS Sans Serif');
  178. // Idleevent für Rendervorgang zuweisen
  179. Application.OnIdle := ApplicationEventsIdle;
  180. // Zeitpunkt des Programmstarts für FPS-Messung speichern
  181. StartTick := GetTickCount;
  182. end;
  183.  
  184. // =============================================================================
  185. //  TForm1.FormDestroy
  186. // =============================================================================
  187. //  Hier sollte man wieder alles freigeben was man so im Speicher belegt hat
  188. // =============================================================================
  189. procedure TGLForm.FormDestroy(Sender: TObject);
  190. begin
  191. // Renderkontext deaktiveren
  192. DeactivateRenderingContext;
  193. // Renderkontext "befreien"
  194. wglDeleteContext(RC);
  195. // Erhaltenen Gerätekontext auch wieder freigeben
  196. ReleaseDC(Handle, DC);
  197. // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  198. ChangeDisplaySettings(devmode(nil^), 0);
  199. end;
  200.  
  201. // =============================================================================
  202. //  TForm1.ApplicationEventsIdle
  203. // =============================================================================
  204. //  Hier wird gerendert. Der Idle-Event wird bei Done=False permanent aufgerufen
  205. // =============================================================================
  206. procedure TGLForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  207. begin
  208. // In die Projektionsmatrix wechseln
  209. glMatrixMode(GL_PROJECTION);
  210. // Identitätsmatrix laden
  211. glLoadIdentity;
  212. // Viewport an Clientareal des Fensters anpassen
  213. glViewPort(0, 0, ClientWidth, ClientHeight);
  214. // Perspective, FOV und Tiefenreichweite setzen
  215. gluPerspective(60, ClientWidth/ClientHeight, 1, 128);
  216.  
  217. // In die Modelansichtsmatrix wechseln
  218. glMatrixMode(GL_MODELVIEW);
  219. // Identitätsmatrix laden
  220. glLoadIdentity;
  221. // Farb- und Tiefenpuffer löschen
  222. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  223.  
  224. Render;
  225. ShowText;
  226.  
  227.  
  228. // Hinteren Puffer nach vorne bringen
  229. SwapBuffers(DC);
  230.  
  231. // Windows denken lassen, das wir noch nicht fertig wären
  232. sleep(1);
  233. Done := False;
  234.  
  235. // Nummer des gezeichneten Frames erhöhen
  236. inc(Frames);
  237. // FPS aktualisieren
  238. if GetTickCount - StartTick >= 500 then
  239.  begin
  240.  FPS       := Frames/(GetTickCount-StartTick)*1000;
  241.  Frames    := 0;
  242.  StartTick := GetTickCount
  243.  end;
  244. end;
  245.  
  246. // =============================================================================
  247. //  TForm1.FormKeyPress
  248. // =============================================================================
  249. procedure TGLForm.FormKeyPress(Sender: TObject; var Key: Char);
  250. begin
  251. case Key of
  252.  #27 : Close;
  253. end;
  254. end;
  255.  
  256. procedure TGLForm.Render;
  257. begin
  258.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  259.  
  260.   glMatrixMode(GL_PROJECTION);
  261.   glLoadIdentity;
  262.  
  263.   glTranslated(-0.25, -0.1, 0);
  264.  
  265.   glBegin(GL_QUADS);
  266.     glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
  267.     glColor3f(0, 1, 0); glVertex3f(0.5, 0, 0);
  268.     glColor3f(0, 0, 1); glVertex3f(0.5, 0.5, 0);
  269.     glColor3f(1, 1, 0); glVertex3f(0, 0.5, 0);
  270.   glEnd;
  271.  
  272.   SwapBuffers(DC);
  273. end;
  274.  
  275. end.
  276.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 02, 2006 12:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Verwende mal statt GL_MODELVIEW statt GL_PROJECTION in glMatrixMode.

_________________
"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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] 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 | 15 Queries | GZIP : On ]