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

Aktuelle Zeit: Do Jul 17, 2025 19:19

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TestSzene erscheint nicht
BeitragVerfasst: So Nov 14, 2004 13:03 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo NG,

bin neu hier und alle können jetzt mal über meinen Fehler kräftig lachen --- :(

:D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D

So, hier der Code aus Eurer Sammlung:

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



In meiner DrawScene möchte ich nur ne Linie zeichnen - aber: nur die Schrift des FPS Counters wird rot - der Rest bleibt weiß. Eine Linie erscheint nicht ------- ???????????????ß

Kann mir jemand helfen ?

Gruss


Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 14, 2004 13:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Du musst dein Objekt noch so verschieben, dass es sichtbar wird.
Im Moment liegt es praktisch direkt auf der „Linse“ und wird von deiner Near-Clipping-Plane weg geschnitten.
glTranslatef(0, 0, -5) sollte das Problem beheben.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 14, 2004 13:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo,

nützt nix - mach ich da noch was falsch ?

Gruss


Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 14, 2004 13:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Ich habe mir den Code jetzt nicht genau angesehen (ich vermute du hast auch nichts außer der Renderprozedur geändert). Auf Anhieb konnte ich keinen weiteren Fehler finden.
Wo genau rufst du denn dein glTranslatef auf?
Code:
  1.  
  2. procedure TGLForm.DrawScene;
  3. begin
  4.   glTranslatef(0, 0, -5);
  5.   glBegin(GL_LINES);
  6.     glcolor3f(1,0,0);
  7.     glVertex3f(-1,0,0);
  8.     glVertex3f(1,0,0);
  9.   glEnd;
  10. end;
  11.  

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 14, 2004 13:41 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo Magellan,

das war der Fehler ..... jetzt klappt es.

Noch eine Frage: Du sagst, es sei in der Linse. Was meinst Du damit ?

Ich dachte, dass 0,0,0 das Zentrum sei und daher eine Linie mit -1,0,0 nach 1,0,0 in x-Richtung über den Bildschirm geht. Warum ist das nicht so ? Wieso diese Verschiebung ?


Gruss

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 14, 2004 13:51 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du hast 2 Matrizen die für sowas benutzt werden. (Die 3. = Textur ist hier unwichtig)

Die Modelviewmatrix kannst du dir wie eineMaschiene (mathematisch Korrekt einen Operator) vorstellen, mit dem du deine 3D Welt verschieben, drehen, Strecken,etc kannst.
Die 2. Matrix (die Projektionsmatrix) die es gibt ermöglicht dir die Sicht auf deine Welt zu verändern.

Wenn du einen Würfel an 0,0,-5 setzt dannbedeutet dass nicht, dass du auch an die Position gucken musst. Du kannst deinen sichtbereich auch irgendwo anders hingucken lassen.

Stell dir OpenGL und die Matrizen mal so vor:

Du hast einen Glaskasten (deine 3D Welt)und zwei zugriffsmöglichkeiten auf deren inhalt. Mit einem "Greifarm" (= Modelviewmatrix) kannst du Elemente in die Welt hineinbringen. Mit dem "Kameraarm" (=Projektionsmatrix) kannst du Ansichten aus der 3DWelt heraus holen.
Beide "Arme"kannst du unabhängig von einander Bewegen mittels glRotate/glTranslate etc. Welche Matrix du gerade steuerst legst du mit glMatrixMode fest.

Hier noch ein Wikibeitrag zum MatrixMode.
Und hier nochwas zu Matrizen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 14, 2004 13:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo Danke !!!


Das guck ich mir mal an ....


Gruss und Vielen Dank


Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 14, 2004 13:56 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Nicht umsonst entstand der Spruch
Zitat:
Ein Brett vorm Kopf haben

Die "Kamera" aus deren Sicht die ganze Szene gezeichnet wird ist nach der Initialisierung am Punkt (0,0,0).
Im Prinzip läufts so, wie im echten Leben auch. Man sieht nur etwas, wenn es VOR dem Betrachter ist. Wenn ein Objekt hinter dem Betrachter (der Kamera) liegt, kann man es logischerweise nicht sehen. Wer sich jetzt dunkel an die Tatsache erinnert, dass Geschwister, die sich von hinten anschleichen, auch nicht gesehen werden können ist auf dem richtigen Weg ;) (Das funktioniert übrigens auch, wenn man keine Geschwister hat)
In deinem Fall ist die Kamera bei (0,0,0), also im momentanen Zentrum.
Deine Linie zeichnest du von (-1,0,0) (links) nach (1,0,0) (rechts) mitten durch deine Kamera hindurch.
Die "Linse" der Kamera liegt also in der Linie. Aus verständlichen Gründen ist die Kamera darüber nicht sehr erfreut und "sieht" die Linie nicht. Wenn du einen Faden ganz nahe vor dein Auge hältst (meinetwegen auch in dein Auge ;) dann siehst du ihn auch nicht. Oder nur sehr schlecht. (Das liegt zwar daran, dass er sehr unscharf dadurch wird, aber das tut hier nix zur Sache ;)
Lösung: Platz schaffen. Du brauchst etwas Platz zwischen Kamera und deinen Objekten. Dieses Entfernung nennt sich in den OpenGL-Templates Near_Clipping_Plane oder so ähnlich. Die Scihtweite deiner Kamera wird durch die andere ClippingPlane definiert. Ist also quasi sowas wie der Horizont der Kamera. Dahinter wird nichts mehr dargestellt.

So. Hoffe, ich hab die Materie anschaulich vermittelt ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 16, 2004 17:58 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
@spacejunkey:

sehr schöne erklärung.

aber:

znear zu verändern, ist da nicht besonders elegant. denn es heißt, der kamera zu sagen, sie soll gefälligst auch die sachen sehen, die hinter ihr liegen(bei znear=-1 zum beispiel). gltranslate ist da besser.

_________________
Bild

"User Error. Replace User and hit Continue."


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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 | 14 Queries | GZIP : On ]