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

Aktuelle Zeit: Mi Jul 09, 2025 05:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Dez 31, 2006 11:00 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Hio,
Ich programmier nun schon seid ein bissel mehr als einem halben Jahr mit Delphi und dann wollt ich mal was neues machen und hab gestern mit OpenGL begonnen :-)

Hab die ersten beiden Tuts durchgearbeitet und dann angefangen mit den Parameter rumzuspielen und hab erstmal eine ganze einfache Animation programmiert, die ein Viereck springen lässt. Code ist wie folgt(kann man bestimmt auch noch verbesser, ist aber nur zum testen^^):
Code:
  1.  
  2. var
  3.   Form1: TForm1;
  4.   DC,RC: HDC;
  5. implementation
  6.  
  7. {$R *.dfm}
  8.  
  9. procedure Draw(b : boolean);
  10. var
  11.   i,y : real;
  12. begin
  13.   i := 0;
  14.   y := -0.5;
  15.   repeat
  16.     //Bildbuffer leeren
  17.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  18.     //Zeichenmatrix aktivieren
  19.     glMatrixMode(GL_PROJECTION);
  20.     glLoadIdentity;
  21.     //ZeichenMatrix erstellen
  22.     gluPerspective(60, Form1.ClientWidth/Form1.ClientHeight, 0.1, 100);
  23.     //Betrachungsmatrix aktivieren
  24.     glMatrixMode(GL_MODELVIEW);
  25.     glLoadIdentity;
  26.     i := i + 1;
  27.     y := y + i;
  28.     //Zeichenpunkt setzen
  29.     glTranslateF(-0.5,i,-20);
  30.       //Quadrat zeichnen
  31.     glBegin(GL_QUADS);
  32.       //Farbe auf rot setzen
  33.       glColor3f(1,0,0);
  34.       glVertex3f(0,0,0);
  35.       glVertex3f(1,0,0);
  36.       glVertex3f(1,1,0);
  37.       glVertex3f(0,1,0);
  38.     glEnd;
  39.     SwapBuffers(DC);
  40.     if b = true then exit;
  41.   until i = 10;
  42.   repeat
  43.     //Bildbuffer leeren
  44.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  45.     //Zeichenmatrix aktivieren
  46.     glMatrixMode(GL_PROJECTION);
  47.     glLoadIdentity;
  48.     //ZeichenMatrix erstellen
  49.     gluPerspective(60, Form1.ClientWidth/Form1.ClientHeight, 0.1, 100);
  50.     //Betrachungsmatrix aktivieren
  51.     glMatrixMode(GL_MODELVIEW);
  52.     glLoadIdentity;
  53.     i := i - 1;
  54.     y := y + i;
  55.     //Zeichenpunkt setzen
  56.     glTranslateF(-0.5,i,-20);
  57.       //Quadrat zeichnen
  58.     glBegin(GL_QUADS);
  59.       //Farbe auf rot setzen
  60.       glColor3f(1,0,0);
  61.       glVertex3f(0,0,0);
  62.       glVertex3f(1,0,0);
  63.       glVertex3f(1,1,0);
  64.       glVertex3f(0,1,0);
  65.     glEnd;
  66.     SwapBuffers(DC);
  67.   until i = 0;  
  68. end;
  69.  
  70. procedure TForm1.FormCreate(Sender: TObject);
  71. begin
  72.   DC := GetDC(Handle);                    //OpenGL initzieren
  73.   RC := CreateRenderingContext(DC,          //Device Contest
  74.                              [opDoubleBuffered], //Optionen
  75.                              32,          //ColorBits
  76.                              24,          //ZBits
  77.                              0,           //StencilBits
  78.                              0,           //AccumBits
  79.                              0,           //AuxBuffers
  80.                              0);          //Layer
  81.   ActivateRenderingContext(DC, RC);       //Rendern einschalten
  82. end;
  83.  
  84. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  85. begin
  86.   //Alles gesezte zerstören
  87.   ReleaseDC(DC,Handle);
  88.   DestroyRenderingContext(Rc);
  89. end;
  90.  
  91. procedure TForm1.FormResize(Sender: TObject);
  92. begin
  93.   //Zum ersten Zeichnen des Objektes
  94.   Draw(true);
  95. end;
  96.  
  97. procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
  98. begin
  99.   //Bei Tastendruck Animation zeigen
  100.   Draw(false);
  101. end;
  102.  


Code dürfte soweit klar sein, nur eine Frage hab ich:
In meien Zeichenprozedur Draw: muss ich dort die Parameter
Code:
  1.  
  2.     glMatrixMode(GL_PROJECTION);
  3.     glLoadIdentity;
  4.     //ZeichenMatrix erstellen
  5.     gluPerspective(60, Form1.ClientWidth/Form1.ClientHeight, 0.1, 100);
  6.     //Betrachungsmatrix aktivieren
  7.     glMatrixMode(GL_MODELVIEW);
  8.     glLoadIdentity;
  9.  

immer so neu, vor jedem Zeichnen setzen?
in der WiKi stand man könnte das auch auf dem OnReSize Ereigniss machen, aber den Sinn versteh ich nicht so ganz :D

danke schonmal :D

p.s. Wer auch immer die Tuts gemacht hat: KLasse, echt netter Schreibstil und vorallendingen mit ein wenig Parameter probieren gut verständlich^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 31, 2006 14:31 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Sobald du dich mit glTranslate oder glRotate bzw. anderen Funktionen die diese verwenden bewegst befindest du dich an einer anderen Stelle als vorher.
In deinem Bespiel bewegst du dich ja mit glTranslateF(-0.5,i,-20); in den Raum herum. Wenn du jetzt das glLoadIdentity weglässt bist du noch immer an der alten Stelle und nicht mehr am Nullpunkt.
Daher wird glLoadIdentity aufgerufen und zwar in beiden Matrixmodi. Beim Aufruf von glLoadIdentity wird aber auch deine Perspektive getötet und muss neu gesetzt werden, dass macht dann das gluPerspective.

Wenn du es aber schaffst, dass du dich nicht bewegst könntest du es theoretisch weglassen, da man aber spätestens bei der Einbindung von Fremdunits dessen nicht mehr sicher sein kann, sollte man das im Rendercode behalten.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 03, 2007 14:45 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Eigentlich ist das so nicht korrekt.
Du kannst einmal am anfang deine Perspektive setzen. Und dann bei jedem neuen durchlauf nur noch glClear und danach glLoadIdentity aufrufen.
Die Perspektivmatrix wird nur geändert wenn du dich im Perspektivmatrixmodus ;) bist, und dann mit glTranslate/rotate/scale rumhantierst.

_________________
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  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 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.011s | 15 Queries | GZIP : On ]