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

Aktuelle Zeit: Fr Jul 18, 2025 14:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Selektion von verdekten Objekten
BeitragVerfasst: So Apr 20, 2008 12:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Hallo Forum,

ich habe gerade ein kleines Problem mit der Selektion. Zur Verdeutlichung habe ich mal einen kleinen Screenshot aus meiner Szene hinzugefügt.

Ziel soll es sein, die farbigen Quads anklicken zu können. Im Prinzip funktioniert dies auch, solange ich auf die durch die grünen Pfeile markierten Stellen klicke. Sobald ich allerdings auf die Stellen mit den roten Pfeilen klicke, bekomme ich als Ergebnis der Selektion immer zurück, dass ich auf den Drahtgitterring geklickt habe. Dies ist ja eigentlich nicht korrekt, weil die Quads über dem Ring liegen.

Ich verwende für dieses Beispiel die Selektionsfunktion aus dem Tutorial:

Code:
  1. function TfrmMain.Selection : 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.   glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  12.   glmatrixmode(gl_projection);                //In den Projektionsmodus
  13.   glPushMatrix;                               //Um unsere Matrix zu sichern
  14.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  15.  
  16.   gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, Viewport);
  17.   gluPerspective(45.0, pnlOpenGL.ClientWidth / pnlOpenGL.ClientHeight, NearClipping, FarClipping);
  18.  
  19.   Render;                                     //Die Szene zeichnen
  20.  
  21.   glmatrixmode(gl_projection);                //Wieder in den Projektionsmodus
  22.   glPopMatrix;                                //um 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.  
  29.   Label2.Caption := 'Treffer: ' + IntToStr(Treffer);
  30.  
  31.   for i := 0 to Treffer-1 do
  32.     if Puffer[(i*4)+1] < Z_Wert then
  33.     begin
  34.       getroffen := Puffer[(i*4)+3];
  35.       Z_Wert    := Puffer[(i*4)+1];
  36.     end;
  37.  
  38.   Label3.Caption := 'getroffen: ' + IntToStr(getroffen);
  39.   Label4.Caption := 'Z_Wert: ' + IntToStr(Z_Wert);
  40.  
  41.    Result := getroffen;
  42. end;


Habt ihr eine Idee was ich hier falsch machen könnte?

Vielen Dank für die Unterstützung!

Gruß,
Michael


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 20, 2008 13:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du bei deinem Rendern den Tiefentest aktiv?
Wenn nein, dann liegt es daran, dass deine Quads eigentlich unter dem Drahtgitterring liegen. Bei der Selektionsroutine wird nach Z-Wert sortiert, nicht nach dem, was sichtbar oben liegt.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 20, 2008 13:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Ja,
Code:
  1.   glEnable(GL_DEPTH_TEST);

habe ich gesetzt. GL_DEPTH_TEST kommt auch nur an dieser Stelle im gesamten Projekt vor.
Ich habe testweise den Befehl mal mit in die Selekt-Funktion geschrieben, ist jedoch das gleiche Ergebnis.

Also das war es leider nicht :(

Was mir gerade noch aufgefalle ist, ist das der Z-Wert immer 0 ist.
Nur wenn ich ins Nichts klicke bekommt der Z-Wert den Wert 4294967295

Warum ist Z bei allen Objekte, egal welche Stelle ich anklicke, immer 0?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 20, 2008 21:58 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Wie sieht deine Renderprocedure aus?
Setzt du da die Perspektive neu? Und wie gross ist dein "normaler" Perspektivwinkel.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 21, 2008 07:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Oh man, wie dämlich :oops:

Ich hatte die Konstanten für die klickbaren Objekte einmal in der frmMain und ein zweites mal in einer Unit definiert...dadurch habe ich mir die Selektion irgendwie zerschossen.

Hat sich also erledigt, es funktioniert jetzt wunderbar ;)

Danke an Alle!

Gruß,
Michael


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


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 | 15 Queries | GZIP : On ]