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

Aktuelle Zeit: Fr Jul 11, 2025 08:21

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: *solved* Koordinaten auslesen
BeitragVerfasst: Di Mär 27, 2007 15:42 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Ich habe in einem QGLWidget mehrere 3D-Objekte gezeichnet. Jetzt soll der Benutzer durch einen Mausklick das angeklickte Objekte entfernen können. Wenn ich die Mauskoordinaten auslese, erhalte ich jedoch nur den x- und y-Wert des QGLWidget.

Wie muss ich vorgehen, um an die Koordinaten des Objektes zu kommen. In einem Tutorial hab ich etwas über Selektion gelesen. Wäre das hier angebracht? Es kam mir auf den ersten Blick kompliziert vor.

Für eure Antworten bin ich sehr dankbar!


Zuletzt geändert von Hans-im-Glueck am Mi Mär 28, 2007 14:37, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 27, 2007 22:24 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Selektion ist auch kompliziert - aber genau das willst du hier machen.

Es gibt vertreter hier im Forum welche die standard Selektionsmethode von OGL nicht nutzen. Stattdessen wird selektion per FarbCode gemacht:

Beim OnClick rendert man 1x die komplette Szene ohne effekte (keine Beleuchtung, Flat-Shading, kein Blending, keine Texturen) und gibt jedem objekt eine eigene Farbe. Dann ließt man den Framebuffer an der Stelle aus wo geklickt wurde, und kann anhand der Farbe das Objekt identifizieren.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 28, 2007 00:16 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Das mit der Farbe würde vielleicht sogar passen. Ich habe mehrere Objekte, die alle eine unterschiedliche Farbe haben. Bisher sieht der Code so aus:

Die paint-Methode:
Code:
  1.  
  2. void DisplayWidget::paintGL()
  3. {
  4. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clears the buffer
  5. glMatrixMode(GL_MODELVIEW);
  6. glLoadIdentity(); // set the identity matrix
  7. glPushMatrix(); // push the current matrix stack
  8.  
  9. glTranslatef(0, 0, -10); //multiply the current matrix by a translation matrix
  10. glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
  11. glRotatef(yRot / 16.0, 0.0, 1.0, 0.0);
  12. glRotatef(zRot / 16.0, 0.0, 0.0, 1.0);
  13. glTranslatef(-xT, -yT, -zT);
  14.  
  15. glCallList(clusterObject);
  16.  
  17. glPopMatrix();
  18. } //paintGL
  19.  


und die makeCluster Methode:
Code:
  1.  
  2. GLuint DisplayWidget::makeCluster(ClusterList clusters)
  3. {
  4.     GLuint list = glGenLists(1); // allocates range number of contiguous display list indices
  5.     glNewList(list, GL_COMPILE); // create new display list
  6.  
  7.     ClusterList::iterator begin = clusters.begin();
  8.     for ( ; begin != clusters.end(); begin++) {
  9.         Cluster* currentCluster = *begin;
  10.         if (currentCluster->getId() > 1) { // don't paint the noise
  11.             PointList points = currentCluster->getPointList();
  12.  
  13.             glBegin(GL_POINTS);
  14.             glPointSize(3);
  15.             // a pseudo random color
  16.             int f1 = currentCluster->getPointList().size();
  17.             int f2 = 0.8973*f1*currentCluster->getId();
  18.             int f3 = f2/f1;
  19.  
  20.             glColor3f((f1%100)/110.0, (f2%100)/110.0, (f3%100)/110.0);
  21.  
  22.             for(int i = 0; i < points.size(); i++) {
  23.                 Point *p =  points.at(i);
  24.                 glVertex3f(p->x, -(p->z), p->y);
  25.             } //for
  26.             glEnd();
  27.         } //if
  28.     } //for   
  29.     glEndList(); // end of display list
  30.  
  31.     return list;
  32. } //makeCluster
  33.  


Wie könnte ich das jetzt am besten nutzen um die einzelnen Cluster mit einem Mausklick zu selektieren?
Code:
  1.  
Code:
  1.  


Zuletzt geändert von Hans-im-Glueck am Mi Mär 28, 2007 00:33, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 28, 2007 00:32 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Ich habe mir mal eine Lösung mit der Selektion von OpenGL überlegt.

mousePressEvent ruft eine Methode selectCluster() auf, die folgendermaßen aussieht:

selectCluster()
Code:
  1.  
  2. {
  3.     GLuint selectBuf[128];
  4.     GLint hits;
  5.     GLint viewport[4];
  6.  
  7.     glSelectBuffer(128, selectBuf);
  8.     //glRenderMode(GL_SELECT);
  9.  
  10.     glInitNames();
  11.     glPushName(0);
  12.  
  13.     glMatrixMode(GL_PROJECTION);
  14.     glPushMatrix();
  15.     glLoadIdentity();
  16.  
  17.     glGetIntegerv(GL_VIEWPORT, viewport);
  18.     gluPickMatrix((GLdouble) lastPos.x(), (GLdouble) viewport[3] - lastPos.y(), 20, 20, viewport);
  19.     glMatrixMode(GL_MODELVIEW);
  20.  
  21.     makeCluster(clusterList, GL_SELECT);
  22.  
  23.     // restoring the original projection matrix
  24.     glMatrixMode(GL_PROJECTION);
  25.  
  26.     glPopMatrix();
  27.     glMatrixMode(GL_MODELVIEW);
  28.     glFlush();
  29.    
  30.     // returning to normal rendering mode
  31.     hits = glRenderMode(GL_RENDER);
  32.    
  33.     // if there are hits process them
  34.     if (hits != 0)
  35.         processHits(hits,selectBuf);
  36. } //selectCluster
  37.  


makeCluster sieht folgendermassen aus:
Code:
  1.  
  2. makeCluster(ClusterList clusters, GLenum mode)
  3. {
  4.     unsigned name = 1;
  5.  
  6.     GLuint list = glGenLists(1); // allocates range number of contiguous display list indices
  7.     glNewList(list, GL_COMPILE); // create new display list
  8.  
  9.     ClusterList::iterator begin = clusters.begin();
  10.     for ( ; begin != clusters.end(); begin++) {
  11.         Cluster* currentCluster = *begin;
  12.         if (currentCluster->getId() > 1) { // don't paint the noise
  13.             PointList points = currentCluster->getPointList();
  14.  
  15.             if (mode == GL_SELECT) {
  16.                 glLoadName(name);
  17.             } //if
  18.  
  19.             glBegin(GL_POINTS);
  20.             glPointSize(3);
  21.             // a pseudo random color
  22.             int f1 = currentCluster->getPointList().size();
  23.             int f2 = 0.8973*f1*currentCluster->getId();
  24.             int f3 = f2/f1;
  25.  
  26.             glColor3f((f1%100)/110.0, (f2%100)/110.0, (f3%100)/110.0);
  27.  
  28.             for(int i = 0; i < points.size(); i++) {
  29.                 Point *p =  points.at(i);
  30.                 glVertex3f(p->x, -(p->z), p->y);
  31.             } //for
  32.             glEnd();
  33.             name++;
  34.         } //if
  35.     } //for   
  36.     glEndList(); // end of display list
  37.  
  38.     return list;
  39. } //makeCluster
  40.  


Die paint-Methode bleibt wie im oberen Eintrag.

Könnte das so hinhauen? Vielen Dank für eure Antworten![/quote]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 28, 2007 14:36 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Okay, ich hab das Problem gelöst.

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


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