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

Aktuelle Zeit: Fr Jul 18, 2025 21:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: *solved* Name bei Selektion immer 0
BeitragVerfasst: Mi Mär 28, 2007 14:49 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Kaum ist ein Problem gelöst, so stellt sich das nächste ein. Ich habe die Objektselektion hinbekommen, allerdings bekomme ich immer nur 0 als hit zurück. Im Prinzip soll folgendes geschehen. Über eine Displayliste lasse ich mehrere Objekte darstellen. Klickt der Benutzer auf eines dieser Objekte, so soll es gelöscht werden.

Dazu die zeichen Methode:
Code:
  1.  
  2. GLuint DisplayWidget::makeCluster(ClusterList clusters)
  3. {
  4.  
  5.     glInitNames();
  6.     glPushName(0);
  7.  
  8.     GLuint list = glGenLists(1); // allocates range number of contiguous display list indices
  9.     glNewList(list, GL_COMPILE); // create new display list
  10.  
  11.     ClusterList::iterator begin = clusters.begin();
  12.     for ( ; begin != clusters.end(); begin++) {
  13.         Cluster* currentCluster = *begin;
  14.  
  15.         glLoadName(currentCluster->getId());
  16.  
  17.         PointList points = currentCluster->getPointList();
  18.         glBegin(GL_POINTS);
  19.         for(int i = 0; i < points.size(); i++) {
  20.             Point *p =  points.at(i);
  21.             glVertex3f(p->x, -(p->z), p->y);
  22.         } //for
  23.         glEnd();
  24.         } //if
  25.     } //for   
  26.     glEndList(); // end of display list
  27.  
  28.     return list;
  29. } //makeCluster
  30.  


Die selection Methode sieht folgendermaßen aus:
Code:
  1.  
  2.  
  3. void DisplayWidget::selectCluster()
  4. {
  5.     GLuint selectBuf[128];
  6.     GLuint hits, hit, zMin;
  7.     GLint viewport[4];
  8.  
  9.     glSelectBuffer(128, selectBuf);
  10.     glRenderMode(GL_SELECT);
  11.  
  12.     glMatrixMode(GL_PROJECTION);
  13.     glPushMatrix();
  14.     glLoadIdentity();
  15.  
  16.     glGetIntegerv(GL_VIEWPORT, viewport);
  17.     gluPickMatrix((GLdouble) lastPos.x(), (GLdouble) viewport[3] - lastPos.y(), 5, 5, viewport);
  18.     glOrtho(-0.5*zoom, +0.5*zoom, +0.5*zoom, -0.5*zoom, 0.0, 900.0);
  19.  
  20.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  21.     glMatrixMode(GL_MODELVIEW);
  22.     glLoadIdentity();
  23.     glTranslatef(0, 0, -10);
  24.     glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
  25.     glRotatef(yRot / 16.0, 0.0, 1.0, 0.0);
  26.     glRotatef(zRot / 16.0, 0.0, 0.0, 1.0);
  27.     glTranslatef(-xT, -yT, -zT);
  28.  
  29.     clusterObject = makeCluster(clusterList);
  30.     glCallList(clusterObject);
  31.  
  32.     // restoring the original projection matrix
  33.     glMatrixMode(GL_PROJECTION);
  34.     glPopMatrix();
  35.    
  36.     // returning to normal rendering mode
  37.     hits = glRenderMode(GL_RENDER);
  38.    
  39.     // if there are hits process them
  40.     if (hits > 0) {
  41.         hit = zMin = UINT_MAX;
  42.         for (int i=0; i < hits; i++) {
  43.             if (selectBuf[(i*4)+1] < zMin) {
  44.                 hit = selectBuf[(i*4)+3];
  45.                 zMin = selectBuf[(i*4)+1];
  46.             } //if
  47.         } //for
  48.     } //if
  49. } //selectCluster
  50.  


Warum bekomme ich immer nur einen Hit mit dem Namen 0? Hat jemand eine Idee? Vielen Danke für eure Antworten!


Zuletzt geändert von Hans-im-Glueck am Do Mär 29, 2007 08:11, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 28, 2007 19:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die Projektionsmatrix muss beim Selekt genauso sein wie beim rendern. Der Select-Pass ist quasi auch nur ein render durchlauf. Wenn du die Objekte an der stelle anklicken willst wo du sie siehst, musst du dafür sorgen, dass beim Select-Renderpass die Objekte auch an genau der selben stelle gerendert werden.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 29, 2007 07:19 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Meiner Meinung nach klappt das mit dem Rendern. Also die Objekte kann ich auch dort anklicken wo sie gezeichnet sind. Das Problem ist nur, dass ich als Treffer immer nur eine Eins bekomme und als Namen eine Null im SelectBuffer zu stehen habe.

Mache ich das mit dem glLoadName richtig? Gibt es da Probleme innerhalb einer DisplayList?


Zuletzt geändert von Hans-im-Glueck am Do Mär 29, 2007 08:02, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 29, 2007 07:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du musst erst einmal einen Namen Pushen bevor du mit LoadName den Obersten ersetzen kannst. Der Namensstack ist im Gegensatz zu den anderen Stack zu begin leer. Du benutzt zwar Pushname aber zu diesem Zeitpunkt befindest du dich nicht in der Selektion weswegen der Befehl ignoriert werden sollte. Entweder du integrierst das PushName mit in die Liste oder aber du pushest vor dem Zeichnen (wärend der selektion) einen Namen auf den Stack. Ich persönlich würde es nicht mit in die Liste packen.

PS: Ob die LoadNamesaufrufe so aus einer DL klappen muss ich gestehen habe ich bisher noch nie ausprobiert. Da die Liste ja im Rendermode erstellt wird. Keine Ahnung ob das geht oder nicht. Würde aber mal darauf tippen, dass ja.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 29, 2007 08:10 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Danke wieder einmal an Lossy eX!

Ich hatte das glPushName(0); dummerweise in meinem Quellcode auskommentiert gehabt. Ich es jetzt wieder reingenommen und sieh an, es funktioniert!

Also es klappt auch so, wie ich es gepostet hab.


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: Bing [Bot] 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]