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

Aktuelle Zeit: Mo Jul 07, 2025 19:51

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit Selektion
BeitragVerfasst: So Aug 26, 2007 13:16 
Offline
DGL Member

Registriert: Mo Jan 29, 2007 16:14
Beiträge: 4
hallo,
ich habe ein Problem mit der Selektion von Quatraten
also ich habe zwei Vierecke:
Code:
  1.  
  2. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  3.  
  4.   glMatrixMode(GL_PROJECTION);
  5.   glLoadIdentity;
  6.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  7.  
  8.   glMatrixMode(GL_MODELVIEW);
  9.   glLoadIdentity;
  10.  
  11. ...
  12.  
  13.  glInitNames;
  14.  glPushName(0);
  15. glLoadName(1);
  16. glbegin(GL_QUADS);
  17.   glvertex3f(0,0,0);
  18.   glvertex3f(0,0,1);
  19.   glvertex3f(1,0,1);
  20.   glvertex3f(1,0,0);
  21. glend;
  22. glLoadName(2);
  23. glbegin(GL_QUADS);
  24.   glvertex3f(1,0,1);
  25.   glvertex3f(1,0,2);
  26.   glvertex3f(2,0,2);
  27.   glvertex3f(2,0,1);
  28. glend;
  29.  


die selektion kommt vom tutorial:
Code:
  1. function Selection(xs,ys: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(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  18.   gluPerspective(60.0, Viewport[2]/Viewport[3], 1, 256);
  19.  
  20.   form1.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;

Das Problem: egal wo ich hinklicke, es wird immer 2 selektiert, auch wenn dort nichts ist. Wo liegt das Problem?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 26, 2007 13:42 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hallo,

das sollte an dem unterschiedlichen Aufruf von
- gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
- gluPerspective(60.0, Viewport[2]/Viewport[3], 1, 256);
liegen. Sobald Du daran etwas änderst, kommt die Selektion nicht mehr zurecht.
Aber die Selektion über den OGL-Mechanismus ist ohnehin sehr fehleranfällig. Das merkt man auch an den Anzahl Threads, wenn man im Forum nach Selektion sucht. :)
Hinzukommt, dass die OGL-Selektion auf nVidia-Karten ziemliche Performanceschwankungen verursacht. Die Alternative wäre sich einen eigenen Selektionsalgorithmus zu schreiben, welcher immer funktioniert und auf allen Grafikkarten läuft. Bei Interesse kann ich Dir den Algo gern geben.

Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 26, 2007 13:46 
Offline
DGL Member

Registriert: Mo Jan 29, 2007 16:14
Beiträge: 4
wäre nett wenn du mir anderen algo geben könntest, auch weil ich eine nVidia-Karte habe. Danke im Vorraus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 26, 2007 15:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hallo,

Da das in dieser Woche schon das zweite Problem mit der Selektion ist, habe ich die wichtigen Quelltextteile meiner Umsetzung extrahiert und auf meine Seite geschmissen. Ich stelle den Ansatz damit zur Diskussion und bitte um Verbesserungsvorschläge. Wenn es dann Konsens gibt, könnten wir die Umsetzung ins Wiki stellen. Hier der aktuelle Stand: http://www.2ndmoon.de/selection.html.

@Legotrailer: Keine Sorge, die dort gezeigte Methode funktioniert, und Du kannst gern beginnen diese zu implementieren. Ich möchte nur zeitgleich eventuelle Verbesserungsvorschläge sammeln. :)


Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 26, 2007 15:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
DNA hat geschrieben:
Hinzukommt, dass die OGL-Selektion auf nVidia-Karten ziemliche Performanceschwankungen verursacht.

Was aber nicht auf allen Karten vorkommt und auch nicht an der Karte, sondern am Treiber liegt. Siehe auch hier.

Was ich an deiner Methode verändert habe:
Zum Klicken ist Sie sicherlich ausreichend performant, nur, wenn man es ins MouseMove für einen MouseOver/Hover-Effekt schiebt, schien glReadPixels() bei mir irgendwie die Performance durcheinanderzubringen. (Die gemessene Renderdauer wurde trotz VSync teilweise 5mal so klein, obwohl die Szene effektiv noch die alte Renderzeit brauchte)
Daher hab ich im MouseMove lediglich die Variablen mX und mY überschreiben und direkt in die Renderprozedur geschrieben:
Code:
  1.  
  2. procedure Render;
  3. begin
  4.   if(mX <> lX) and (mY <> lY) then
  5.   begin
  6.     lX := mX;
  7.     lY := mY;
  8.     // hier Selektionsteil
  9.   end;
  10.   // hier normaler Renderteil
  11. end;
  12.  


Das Ergebnis kann man in der Matrionx Beta 2 "bewundern" ;) - die trotz Mausrumgefuchtel und VSync nicht auf einmal 300, sondern bei mir maximal zwischen 55 und 65 FPS schwankt. Was mir grade noch einfällt - ob VSync deaktivieren was gebracht hätte, kann ich nicht sagen.

MfG


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 » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 22 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.007s | 15 Queries | GZIP : On ]