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

Aktuelle Zeit: Fr Jul 18, 2025 21:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: *solved* Transformationen
BeitragVerfasst: Di Mär 27, 2007 09:03 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Ich habe hier im Forum schon einige Threads dazu gefunden, konnte aber mein Problem nicht lösen.

Ich habe eine Menge von dreidimensionalen Punkten (eine Punktwolke), die anhand ihrer Koordinaten gezeichnet werden. Anschließend soll eine Transformation hin zu dieser Punktwolke mittels glTranslate geschehen. Dazu berechne ich den Mittelpunkt und nehme diesen als Parameter. Das klappt auch.

Das Problem liegt jetzt darin, dass diese Punktwolke um ihren Mittelpunkt rotiert werden soll. Mit den glRotate aufrufen erreiche ich aber nur, dass sie um den Weltkoordinatenursprung rotiert wird.

Hier dazu die paintGL-Methode:

Code:
  1. void DisplayWidget::paintGL()
  2. {
  3.    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  4.    glMatrixMode(GL_MODELVIEW);
  5.    glLoadIdentity();
  6.    glPushMatrix();
  7.    glTranslatef(xT, yT, zT);
  8.    glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
  9.    glRotatef(yRot / 16.0, 0.0, 1.0, 0.0);
  10.    glRotatef(zRot / 16.0, 0.0, 0.0, 1.0);
  11.    glCallList(pointCloudObject);
  12.    glPopMatrix();
  13. }
  14.  


und hier makePointCloud:

Code:
  1.  
  2. GLuint DisplayWidget::makePointCloud(PointCloud *points)
  3.     // Get the range of the point cloud
  4.     float* range = points->getRange();
  5.     xT = range[0]+((range[1]-range[0])/2);
  6.     zT = range[2]+((range[3]-range[2])/2);
  7.     yT = -(range[4]+((range[5]-range[4])/2));
  8.  
  9.     GLuint list = glGenLists(1);
  10.     glNewList(list, GL_COMPILE);
  11.    
  12.     // displays the points
  13.     glBegin(GL_POINTS);
  14.     glPointSize(3);
  15.     glColor3f(1.0f, 1.0f, 1.0f);
  16.  
  17.     PointList pointList = points->getPointList();
  18.     PointList::iterator begin = pointList.begin();
  19.     for( ; begin!=pointList.end(); begin++) {
  20.         Point *p = *begin;
  21.         glVertex3f(p->x, -(p->z), p->y);
  22.     }
  23.     glEnd();
  24.  
  25.     glEndList(); // end of display list
  26.  
  27.     return list;
  28. }
  29.  


Vielen Dank für eure Antworten!


Zuletzt geändert von Hans-im-Glueck am Di Mär 27, 2007 11:26, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 27, 2007 09:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du musst dann dafür sorgen, dass dein Koordinatenursprung in der Mitte deiner Punktwolke liegt. Dazu kann ich nur nur das Tutorial Matrix2 ans herz legen. Aber folgendes sollte gehen.

1. Verschiebe deinen Koordinatenursprung so weit ins Bild
2. Setze die Rotation
3. Verschiebe die Koordinatenursprung so, dass der Rotationsmittelpunkt genau in der Mitte deiner Daten liegt.

Ein kleines Beispiel
Code:
  1.   // 1. in die Tiefe verschieben
  2.   glTranslatef(0, 0, -7.5);
  3.  
  4.   // 2. Rotieren
  5.   glRotatef(125, 0, 0, 1);
  6.  
  7.   // 3. zurückschieben, dass mein Quad zentriert zum Rotationspunkt liegt
  8.   glTranslatef(-0.5, -0.5, 0);
  9.  
  10.   glBegin(GL_QUADS);
  11.     glVertex3f(0, 1, 0);
  12.     glVertex3f(0, 0, 0);
  13.     glVertex3f(1, 0, 0);
  14.     glVertex3f(1, 1, 0);
  15.   glEnd;

Die Höhe habe ich jetzt außer acht gelassen aber das sollte ja dann ein leichtes sein.

PS: glPointSize innerhalb eines glBegin und glEnd Blockes aufzurufen ist nicht erlaubt. Du musst die Größe außerhalb setzen. Mag sein, dass der ein oder andere Treiber das trotzdem unterstützt aber besser ist besser. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 27, 2007 11:24 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Danke!

Mein Problem ist gelöst! Ich habe mir das Tutorial mindestens drei Mal durchlesen müssen und mit drei Stiften ein Koordinatensystem gebastelt, bis der Groschen endlich viel. Ich war von einem komplett falschen Ansatz ausgegangen.

Hier nochmal die Lösung:

Code:
  1.  
  2. // KOS in die Tiefe verschieben
  3. glTranslatef(0, 0, -10);
  4.  
  5. // KOS Rotieren
  6. glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
  7. glRotatef(yRot / 16.0, 0.0, 1.0, 0.0);
  8. glRotatef(zRot / 16.0, 0.0, 0.0, 1.0);
  9.  
  10. // KOS in den Mittelpunkt der Punktwolke setzten
  11. glTranslatef(-xT, -yT, -zT);
  12.  
  13.  


Vielen Dank an lossy eX!


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

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich gebe zu: bei den Tutorial hab ich mich auf die rotation des Koordinatensystem beschränkt. Vielleicht hätte ich noch ein Beispiel mit einem Objekt/Würfel machen sollen. Aber da man anscheinend mit nachdenken das Problem lösen kann, ists denk ich wieder Ok. ;)

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


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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