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

Aktuelle Zeit: Mo Jul 14, 2025 22:15

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Objektselektion-Tutorial
BeitragVerfasst: So Mär 23, 2008 18:32 
Offline
DGL Member

Registriert: So Jan 07, 2007 19:22
Beiträge: 5
Guten Tag!

ich habe gerade das Objektselektion-Tutorial A durchgearbeitet, nur leider funktioniert mein Programm noch nicht richtig.
Ich habe 3 Quadrate in verschiedenen Farben gezeichnet, durch debuggen habe ich jetzt aber raus gefunden, dass immer alle 3 Quadrate getroffen werden, egal, ob ich auf eines der Quadrate klicke oder irgendwo auf den Hintergrund. Von der Selection-Funktion wird dadurch immer das Quadrat zurück gegeben, welches am nähsten an Kamera ist oder, wenn wenn alle denselben Z-Wert haben, das, was als erste gezeichnet wird. Woran könnte das liegen?
Hier noch mein Code:
Konstanten:
Code:
  1.  
  2. const
  3.   NearClipping = 1;
  4.   FarClipping = 1000;
  5.   rot = 1;
  6.   gruen = 2;
  7.   blau = 3;
  8.   namen : array[-1..3] of string = ('nichts', '', 'rot', 'grün', 'blau');
  9.  


Rendern:
Code:
  1. procedure TForm1.Render;
  2. begin
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.  
  5.   glMatrixMode(GL_PROJECTION);
  6.   glLoadIdentity;
  7.   gluPerspective(45.0, ClientWidth/ClientHeight, Nearclipping, Farclipping);
  8.  
  9.   glMatrixMode(GL_MODELVIEW);
  10.   glLoadIdentity;
  11.  
  12.   glTranslatef(0, 0, -20);
  13.  
  14.   glInitNames;
  15.   glPushName(0);
  16.  
  17.   glColor3f(1, 0, 0);
  18.   glLoadName(rot);
  19.   glBegin(GL_QUADS);
  20.     glVertex3f(-6, -6, 0);
  21.     glVertex3f(-1, -6, 0);
  22.     glVertex3f(-1, -1, 0);
  23.     glVertex3f(-6, -1, 0);
  24.   glEnd;
  25.  
  26.   glColor3f(0, 1, 0);
  27.   glLoadName(gruen);
  28.   glBegin(GL_QUADS);
  29.     glVertex3f(1, -6, 0);
  30.     glVertex3f(6, -6, 0);
  31.     glVertex3f(6, -1, 0);
  32.     glVertex3f(1, -1, 0);
  33.   glEnd;
  34.  
  35.   glColor3f(0, 0, 1);
  36.   glLoadName(blau);
  37.   glBegin(GL_QUADS);
  38.     glVertex3f(-2.5, 1, 0);
  39.     glVertex3f(2.5, 1, 0);
  40.     glVertex3f(2.5, 6, 0);
  41.     glVertex3f(-2.5, 6, 0);
  42.   glEnd;
  43.  
  44.   glPopName;
  45.  
  46.   SwapBuffers(DC);
  47. end;
  48.  


Selektion:
Code:
  1. function TForm1.Selection(const x, y: integer): integer;
  2. var
  3.   Puffer       : array[0..256] of GLUInt;
  4.   Viewport     : TGLVectori4;
  5.   Treffer,i    : Integer;
  6.   Z_Wert       : GLUInt;
  7.   Getroffen    : GLUInt;
  8. begin
  9.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  10.   glSelectBuffer(256, @Puffer);               //Den Puffer zuordnen
  11.  
  12.   glMatrixMode(GL_PROJECTION);                //In den Projektionsmodus
  13.   glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  14.   glPushMatrix;                               //Um unsere Matrix zu sichern
  15.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  16.  
  17.   gluPickMatrix(x, viewport[3]-y, 0.1, 0.1, viewport);
  18.   gluPerspective(45.0, ClientWidth/ClientHeight, Nearclipping, Farclipping);
  19.  
  20.   render;                                     //Die Szene zeichnen
  21.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  22.   glPopMatrix;                                //und unsere alte Matrix wiederherzustellen
  23.  
  24.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  25.  
  26.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  27.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  28.   for i := 0 to Treffer-1 do
  29.     if Puffer[(i*4)+1] < Z_Wert then
  30.       begin
  31.         getroffen       := Puffer[(i*4)+3];
  32.         Z_Wert := Puffer[(i*4)+1];
  33.       end;
  34.  
  35.   if getroffen=High(GLUInt)
  36.     then Result := -1
  37.     else Result := getroffen;
  38. end;


OnMouseDown:
Code:
  1. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  2.   Shift: TShiftState; X, Y: Integer);
  3. begin
  4.   ShowMessage('Die Farbe des Quadrats ist: '+ namen[selection(x, y)]);
  5. end;


Vielen Dank schonmal und frohe Ostern,
r4v3r


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 23, 2008 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
In deiner Renderfunktion überschreibst du ja die Pickingmatrix, daher geht dann die Selektion logischerweise nichtmehr. Hier musst du im Rendervorgang prüfen ob du im Selektionsmodus bist, und dann die Matrix nicht überschreiben.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 23, 2008 22:19 
Offline
DGL Member

Registriert: So Jan 07, 2007 19:22
Beiträge: 5
Kopf :arrow: Tisch Bild
Klar, das ist einleuchtend, wenn man das so hört, dass ich da nicht selbst drauf gekommen bin :oops: Dankeschön!

Falls jemand dasselbe Problem hat, ich hab das jetzt mit einem default-Parameter gemacht, der auf true gesetzt wird, falls die Render-Methode aus der Selection-Methode aufgerufen wird:
Code:
  1.  
  2. procedure TForm1.Render(const selection: boolean = false);
  3. begin
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.  
  6.   if not selection then
  7.     begin
  8.       glMatrixMode(GL_PROJECTION);
  9.       glLoadIdentity;
  10.       gluPerspective(45.0, ClientWidth/ClientHeight, Nearclipping, Farclipping);
  11.     end;
  12.  
  13.   // der restliche Quelltext ...
  14. end;
  15.  


MfG r4v3r


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 3 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.008s | 14 Queries | GZIP : On ]