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

Aktuelle Zeit: So Jul 20, 2025 00:32

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Wiedereinstieg
BeitragVerfasst: Fr Okt 26, 2007 22:00 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Hallo DGL Community,

da es jetzt schon wieder eine ganze Weile her ist als ich das letzte mal an meinem ersten DGL-Versuch saß blicke ich leider nicht mehr in meinem Code durch da ich eh noch nie komplett in der Materie war ;)

Naja auf jeden Fall habe ich mich dazu entschlossen das Ganze wieder aufzugreifen doch leider weiß ich nicht wo ich anfangen soll nach Fehlern zu suchen. Ich weiß nicht ob sowas hier gerne gesehen wird aber ich dachte, vielleicht kann mal jemand kurz über den Code huschen und gravierende Sachen aufzeigen. Falls das zu allgemein ist bitte sagen, denn ich denke so finde ich eher wieder rein als alle Tutorials nochmal komplett durchzugehen.

Ich wäre also sehr dankbar wenn man mir kurze Tipps geben könnte woran es liegen könnte, dass das Objekt nicht gezeichnet wird.

Zur Zeit gibt es nur ein Objekt namens "venator" der Klasse TShip.

Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, dglOpenGl, StdCtrls, ComCtrls, textures, DXInput, geometry;
  9.  
  10. type
  11.   TShip = class
  12.   private
  13.   //
  14.   public
  15.     Rotate, breite, hoehe: single;
  16.     PosVect  : TVector3f;
  17.     texture: glUInt;
  18.     constructor create;
  19.     procedure move(speed: single);
  20.     procedure draw;
  21.   end;
  22.  
  23. type
  24.   TForm1 = class(TForm)
  25.     Button1: TButton;
  26.     Button2: TButton;
  27.     Button3: TButton;
  28.     Button4: TButton;
  29.     Button5: TButton;
  30.     Button6: TButton;
  31.     Button7: TButton;
  32.     TrackBar1: TTrackBar;
  33.     DXInput1: TDXInput;
  34.     procedure FormCreate(Sender: TObject);
  35.     procedure FormResize(Sender: TObject);
  36.     procedure FormDestroy(Sender: TObject);
  37.     procedure IdleHandler(Sender: TObject; var Done: Boolean);
  38.   private
  39.     StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
  40.     Frames, DrawTime                  : Cardinal; //& Timebased Movement
  41.     procedure SetupGL;
  42.     procedure Init;
  43.     procedure Render;
  44.     procedure ErrorHandler;
  45.   public
  46.     DC                                : HDC;  //Handle auf Zeichenfläche
  47.     RC                                : HGLRC;//Rendering Context
  48.   end;
  49.  
  50. var
  51.   Form1: TForm1;
  52.   venator: TShip;
  53.  
  54. const
  55.   NearClipping = 1;
  56.   FarClipping  = 1000;
  57.  
  58. implementation
  59.  
  60. {$R *.dfm}
  61.  
  62.  
  63. procedure TForm1.Init;
  64. begin
  65. //
  66. end;
  67.  
  68. procedure TForm1.SetupGL;
  69. begin
  70.   glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe
  71.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  72.   glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  73. end;
  74.  
  75. //FormCreate
  76. procedure TForm1.FormCreate(Sender: TObject);
  77. begin
  78.   DC:= GetDC(Handle);
  79.   if not InitOpenGL then Application.Terminate;
  80.   RC:= CreateRenderingContext( DC,
  81.                                [opDoubleBuffered],
  82.                                32,
  83.                                24,
  84.                                0,0,0,
  85.                                0);
  86.   ActivateRenderingContext(DC, RC);
  87.   SetupGL;  //siehe oben
  88.   Init;     //Globale Variablen initialisieren
  89.   Application.OnIdle := IdleHandler;
  90.  
  91.   venator:=TShip.create;
  92. end;
  93.  
  94.  
  95. procedure TForm1.FormResize(Sender: TObject);
  96. var
  97.   tmpBool : Boolean;
  98. begin
  99.   glViewport(0, 0, ClientWidth, ClientHeight);
  100.   glMatrixMode(GL_PROJECTION);
  101.   glLoadIdentity;
  102. //  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  103.   glOrtho(0,clientwidth,0,clientheight,0,128);
  104.  
  105.   glMatrixMode(GL_MODELVIEW);
  106.   glLoadIdentity;
  107.   IdleHandler(Sender, tmpBool);
  108. end;
  109.  
  110. procedure TForm1.FormDestroy(Sender: TObject);
  111. begin
  112.   DeactivateRenderingContext;
  113.   DestroyRenderingContext(RC);
  114.   ReleaseDC(Handle, DC);
  115. end;
  116.  
  117. procedure TForm1.Render;
  118. begin
  119.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  120.  
  121.   glViewport(0,0,ClientWidth,ClientHeight);
  122.  
  123.   glMatrixMode(GL_PROJECTION);
  124.   glLoadIdentity;
  125.  
  126. //  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  127.   glOrtho(0,clientwidth,0,clientheight,0,128);
  128.  
  129.   glMatrixMode(GL_MODELVIEW);
  130.   glLoadIdentity;
  131.  
  132.   //TexturbindBind
  133.  
  134.   //Alphatest zur Erkennung der Transparenz anhand der Textur
  135.   glEnable(GL_ALPHA_TEST);
  136.   glAlphaFunc(GL_GREATER, 0.1);
  137.  
  138.   //Blending zur Behebung der weißen Ränder wegen dem Alphatest
  139.   glEnable(GL_BLEND);
  140.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
  141.  
  142.   //Hier auf Zeichenroutine verweisen!!
  143.  
  144.   SwapBuffers(DC);
  145. end;
  146.  
  147. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  148. begin
  149.   StartTime:= GetTickCount;
  150.   Render;
  151.   DrawTime:= GetTickCount - StartTime;
  152.   Inc(TimeCount, DrawTime);
  153.   Inc(FrameCount);
  154.  
  155.   if TimeCount >= 1000 then begin
  156.     Frames:= FrameCount;
  157.     TimeCount:= TimeCount - 1000;
  158.     FrameCount:= 0;
  159.     Caption:= InttoStr(Frames) + 'FPS';
  160.     ErrorHandler;
  161.   end;
  162.  
  163.   //Eingabeüberprüfung und Bewegung mit DXInput
  164.   dxinput1.Update;
  165.  
  166.   //Eingabeüberprüfung mit OpenGL
  167.   // Überprüfen, ob W gedrückt wurde (Drehung um X-Achse)
  168.   if isleft in dxinput1.States then
  169.   begin
  170.     //--- Die Rotation um die Z-Achse erhöhen. ---------------------------------
  171.     venator.Rotate := venator.Rotate + 0.8;
  172.     //--- Sollte RotateX größer als 360 Grad sein, den Wert umrechnen. Dadurch
  173.     //    wird der Drehungs-Bereich auf 0 - 360 Grad begrenzt.
  174.     if venator.Rotate > 360 then venator.Rotate := venator.Rotate - 360;
  175.   end;
  176.  
  177.   // Überprüfen, ob W gedrückt wurde (Drehung um X-Achse)
  178.   if isright in dxinput1.States then
  179.   begin
  180.     //--- Die Rotation um die X-Achse erniedrigen. -----------------------------
  181.     venator.Rotate := venator.Rotate - 0.8;
  182.     //--- Sollte RotateX kleiner als 0 Grad sein, den Wert umrechnen. Dadurch
  183.     //    wird der Drehungs-Bereich auf 0 - 360 Grad begrenzt.
  184.     if venator.Rotate <= 0 then venator.Rotate := venator.Rotate + 360;
  185.   end;
  186.  
  187.   venator.move(0.01);
  188.   venator.draw;
  189.  
  190.   Done:= false;
  191. end;
  192.  
  193. procedure TForm1.ErrorHandler;
  194. begin
  195.   //Form1.Caption := gluErrorString(glGetError);
  196. end;
  197.  
  198. //------------------- TShip-Klasse Prozeduren ------------------------
  199.  
  200. constructor TShip.create;
  201. begin
  202.   Rotate := 360;
  203.   PosVect[0] := 200;
  204.   PosVect[1] := 200;
  205.   PosVect[2] := 1;
  206.   //Testtextur einladen
  207.   LoadTexture('testvenator.tga', texture, false);
  208.   //Abhängig von Texturgröße
  209.   breite:=128;
  210.   hoehe:=256;
  211. end;
  212.  
  213.  
  214. procedure TShip.move(speed: single);
  215. const
  216.   RotZAxis  : TVector3f = (0, 0, 1);
  217. var
  218.   Direction : single;
  219.   LookVec   : TVector4f;
  220. begin
  221.   // Ist die Vorwärts-Taste gedrückt? Wenn ja, nach vorne gehen.
  222.   if isup in form1.dxinput1.States then Direction := 1 else
  223.     // Ist die Rückwärtstaste gedrückt? Wenn ja, nach hinten gehen.
  224.     if isdown in form1.dxinput1.States then Direction := -1 else
  225.       // Wenn keine der beiden Tasten gedrückt wurde, kann die Prozedur
  226.       // verlassen werden, da dann keine Positions-Anpassung notwendig
  227.       // ist
  228.       Exit;
  229.  
  230.   // Den Blickrichtungs-Vektor initialisieren. Hier soll nur nach vorne,
  231.   // also in die Y-Richtung geschaut werden.
  232.   LookVec[0] := 0;
  233.   LookVec[1] := 1;
  234.   LookVec[2] := 0;
  235.   // Den W-Wert auf 0 setzen. Wir benötigen ihn nicht.
  236.   LookVec[3] := 0;
  237.  
  238.   // Den Look-Vektor um die Z-Achse drehen
  239.   VectorRotate(LookVec, RotZAxis, -DegToRad(Rotate));
  240.  
  241.   // Nun den gedrehten Vektor zum Aktuellen Positions-Vektor
  242.   // hinzuzählen. Damit die Bewegung beachtet wird, das ganze
  243.   // um den Speed-Faktor 0.01 mal Direction multiplizieren.
  244.   PosVect[0] := PosVect[0] + (LookVec[0] * (Direction * speed));
  245.   PosVect[1] := PosVect[1] + (LookVec[1] * (Direction * speed));
  246.   PosVect[2] := PosVect[2] + (LookVec[2] * (Direction * speed));
  247.  
  248.   //Alte Rotationsroutine
  249.   {glRotatef(winkel,0,0,1);
  250.   y:=y+speed;
  251.   my:=my+speed;
  252.   glTranslatef(mx+x,my+y,0);}
  253. end;
  254.  
  255. procedure TShip.draw;
  256. begin
  257.   // Das Objekt auf seine aktuelle Position setzen.
  258.   glTranslatef( PosVect[0],  PosVect[1],  PosVect[2]);
  259.  
  260.   { Das Objekt noch drehen, denn wir haben bis jetzt ja nur den }
  261.   { Vector gedreht.                                                   }
  262.   //Da 2D nur Z_Achse
  263.   glRotatef(Rotate, 0, 0, 1);
  264.  
  265.   //Texturbind
  266.   glEnable(GL_TEXTURE_2D);
  267.   glBindTexture(GL_TEXTURE_2D, texture);
  268.  
  269.   //Objekt zeichnen
  270.   glBegin(GL_QUADS);
  271.     glTexCoord2f(0,0); glVertex3f(-breite/2,-hoehe/2, 0);
  272.     glTexCoord2f(1,0); glVertex3f(breite/2,-hoehe/2, 0);
  273.     glTexCoord2f(1,1); glVertex3f(breite/2, hoehe/2, 0);
  274.     glTexCoord2f(0,1); glVertex3f(-breite/2,hoehe/2, 0);
  275.   glEnd;
  276. end;
  277.  
  278. //---------------------------------------------------------------------------
  279.  
  280. end.
  281.  


Vielen Dank :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 26, 2007 23:30 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Was funktioniert denn nicht?

Als erstes würde ich mal etwas aufräumen:

Die Einstellungen für den Viewport und Orthogonalen Modus würde ich in die Init Procedure packen. Braucht man ja nur einmal aufrufen in deinem Fall.
Das Handling der Tasten würde ich auch woanders hin packen. Der Übersicht wegen.
Dann würde ich noch ein glPushMatrix und glPopMatrix am Anfang und Ende der Draw Procedure einfügen. Wenn du nämlich ein 2. Schiff zeichnen würdest ohne die Modellviewmatrix zurückzusetzen würde das 2. Schiff relativ vom 1. positioniert.

Sprich:

Code:
  1. SetupGL
  2. Init
  3. IdleHandler
  4.   InputHandler
  5.   CalcMovement
  6.   RenderScene
  7.     Ship.Draw
  8.   (SwapBuffers)
  9.  


Aber nach schnellem Überfliegen fällt mir nichts ungewöhnliches auf.

gruß

damadmax

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 27, 2007 00:22 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Vielen Dank für deine Antwort. Werde deine Tipps morgen (bzw heute) früh dann umsetzen.

Das eigentliche Problem ist, dass das Objekt einfach nicht mehr angezeigt wird. Meine letzte kompilierte Version die noch aus dem letzten Jahr stammt und seitdem ich ein paar Sachen am Code geändert hatte, hat noch das Objekt angezeigt. Da es allerdings so lange her ist kann ich nicht mehr nachvollziehen was ich geändert habe.

Zwei Sachen musste ich heute dann auf jeden Fall ändern, z.B. zwei Prozedurnamen

RotateVector -> VectorRotate
glRotate zu glRotatef (aber hierbei weiß ich nicht genau ob ich den Teil nicht einfach nur inklusive Fehler übernommen hatte)

und eine neue Version der geometry.pas musste ich benutzen, da die alte einen Fehler ausgespuckt hat nach dem angeblich eine Datei namens "jedi-sdl.inc" gefehlt hatte. Benutze nun die Version 2.4 (vorher 1.1)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 27, 2007 00:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Überprüf mal deine Zeichenreihenfolge :

Du löschst deine Szene (glClear), tauschst die Puffer, machst die gelöschte Szene sichtbar und renderst dann dein Raumschiff, dann fängts wieder von vorne an, da kann man logischerweise nix sehen.

Du hast ja sogar vor dem SwapBuffers noch den Kommentar stehen dass auf die Zeichenroutine verwiesen werden muss.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 27, 2007 10:20 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Oh das seh ich ja jetzt erst, peinlich :D

Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 27, 2007 13:03 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Irgendwas scheint immer noch nicht zu stimmen, obwohl ich jetzt eigentlich die richtige Reihenfolge drin haben sollte. Den Input passe ich später an, ist ja zur Lösung des Problems denke ich zur ZEit nicht relevant :D
... wegeditiert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 27, 2007 14:41 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Ok jetzt habe ich nochmal testeweise gluPrespective eingebaut. Jetzt gibts zwar eine Ausgabe, allerdings nicht mit dem schönen flachen Effekt wie ich ihn eben mit ortho haben möchte. Die Bewegung ist soweit auch in Ordnung, allerdings ist das Objekt überdimensioniert und nicht im richtigen Größenverhältnis, wahrscheinlich wegengluPerspective.

Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, dglOpenGl, StdCtrls, ComCtrls, textures, DXInput, geometry;
  9.  
  10. type
  11.   TShip = class
  12.   private
  13.   //
  14.   public
  15.     Rotate, breite, hoehe: single;
  16.     PosVect  : TVector3f;
  17.     texture: glUInt;
  18.     constructor create;
  19.     procedure move(speed: single);
  20.     procedure draw;
  21.   end;
  22.  
  23. type
  24.   TForm1 = class(TForm)
  25.     Button1: TButton;
  26.     Button2: TButton;
  27.     Button3: TButton;
  28.     Button4: TButton;
  29.     Button5: TButton;
  30.     Button6: TButton;
  31.     Button7: TButton;
  32.     TrackBar1: TTrackBar;
  33.     DXInput1: TDXInput;
  34.     Label1: TLabel;
  35.     procedure FormCreate(Sender: TObject);
  36.     procedure FormResize(Sender: TObject);
  37.     procedure FormDestroy(Sender: TObject);
  38.     procedure IdleHandler(Sender: TObject; var Done: Boolean);
  39.   private
  40.     StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
  41.     Frames, DrawTime                  : Cardinal; //& Timebased Movement
  42.     procedure SetupGL;
  43.     procedure Init;
  44.     procedure Render;
  45.     procedure ErrorHandler;
  46.   public
  47.     DC                                : HDC;  //Handle auf Zeichenfläche
  48.     RC                                : HGLRC;//Rendering Context
  49.   end;
  50.  
  51. var
  52.   Form1: TForm1;
  53.   venator: TShip;
  54.  
  55. const
  56.   NearClipping = 1;
  57.   FarClipping  = 1000;
  58.  
  59. implementation
  60.  
  61. {$R *.dfm}
  62.  
  63.  
  64. procedure TForm1.Init;
  65. begin
  66.   glMatrixMode(GL_PROJECTION);
  67.   glLoadIdentity;
  68.   glViewport(0,0,ClientWidth,ClientHeight);
  69.   glOrtho(0,clientwidth,0,clientheight,0,128);
  70. end;
  71.  
  72. procedure TForm1.SetupGL;
  73. begin
  74.   glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe
  75.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  76.   glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  77. end;
  78.  
  79. //FormCreate
  80. procedure TForm1.FormCreate(Sender: TObject);
  81. begin
  82.   DC:= GetDC(Handle);
  83.   if not InitOpenGL then Application.Terminate;
  84.   RC:= CreateRenderingContext( DC,
  85.                                [opDoubleBuffered],
  86.                                32,
  87.                                24,
  88.                                0,0,0,
  89.                                0);
  90.   ActivateRenderingContext(DC, RC);
  91.   SetupGL;  //siehe oben
  92.   Init;     //Globale Variablen initialisieren
  93.   Application.OnIdle := IdleHandler;
  94.  
  95.   //Testweise Objekte kreiren
  96.   venator:=TShip.create;
  97. end;
  98.  
  99.  
  100. procedure TForm1.FormResize(Sender: TObject);
  101. var
  102.   tmpBool : Boolean;
  103. begin
  104.   glViewport(0, 0, ClientWidth, ClientHeight);
  105.   glMatrixMode(GL_PROJECTION);
  106.   glLoadIdentity;
  107.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  108.   glOrtho(0,clientwidth,0,clientheight,0,128);
  109.  
  110.   glMatrixMode(GL_MODELVIEW);
  111.   glLoadIdentity;
  112.   IdleHandler(Sender, tmpBool);
  113. end;
  114.  
  115. procedure TForm1.FormDestroy(Sender: TObject);
  116. begin
  117.   DeactivateRenderingContext;
  118.   DestroyRenderingContext(RC);
  119.   ReleaseDC(Handle, DC);
  120. end;
  121.  
  122. procedure TForm1.Render;
  123. begin
  124.   //Szene löschen
  125.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  126.  
  127.   //glViewport(0,0,ClientWidth,ClientHeight);
  128.  
  129. //  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  130.   //glOrtho(0,clientwidth,0,clientheight,0,128);
  131.  
  132.   glMatrixMode(GL_MODELVIEW);
  133.   glLoadIdentity;
  134.  
  135.   //Alphatest zur Erkennung der Transparenz anhand der Textur
  136.   glEnable(GL_ALPHA_TEST);
  137.   glAlphaFunc(GL_GREATER, 0.1);
  138.  
  139.   //Blending zur Behebung der weißen Ränder wegen dem Alphatest
  140.   glEnable(GL_BLEND);
  141.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
  142.  
  143.   //Hier auf Zeichenroutine verweisen!!
  144.   venator.draw;
  145.  
  146.   SwapBuffers(DC);
  147.  
  148.   label1.Caption:='X:'+FloatToStrf(venator.Posvect[0],fffixed,7,2)+'Y:'+FloatToStrf(venator.Posvect[1],fffixed,7,2);
  149. end;
  150.  
  151. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  152. begin
  153.   StartTime:= GetTickCount;
  154.  
  155.   venator.move(0.51);
  156.   Render;
  157.  
  158.   DrawTime:= GetTickCount - StartTime;
  159.   Inc(TimeCount, DrawTime);
  160.   Inc(FrameCount);
  161.  
  162.   if TimeCount >= 1000 then begin
  163.     Frames:= FrameCount;
  164.     TimeCount:= TimeCount - 1000;
  165.     FrameCount:= 0;
  166.     Caption:= InttoStr(Frames) + 'FPS';
  167.     ErrorHandler;
  168.   end;
  169.  
  170.   //Eingabeüberprüfung und Bewegung mit DXInput
  171.   dxinput1.Update;
  172.  
  173.   //Eingabeüberprüfung mit OpenGL
  174.   // Überprüfen, ob linke Pfeiltaste gedrückt wurde
  175.   if isleft in dxinput1.States then
  176.   begin
  177.     //--- Die Rotation um die Z-Achse erhöhen. ---------------------------------
  178.     venator.Rotate := venator.Rotate + 0.3;
  179.     //--- Sollte RotateX größer als 360 Grad sein, den Wert umrechnen. Dadurch
  180.     //    wird der Drehungs-Bereich auf 0 - 360 Grad begrenzt.
  181.     if venator.Rotate > 360 then venator.Rotate := venator.Rotate - 360;
  182.   end;
  183.  
  184.   // Überprüfen, ob rechte Pfeiltaste gedrückt wurde
  185.   if isright in dxinput1.States then
  186.   begin
  187.     //--- Die Rotation um die X-Achse erniedrigen. -----------------------------
  188.     venator.Rotate := venator.Rotate - 0.3;
  189.     //--- Sollte RotateX kleiner als 0 Grad sein, den Wert umrechnen. Dadurch
  190.     //    wird der Drehungs-Bereich auf 0 - 360 Grad begrenzt.
  191.     if venator.Rotate <= 0 then venator.Rotate := venator.Rotate + 360;
  192.   end;
  193.  
  194.   Done:= false;
  195. end;
  196.  
  197. procedure TForm1.ErrorHandler;
  198. begin
  199.   //Form1.Caption := gluErrorString(glGetError);
  200. end;
  201.  
  202. //------------------- TShip-Klasse Prozeduren ------------------------
  203.  
  204. constructor TShip.create;
  205. begin
  206.   Rotate := 360;
  207.   PosVect[0] := 200;
  208.   PosVect[1] := 200;
  209.   PosVect[2] := 1;
  210.   //Testtextur einladen
  211.   LoadTexture('testvenator.tga', texture, false);
  212.   //Abhängig von Texturgröße (später automatisch auslesen lassen)
  213.   breite:=128;
  214.   hoehe:=256;
  215. end;
  216.  
  217.  
  218. procedure TShip.move(speed: single);
  219. const
  220.   RotZAxis  : TVector3f = (0, 0, 1);
  221. var
  222.   Direction : single;
  223.   LookVec   : TVector4f;
  224. begin
  225.   // Ist die Vorwärts-Taste gedrückt? Wenn ja, nach vorne gehen.
  226.   if isup in form1.dxinput1.States then Direction := 1 else
  227.     // Ist die Rückwärtstaste gedrückt? Wenn ja, nach hinten gehen.
  228.     if isdown in form1.dxinput1.States then Direction := -1 else
  229.       // Wenn keine der beiden Tasten gedrückt wurde, kann die Prozedur
  230.       // verlassen werden, da dann keine Positions-Anpassung notwendig
  231.       // ist
  232.       Exit;
  233.  
  234.   // Den Blickrichtungs-Vektor initialisieren. Hier soll nur nach vorne,
  235.   // also in die Y-Richtung geschaut werden.
  236.   LookVec[0] := 0;
  237.   LookVec[1] := 1;
  238.   LookVec[2] := 0;
  239.   // Den W-Wert auf 0 setzen. Wir benötigen ihn nicht.
  240.   LookVec[3] := 0;
  241.  
  242.   // Den Look-Vektor um die Z-Achse drehen
  243.   VectorRotate(LookVec, RotZAxis, -DegToRad(Rotate));
  244.  
  245.   // Nun den gedrehten Vektor zum Aktuellen Positions-Vektor
  246.   // hinzuzählen. Damit die Bewegung beachtet wird, das ganze
  247.   // um den Speed-Faktor 0.01 mal Direction multiplizieren.
  248.   PosVect[0] := PosVect[0] + (LookVec[0] * (Direction * speed));
  249.   PosVect[1] := PosVect[1] + (LookVec[1] * (Direction * speed));
  250.   PosVect[2] := PosVect[2] + (LookVec[2] * (Direction * speed));
  251.  
  252.   //Alte Rotationsroutine
  253.   {glRotatef(winkel,0,0,1);
  254.   y:=y+speed;
  255.   my:=my+speed;
  256.   glTranslatef(mx+x,my+y,0);}
  257. end;
  258.  
  259. procedure TShip.draw;
  260. begin
  261.   glPushMatrix;
  262.     // Das Objekt auf seine aktuelle Position setzen.
  263.     glTranslatef( PosVect[0],  PosVect[1],  PosVect[2]);
  264.  
  265.     //Das Objekt noch drehen, denn wir haben bis jetzt ja nur den Vektor gedreht.
  266.     //Da 2D nur Z_Achse
  267.     glRotatef(Rotate, 0, 0, 1);
  268.  
  269.     //Texturbind
  270.     glEnable(GL_TEXTURE_2D);
  271.     glBindTexture(GL_TEXTURE_2D, texture);
  272.  
  273.     //Objekt zeichnen
  274.     glBegin(GL_QUADS);
  275.       glTexCoord2f(0,0); glVertex3f(-breite/2,-hoehe/2, 0);
  276.       glTexCoord2f(1,0); glVertex3f(+breite/2,-hoehe/2, 0);
  277.       glTexCoord2f(1,1); glVertex3f(+breite/2,+hoehe/2, 0);
  278.       glTexCoord2f(0,1); glVertex3f(-breite/2,+hoehe/2, 0);
  279.     glEnd;
  280.   glPopMatrix;
  281. end;
  282.  
  283. //---------------------------------------------------------------------------
  284.  
  285. end.
  286.  


Wie bekomme ich das nun so hin wie es eben dank glOrtho sein sollte? Und noch ne Vertändnisfrage nebebher, wo genau zeigt eigentlich mein Positionsvektor hin, in den Mittelpunkt des Schiffs? :oops:
Steh gerade aufm Schlauch.


€: Ich sehe gerade, dass ich ja das gluPerspective in die OnResize Methode gepackt habe, wieso funktioniert es nur da? Wenn ich es z.B. im Init anwende sehe ich wieder nichts obwohl ich das doch auf die Projektionsmatrix anwende :?:


Ich finde den einfach Fehler nicht :(


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 6 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 ]