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

Aktuelle Zeit: Do Jul 10, 2025 10:47

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Totale Anfängerfragen ^^
BeitragVerfasst: Sa Nov 22, 2008 20:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
Okay ich bin grade am erarbeiten der Tutorilas und ich blick nicht mehr durch...

Ich habe das quick start Tutorial hinbekommen ... und kann jetzt so tolle dreiecke und vierecke auf jeglich farbigen Hintergrund zeichen .. ich als Anfänger bin ja jetzt schon total begeistert....
Aber,: ich bin grade beim 3. also ich will es einfach nur hinbekommen das sich eine Form um die andere dreht ^^
Also ich habe bisher das gemacht:

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



Nun was Soll ich machen?
Ich habe mir auch schon das Beispiel aus dem SDL packet angeschaut aber jetzt verstehe ich gar nix mehr...

Vielen Dank ,
Lucas

Edit by i0n0s:
Pascal-Tags


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 22, 2008 22:44 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das mit dem Drehen ist für jemand Neues immer recht schwer.

Jedes Objekt solltest du für sich behandeln. Also wenn du ein Dreieck hast welches in der Bildmitte sich um sich selbst drehen soll, dann programmier das. Wenn du jetzt ein anderes Objekt haben möchtest, was sich um das Dreieck dreht, dann mach folgendes:

Vor dem Dreieck-Dreh-Code machst du glPushMatrix(). Nach dem du das Dreieck gezeichnet hast machst du glPopMatrix. Jetzt schreibst du den zweiten Drehcode, so als wäre das Dreieck nicht da. Schon sollte es gehn.

Ansonsten kann ich dir zur Funktionsweise der Matrizen noch das Tutorial_Matrix2 ans Herz legen. Hat viele Bilder. ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 23, 2008 14:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
okay ich hab grade noch mal was gelesen... ich muss das mit Timebased Movement machen oder ?
also der Rotate code musss mit einer Variablen zusammenhängen die sich stätig ändert?

okay ich hab echt noch gar keine Ahnung aber es wäre klasse wenn ihr mir trozdem Antworten könnten ;)

Vilen Dank

Lucas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 23, 2008 15:16 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Timebased Movement ist dazu da, unterschiedliche Hardware auszugleichen. Wenn du einen Rechner hast der lange braucht um ein Bild zu erzeugen, dann musst du pro zeiteinheit um einen größeren Winkel rotieren als wenn du einen Rechner hast der sehr schnell ist.

Für deine Zwecke gehts erstmal ohne. Mach das mal mit dem glPush/PopMatrix.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 24, 2008 11:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
entschuldiege aber ich verstehe es immer noch nicht :(

Code:
  1.  
  2. glTranslatef(0,0,-10);
  3.  glRotatef(45,0,0,0);
  4.   glColor3ub(255,255,0);
  5.   glBegin(GL_TRIANGLES);
  6.       glVertex3f(-1,-1, 0);
  7.       glVertex3f( 1, -1, 0);
  8.       glVertex3f( 0,1, 0);
  9.   glEnd();
  10.  


wenn ich die werte bei Rotatef ändere, ändert sich zwar die ausrichtung des Dreiecks aber bewegen tut sich da gar nix...

Bitte helft mir :roll:

lg Lucas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 24, 2008 13:28 
Offline
DGL Member

Registriert: So Nov 23, 2008 13:56
Beiträge: 16
Hi uci,
es ist kein Wunder, dass bei glRotatef() keine dynamische Bewegung entsteht. Normalerweise gibt man ja folgendes an:

glRotatef(ZuDrehenderWinkel, umAchseX, umAchseY, umAchseZ);

Du gibst aber nur einen festen Wert beim zu drehenden Winkel an und keinen Wert der angibt um welche Achse sich dein Objekt drehen soll. Um zu bestimmen um welche Achse sich das Objekt drehen soll gibt man eine 1 an. Eine 0 steht dann für das Gegenteil.Möchtest du ein Objekt drehen muss sich der Wert in ZuDrehenderWinkel jedes mal erhöhen. Du brauchst also eine Variable die seinen eigenen aktuellen Wert + Geschwindigkeit rechnet.
Code:
  1. glTranslatef(0,0,-10);
  2. Rotation = Rotation + 0.01;         // hier die fehlende Variable
  3.  glRotatef(Ratation,0,1,0);           // Variable einsetzen und Rotationsachse angeben
  4.   glColor3ub(255,255,0);
  5.   glBegin(GL_TRIANGLES);
  6.       glVertex3f(-1,-1, 0);
  7.       glVertex3f( 1, -1, 0);
  8.       glVertex3f( 0,1, 0);
  9.   glEnd();

Du darfst natürlich nicht vergessen Rotatation zu initialisieren.
Das mit den Timebased Movement lässt sich einfach(hoffentlich ^^) erklären.

In einen Spiel soll ein Objekt einmal in einer Sekunde um sich selbst rotieren. Wenn du wie oben, einfach bei einer Variablen "Rotation = Rotation + 0.01" schreibst, bewegt sich vielleicht auf deinen PC das Objekt in einer Sekunde einmal um sich selber. Wenn aber jemand anderes einen doppelt so schnelleren PC hat, dreht sich bei ihm das Objekt 2 mal in einer Sekunde. Das Spiel würde also doppelt so schnell laufen, weil er ja auf seinen PC auch doppelt so schnell "Rotation = Rotation + 0.01" aufruft.
Um das zu verhindern benutzt man Timebased Movement.
Man misst eine Startzeit am Anfang der Prozedur und am Ende, nachdem du den Buffer leerst, misst du noch einmal die aktuelle Zeit und ziehst davon die Startzeit ab. Damit hast du dann die Zeit die dein Programm gebraucht hat um einmal die Funktion zu durchlaufen. Diesen Wert multiplizierst du mit deiner Geschwindigkeit. Also: "Rotation = Rotation+(0.01*DrawTime)" . DrawTime ist dann sozusagen die Variable die, die Zeitdifferenz enthällt. Ein langsamer Computer braucht nun mehr Zeit für die Berechnung in deiner Renderfunktion. Damit ist dann auch der Wert in DrawTime größer. Es vergeht ja schließlich mehr Zeit zwischen der ersten und zweiten Messung. Also bewegt sich das Objekt auch in größeren Abständen pro Renderdurchlauf. Bei einen schnelleren Computer vergeht weniger Zeit. Dafür kann dieser ja auch mehr Bilder ausgeben. Wenn die Zeit in DrawTime nun kürzer ist, bewegt sich dieser auch pro Renderdurchlauf in nicht so großen Abständen.

Beispiel:
PC A durchläuft 100 mal die Renderschleife pro Sekunde. Er braucht also
pro Renderdurchlauf 0.01 Sekunden. Das ist der Wert für DrawTime.
PC B durchläuft 50 mal die Renderschleife pro Sekunde. Er braucht also
pro Renderdurchlauf 0.02 Sekunden. Das ist der Wert für DrawTime.

Wenn man nun "Rotation = Rotation + (0.5 * DrawTime)" rechnet kommen beide nach einer
Sekunde auf die gleichen Wert da ja PC A die Schleife 100 mal durchläuft in 0.01(DrawTime)
Sekunden und PC B nur 50 mal in 0.02(DrawTime) Sekunden. Ob man nun 100 mal 0.01
rechnet oder 50 mal 0.02 ist vollkommen egal, da beide am Ende den gleichen Wert haben.

So alles doppelt erzählt aber hoffe, dass es einleuchtend ist. ^^
Gibt auch sehr gute Erklärungen hier im Wiki.



mfg R2-D2


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 24, 2008 16:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
hehe danke jetzt hab ichs verstanden :)

bin grade selbst drauf gekommen das ich ja mal eine schleife benutzen sollte... ^^

bin noch nicht solange am programmieren..
aber man soll sich ja immer hohe ziele setzen :)

Vilen Dank
lg Lucas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 00:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
Okay jetzt funktioniert es und schon stellen sich mir die nächsten Fragen...

das Problem : immoment habe ich die "Rotation" über Key_Press angegeben... wie bekomme ich das hin, dass diese über eine Schleife läuft.?
Vor allem wie soll diese schleife aussehen, da sie ja nie zu ende gehen soll...???

2. Problem : Nach dem ich ein 3dimensionales Dreieck gezeichnet habe, hat das nächste Objekt was ich zeichne auf einmal die Form des vorherigen Dreieckes irgendwie in ausgeschnittener Form noch in sich ( man sieht den Hintergrund durch den Würfel.)...

Hier der Quelltextauszug:
Code:
  1.  
  2. glTranslatef(0,0,-10);
  3.  
  4. //  sonrot:= sonrot + (0.1*Drawtime);  dafür bräucht ich schleife
  5. glTranslatef(0,0,weite);
  6.   glRotatef(sonrot,0,1,0);
  7.   glRotatef(sonrot2,1,0,0);
  8. glTranslatef(0,0,weite2);
  9.   glDisable(GL_CULL_FACE);            //hat das hiermit was zu tun???
  10.   glColor3ub(255,255,0);
  11.   glBegin(GL_TRIANGLES);
  12.       glVertex3f(-1,-1, 1);
  13.       glVertex3f( 1, -1, 1);
  14.       glVertex3f( 0,1, 0);
  15.   glEnd();
  16.   glColor3ub(255,0,0);
  17.   glBegin(GL_TRIANGLES);
  18.       glVertex3f(-1,-1, -1);
  19.       glVertex3f( 1, -1, -1);
  20.       glVertex3f( 0,1, 0);
  21.   glEnd();
  22.   glColor3ub(0,0,0);
  23.   glBegin(GL_TRIANGLES);
  24.       glVertex3f(1,-1, -1);
  25.       glVertex3f( 1, -1, 1);
  26.       glVertex3f( 0,1, 0);
  27.   glEnd();
  28.   glColor3ub(0,255,0);
  29.   glBegin(GL_TRIANGLES);
  30.       glVertex3f(-1,-1, -1);
  31.       glVertex3f(-1,-1, 1);
  32.       glVertex3f( 0,1, 0);
  33.   glEnd();
  34.   glColor3ub(0,0,255);
  35.     glBegin(GL_QUADS);
  36.       glVertex3f(-1,-1, -1);
  37.       glVertex3f(-1,-1, 1);
  38.       glVertex3f( 1,-1, 1);
  39.       glVertex3f( 1,-1, -1);
  40.   glEnd();
  41.  
  42.   glRotatef(sonrot,0,1,0);
  43.   glTranslatef( -5,  3,  0);
  44.   glPushMatrix;
  45.   glColor3ub(0,0,255);
  46.   drawquads;                        //hier der Problemwürfel!
  47.   glPopMatrix;
  48.  
  49.   SwapBuffers(DC);
  50.  


und so hab ich das Immoment mit der Variablen gemacht:
Code:
  1.  
  2. if Key = 'a' then
  3. sonrot := sonrot+5;
  4.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 11:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hallo,
deine Schleife ist die Render-Procedure, diese wird ja im OnIdle aufgerufen (gehe ich jetzt mal von aus).
Code:
  1.   ...
  2.   glTranslatef(0,0,-10);
  3.  
  4.   sonrot:= sonrot + (0.1*Drawtime);
  5.   If (sonrot > 360) then sonrot := sonrot - 360;
  6.  
  7.   glTranslatef(0,0,weite);
  8.   glRotatef(sonrot,0,1,0);
  9.   ...


Was mir noch aufgefallen ist:
1. Du hast in deinem Code 2x glRotatef(sonrot,0,1,0); stehen, also einmal vor dem Zeichnen des dreidim. Dreiecks (=Pyramide?) und einmal vor dem Würfel, d.h. der Würfel dreht sich 2mal so schnell, wie dein erstes Objekt.
Aber vllt ist dies ja gewünscht...

2. Du kannst die ersten 4 Triangles in einen einzigen glBegin(GL_TRIANGLES); - glEnd(); Block zusammenfassen:
Code:
  1.  
  2. glBegin(GL_TRIANGLES);
  3.   glColor3ub(255,255,0);
  4.   glVertex3f(-1,-1, 1);
  5.   glVertex3f( 1, -1, 1);
  6.   glVertex3f( 0,1, 0);
  7.   glColor3ub(255,0,0);
  8.   glVertex3f(-1,-1, -1);
  9.   glVertex3f( 1, -1, -1);
  10.   glVertex3f( 0,1, 0);
  11.   glColor3ub(0,0,0);
  12.   glVertex3f(1,-1, -1);
  13.   glVertex3f( 1, -1, 1);
  14.   glVertex3f( 0,1, 0);
  15.   glColor3ub(0,255,0);
  16.   glVertex3f(-1,-1, -1);
  17.   glVertex3f(-1,-1, 1);
  18.   glVertex3f( 0,1, 0);
  19. glEnd();
  20.  


Das glDisable(GL_CULL_FACE); sagt aus, dass du für alles nachfolgende Hinter- und Vorderseite zeichnen willst, bzw. dass eine Seite (vermutlich die hintere, festgelegt mit glCullFace(...)) nicht weggecullt wird.
Da du aber, soweit ich sehen kann, nirgendwo glEnable(GL_CULL_FACE); aufrufst, bleibt diese Eigenschaft deaktiviert, für alle Objekte, die du danach zeichnen solltest, dies gilt insbesondere für jeden weiteren Durchlauf von deiner Render-Schleife.

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 14:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
Hallo, vielen Dank erstmal!

Zitat:
deine Schleife ist die Render-Procedure, diese wird ja im OnIdle aufgerufen (gehe ich jetzt mal von aus).


ähm ja da ist aber keinerlei schleife im onidle... (siehe erster eintrag)

(da ist auch gl_eneble Cull_Dings)

Außerdem erklärt das immer noch nicht warzum meine quader nicht vollständig sind... ich poste nachher mal ein bild...

lg Lucas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 15:28 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
OnIdle wird immer wieder aufgerufen. Das ist also quasi wie eine schleife.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 15:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
ah mal noch ne ganz kurze Frage wenn ich onIdle als procedur schreibe muss ich das bei der Unit irgendwo in die Ereignisse schreiben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 16:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
JUHUUUUU es funktioniert Dannke euch viel mals....

:) :) :)

auf zum nächsten Tutorial :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 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 | 14 Queries | GZIP : On ]