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

Aktuelle Zeit: Di Mai 14, 2024 17:16

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Objectselection
BeitragVerfasst: Mi Nov 30, 2011 21:09 
Offline
DGL Member

Registriert: Di Nov 29, 2011 23:29
Beiträge: 2
Hallo,

ich hab mich jetzt mal wieder an OpenGL heran gewagt :D
Und dachte mir jetzt mal ein Morhun-Spiel zu programmieren!
Das ganze funktioniert so, dass man auf ein sich drehendes Rechteck klicke soll, und dann kommt irgendwas von wegen gewonnen oder so...

Leider funktioniert die Objectselection nicht :cry:
Sieht von euch vllt. jemand den Fehler?

Hier mal mein ganzer Quelltext:
Code:
  1. unit Morhun;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs,dglopengl,Math, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Timer1: TTimer;
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure FormDestroy(Sender: TObject);
  14.     procedure FormResize(Sender: TObject);
  15.     procedure Timer1Timer(Sender: TObject);
  16.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  17.       Shift: TShiftState; X, Y: Integer);
  18.   private    { Private-Deklarationen }
  19.     StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
  20.     Frames, DrawTime                  : Cardinal; //& Timebased Movement
  21.     procedure SetupGL;
  22.     procedure Render;
  23.     procedure ErrorHandler;
  24.     procedure init;
  25.   public    { Public-Deklarationen }
  26.     DC                                : HDC;  //Handle auf Zeichenfläche
  27.     RC                                : HGLRC;//Rendering Context
  28.     xs, ys                            : Integer;
  29.   end;
  30.  
  31. var
  32.   Form1: TForm1;
  33.   i: Integer;
  34.  
  35. const
  36.   NearClipping = 1;
  37.   FarClipping  = 1000;
  38.   Huhn = 100;
  39.   NULL = 0;
  40.  
  41. function selection: Integer;
  42.  
  43. implementation
  44.  
  45. {$R *.dfm}
  46.  
  47. procedure TForm1.Render;
  48. begin
  49.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  50.  
  51.   glMatrixMode(GL_MODELVIEW);
  52.   glLoadIdentity;
  53.   glInitNames;
  54.   glPushName(0);
  55.   //gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  56.  
  57.   glMatrixMode(GL_MODELVIEW);
  58.   glLoadIdentity;
  59.   glTranslatef(0, 0, -1);
  60.  
  61.   glPushMatrix();
  62.  
  63.   glTranslatef(-1, -0.9, -1);
  64.   glRotatef(-60,1,0,0);
  65.  
  66.   glLoadName(NULL);
  67.   glBegin(GL_QUADS);
  68.     glColor3f(0, 1, 0);//Farbe
  69.     glVertex3f(0, 0, 0);//unten rechts
  70.     glVertex3f(2, 0, 0);//oben rechts
  71.     glVertex3f(2, 2, 0);//oben links
  72.     glVertex3f(0, 2, 0);//unten links
  73.   glEnd;
  74.  
  75.   glPopMatrix();
  76.   glPushMatrix();
  77.  
  78.   glTranslatef(0,-0.7,-1);
  79.   glTranslatef(Sin(i/130),Cos(i/130),0);
  80.   dec(i);
  81.  
  82.   if (i=-45) then
  83.     i:=45;
  84.   glLoadName(Huhn);
  85.   glBegin(GL_QUADS);
  86.     glColor3f(1,0,0);//Farbe
  87.     glVertex3f(0,0.1,0);
  88.     glVertex3f(0,0,0);
  89.     glVertex3f(0.1,0,0);
  90.     glVertex3f(0.1,0.1,0);
  91.     glVertex3f(0,0.1,0);
  92.   glEnd;
  93.  
  94.   SwapBuffers(DC);
  95. end;
  96.  
  97. procedure TForm1.FormCreate(Sender: TObject);
  98. begin
  99.   DC:= GetDC(Handle);
  100.   if not InitOpenGL then Application.Terminate;
  101.   RC:= CreateRenderingContext( DC,
  102.                                [opDoubleBuffered],
  103.                                32,
  104.                                24,
  105.                                0,0,0,
  106.                                0);
  107.   ActivateRenderingContext(DC, RC);
  108.   Timer1.Enabled:=True;
  109. end;
  110.  
  111. procedure TForm1.FormDestroy(Sender: TObject);
  112. begin
  113.   DeactivateRenderingContext;
  114.   DestroyRenderingContext(RC);
  115.   ReleaseDC(Handle, DC);
  116. end;
  117.  
  118. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  119.   Shift: TShiftState; X, Y: Integer);
  120. begin
  121.   xs := x;
  122.   ys := y;
  123.  
  124.   ShowMessage(IntToStr(selection));
  125. end;
  126.  
  127. procedure TForm1.FormResize(Sender: TObject);
  128. var tmpBool : Boolean;
  129. begin
  130.   glViewport(0, 0, ClientWidth, ClientHeight);
  131.   glMatrixMode(GL_PROJECTION);
  132.   glLoadIdentity;
  133.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  134.  
  135.   glMatrixMode(GL_MODELVIEW);
  136.   glLoadIdentity;
  137. end;
  138.  
  139. procedure TForm1.SetupGL;
  140. begin
  141.   glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  142.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  143.   //glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  144.   ActivateRenderingContext(DC, RC);
  145.   SetupGL;
  146.   Init; //Was man sonst so initialisieren will.
  147. end;
  148.  
  149. procedure TForm1.Timer1Timer(Sender: TObject);
  150. begin
  151.    inc(FrameCount);
  152.    Render;
  153.    If FrameCount = 20 then
  154.       begin
  155.            ErrorHandler;
  156.            FrameCount := 0;
  157.       end;
  158. end;
  159.  
  160. procedure TForm1.init;
  161. begin
  162.   i:=0;
  163. end;
  164.  
  165. procedure TForm1.ErrorHandler;
  166. begin
  167.   //Form1.Caption := gluErrorString(glGetError);
  168. end;
  169.  
  170. function Selection : integer;
  171. var
  172.   Puffer       : array[0..256] of GLUInt;
  173.   Viewport     : TGLVectori4;
  174.   Treffer,i    : Integer;
  175.   Z_Wert       : GLUInt;
  176.   Getroffen    : GLUInt;
  177. begin
  178. with Form1 do
  179.   Begin
  180.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  181.   glSelectBuffer(256, @Puffer);               //Den Puffer zuordnen
  182.  
  183.   glMatrixMode(GL_PROJECTION);                //In den Projektionsmodus
  184.   glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  185.   glPushMatrix;                               //Um unsere Matrix zu sichern
  186.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  187.  
  188.   gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  189.   gluPerspective(60.0, Viewport[2]/Viewport[3], 1, 256);
  190.  
  191.   render;                                     //Die Szene zeichnen
  192.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  193.   glPopMatrix;                                //und unsere alte Matrix wiederherzustellen
  194.  
  195.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  196.  
  197.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  198.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  199.   for i := 0 to Treffer-1 do
  200.     if Puffer[(i*4)+1] < Z_Wert then
  201.     begin
  202.       getroffen       := Puffer[(i*4)+3];
  203.       Z_Wert := Puffer[(i*4)+1];
  204.     end;
  205.  
  206.   if getroffen=High(GLUInt)
  207.     then Result := -1
  208.     else Result := getroffen;
  209. end;
  210. end;
  211.  
  212. end.


Es kommt leider immer egal wohin ich klicke die Meldung "-1"

Danke für's Lesen 8)


EDIT1:

Ich habe gerade festgestellt, das es lediglich ein wenig ungenau ist, wenn ich ca. 1 cm. unter das "Morhun" klicke, kommen die gewünschten 100!!

Wie bekommt man den Code denn genauer?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Objectselection
BeitragVerfasst: Mi Nov 30, 2011 22:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

beim normalen Rendern hast du den Öffnungswinkel der Kamera auf 45°. In der Selektions Routine stehen aber 60°. Das sollte der Fehler sein, denke ich.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Objectselection
BeitragVerfasst: Mi Nov 30, 2011 22:46 
Offline
DGL Member

Registriert: Di Nov 29, 2011 23:29
Beiträge: 2
Cool, danke :!:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Objectselection
BeitragVerfasst: Mi Nov 30, 2011 22:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Geht's jetz?

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 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.033s | 17 Queries | GZIP : On ]