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

Aktuelle Zeit: Fr Jul 18, 2025 05:02

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



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Picking nach Rotation
BeitragVerfasst: So Mai 08, 2005 19:28 
Offline
DGL Member

Registriert: Di Mai 03, 2005 15:04
Beiträge: 1
Hallo,

ich hadere seit einigen Tagen mit einem Problem, dessen Lösung evt. ganz einfach ist. Vielleicht kann mir jemand einen Hinweis oder Tip geben.

Ich möchte in einer Szene Objekte per Standard-Picking (gluPickMatrix) ermitteln. Dies funktioniert soweit einwandfrei, bis auf eine Ausnahme: Ich habe in der Szene Linien (erzeugt mit GL_LINE_STRIP) und Pyramiden als Knotenpunkte (erzeugt mit GL_TRINAGLES + GL_QUADS). Alles funktioniert einwandfrei, bis ich die Szene per Maus rotiere. Dann kann ich zwar noch alle Linien korrekt picken, aber die Pyramiden nicht mehr. Ich habe sämtliche Tutorials sowie eventuelle Forumseinträge danach durchsucht, konnte aber keinen Fehler finden. Nun hoffe ich auf euch :)

Hier die relevanten Code-Teile.

Das Picking:

Code:
  1.  
  2. function TMainForm.nodePicker(xs, ys: Integer): integer;
  3. var
  4.   buffer: array[0..256] of GLUInt;
  5.   vport: TVector4i;
  6.   hits, i: Integer;
  7.   z_value: GLUInt;
  8.   best_hit: GLUInt;
  9. begin
  10.   glGetIntegerv(GL_VIEWPORT, @vport);      //Die Sicht speichern
  11.   glSelectBuffer(256, @buffer);                               //Den Puffer zuordnen
  12.   glRenderMode(GL_SELECT);                              //In den Selectionsmodus schalten
  13.   glMatrixMode(GL_PROJECTION);                //In den Projektionsmodus
  14.   glPushMatrix;                                        //Um unsere Matrix zu sichern
  15.   glLoadIdentity;                                      //Und dieselbige wieder zurückzusetzen
  16.  
  17.   gluPickMatrix(xs, vport[3]-ys, 2.0, 2.0, vport);
  18.   gluPerspective(45.0, PanelMain.ClientWidth/PanelMain.ClientHeight, NearClipping, FarClipping);
  19.  
  20.   drawObjects(CBDrawMode.ItemIndex);                                   //Die Szene zeichnen
  21.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  22.   glPopMatrix;                                          //um unsere alte Matrix wiederherzustellen
  23.  
  24.   hits := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  25.  
  26.   best_hit := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  27.   z_value := High(GLUInt);                     //Höchsten Z - Wert
  28.  
  29.   for i := 0 to hits-1 do begin
  30.     if buffer[(i*4)+1] < z_value then begin
  31.       best_hit := buffer[(i*4)+3];
  32.       z_value := buffer[(i*4)+1];
  33.     end;
  34.   end;
  35.  
  36.   Result := best_hit;
  37. end;
  38.  


Das Zeichnen der Linien (aus einem Array heraus, aber egal):

Code:
  1.  
  2.     for z := Low(pdata) to High(pdata) do begin
  3.       for y := Low(pdata[z]) to High(pdata[z]) do begin
  4.         Inc(node_counter);
  5.         glLoadName(node_counter);
  6.  
  7.         if picked_object = node_counter then glColor3f(1.0, 0.0, 0.0)
  8.         else glColor3f(0.0, 0.0, 1.0);
  9.  
  10.         glBegin(GL_LINE_STRIP);
  11.         for x := Low(pdata[z][y]) to High(pdata[z][y]) do begin
  12.           glVertex3f(pdata[z][y][x][0], pdata[z][y][x][1], pdata[z][y][x][2]);
  13.         end;
  14.         glEnd;
  15.       end;
  16.     end;
  17.  


Das Zeichnen der Knotenpunkte:

Code:
  1.  
  2.     for z := Low(pdata) to High(pdata) do begin
  3.       for y := Low(pdata[z]) to High(pdata[z]) do begin
  4.         for x := Low(pdata[z][y]) to High(pdata[z][y]) do begin
  5.           glPushMatrix;
  6.             glTranslatef(pdata[z][y][x][0], pdata[z][y][x][1], pdata[z][y][x][2]);
  7.  
  8.             Inc(node_counter);
  9.             glLoadName(node_counter);
  10.  
  11.             if picked_object = node_counter then glColor3f(1.0, 0.0, 0.0)
  12.             else glColor3f(0.0, 0.0, 1.0);
  13.  
  14.             drawPyramid;
  15.           glPopMatrix;
  16.         end;
  17.       end;
  18.     end;
  19.  


Die Prozedure drawPyramid sieht so aus:

Code:
  1.  
  2. procedure drawPyramid;
  3. begin
  4.   glBegin(GL_TRIANGLES);
  5.     glVertex3f(-1.0, -1.0, 1.0);
  6.     glVertex3f(1.0, -1.0, 1.0);
  7.     glVertex3f(0.0, 1.0, 0.0);
  8.  
  9.     glVertex3f(1.0, -1.0, -1.0);
  10.     glVertex3f(-1.0, -1.0, -1.0);
  11.     glVertex3f(0.0, 1.0, 0.0);
  12.  
  13.     glVertex3f(-1.0, -1.0, 1.0);
  14.     glVertex3f(0.0, 1.0, 0.0);
  15.     glVertex3f(-1.0, -1.0, -1.0);
  16.  
  17.     glVertex3f(1.0, -1.0, 1.0);
  18.     glVertex3f(1.0, -1.0, -1.0);
  19.     glVertex3f(0.0, 1.0, 0.0);
  20.   glEnd;
  21.  
  22.   glBegin(GL_QUADS);
  23.     glVertex3f(-1.0, -1.0, -1.0);
  24.     glVertex3f(1.0, -1.0, -1.0);
  25.     glVertex3f(1.0, -1.0, 1.0);
  26.     glVertex3f(-1.0, -1.0, 1.0);
  27.   glEnd;
  28. end;
  29.  


Das Drehen der Szene mit der Maus (linke Maustaste):

Code:
  1.  
  2. procedure TMainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  3.   Y: Integer);
  4. begin
  5.   if MouseCapture then
  6.   begin
  7.     // linke Maustaste gedrückt
  8.     if mouseCapturedLeft then begin
  9.       YRotation := YRotation - ((MouseX - X) div 2);
  10.       XRotation := XRotation - ((MouseY - Y) div 2);
  11.     end
  12.     // rechte Maustaste gedrückt
  13.     else if mouseCapturedRight then begin
  14.       camOffsetX := camOffsetX - (((MouseX - X) div 2) / 5);
  15.       camOffsetY := camOffsetY + (((MouseY - Y) div 2) / 5);
  16.       glTranslatef(camOffsetX, camOffsetY, camOffsetZ);
  17.     end;
  18.  
  19.     MouseX := X;
  20.     MouseY := Y;
  21.   end;
  22. end;
  23.  


XRotation und YRotation werden vor dem Zeichnen der Szene benutzt:

Code:
  1.  
  2.   glMatrixMode(GL_MODELVIEW);
  3.   glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  4.   glLoadIdentity;
  5.  
  6.   // Kamerabewegung
  7.   glTranslatef(camOffsetX, camOffsetY, camOffsetZ);
  8.   glRotatef(XRotation, 1, 0, 0);
  9.   glRotatef(YRotation, 0, 1, 0);
  10.  
  11.   // Szene generieren
  12.   drawObjects;
  13.  



So, ich hoffe ich hab alles.
Ich wäre euch sehr dankbar, wenn mir jemand helfen könnte. Wie gesagt: Vor der Rotation mit der linken Maus geht alles wunderbar, auch nach Zoom mit Mausrad und Translation mit rechter Maustaste. Erst nach der Rotation sind die Knotenpunkte nur noch verschoben pickbar, die Linien funktionieren nach wie vor korrekt.

Danke! :)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 23 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 ]