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

Aktuelle Zeit: Fr Jul 18, 2025 15:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mal wieder Probs mit Selection
BeitragVerfasst: Do Feb 23, 2006 16:13 
Offline
DGL Member

Registriert: Do Feb 23, 2006 16:02
Beiträge: 2
Also ich ein Problem mit der Selection.

Ich Hab mich durch das Tutorial gehangelt und die Selections Rutine schmeist mir auch den Namen der Angklickten Primitives entgegen. DAs funktioniert soweit ganz gut aber ab und zu (ca. bei jedem 5 - 7 mal) behauptet das auf nix geklickt wurde (Rückgabe Wert also -1) obwohl ein Quad selectiert wurde. Zudem springt der sichtbare ausschnitt. Ich hab keine Ahnung woran das liegt.

Hier Die Selections Procedur:
Code:
  1. function TForm1.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.   glInitNames;
  15.   glPushName(0);
  16.   glPushMatrix;                               //Um unsere Matrix zu sichern
  17.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  18.  
  19.   gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  20.  
  21.   Form1.RenderMap;                                     //Die Szene zeichnen
  22.  
  23.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  24.   glPopMatrix;                                //und unsere alte Matrix wiederherzustellen
  25.  
  26.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  27.  
  28.   Getroffen := High(TGLUInt);                  //Höchsten möglichen Wert annehmen
  29.   Z_Wert    := High(TGLUInt);                  //Höchsten Z - Wert
  30.  
  31.   for i := 0 to Treffer-1 do
  32.     if Puffer[(i*4)+1] < Z_Wert then
  33.     begin
  34.       getroffen       := Puffer[(i*4)+3];
  35.       Z_Wert          := Puffer[(i*4)+1];
  36.     end;
  37.  
  38.   if getroffen=High(GLUInt)
  39.     then Result := -1
  40.     else Result := getroffen;
  41.  
  42. end;


Und hier die Render Procedure:
Code:
  1. procedure TForm1.RenderMap;
  2. var
  3.    i,a,gname : integer;
  4.  
  5. begin
  6.   wglMakeCurrent(DC,RC);
  7.  
  8.   glViewport(0,0,Clientwidth,Clientheight);
  9.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  10.  
  11.   gluPerspective(45, (ClientWidth-(Panel1.Width/2))/ClientHeight,  NearClipping, FarClipping);
  12.   glTranslatef(0, 0, -5);
  13.  
  14.   gname := 0;
  15.   glInitNames;
  16.   glPushName(1);
  17.  
  18.   for i := 0 to Editor.MInfo.xlength-1 do
  19.       for a:= 0 to Editor.MInfo.ylength-1 do begin
  20.           glLoadName(gname);
  21.           gname := gname +1;
  22.  
  23.           if High(Editor.FType) > 1 then
  24.              glBindTexture(GL_TEXTURE_2D,Editor.FType[0].texture);
  25.           glBegin(GL_Quads);
  26.              glTexCoord2f(0,0);glVertex3f(i,a,0);
  27.              glTexCoord2f(1,0);glVertex3f(i+1,a,0);
  28.              glTexCoord2f(1,1);glVertex3f(i+1,a+1,0);
  29.              glTexCoord2f(0,1);glVertex3f(i,a+1,0);
  30.           glEnd;
  31.       end;
  32.  
  33.   glMatrixMode(GL_MODELVIEW);
  34.   SwapBuffers(DC);
  35.  
  36. end;


Vieleicht hatte jemand ja schon ein Ähnliches Problem. Vielen Dank im Vorraus für die Hilfe

// edit Lossy: Code durch Pascaltags ersetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 18:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du darfst den ViewPort und die Perspektive nicht in der DrawMap setzen. Wenn du so etwas wärend der Selektion machst zerstörst du die Matrix und dann bekommst du keine sinnvolle Selektion mehr.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 22:00 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Eventuell sollte man ans Ende des Tutorial Selection bzw. des Selektion Artikels mal eine Checkliste machen mit Typischen Fehlern.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 00:02 
Offline
DGL Member

Registriert: Do Feb 23, 2006 16:02
Beiträge: 2
Erst mal vielen Dank für die Hilfe!!

Aber, an glViewport und an glPerspectiv kanns net liegen hab das mal ausprobiert. Die Selection als solche funktioniert ja auch. Das Problem ist nur, dass ab und zu mal ein falscher Ert zurückgegeben wird. Dann Springt der gerade gezeigte Ausschnitt auf den Ausgang zurück. Die gezeichnete Szene wird mittels translate verschoben. Die Selection funktioniert ca. in 80% der Fälle machnmalm wird aber wie schon gesagt die ganze gezeigte Szene verrückt. Hat das vielleicht was damit zutun das ich zwei Renderkontexte verwende.

trotzdem vielen Dank


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 08:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe auch gerade mal für deinen Code die Pascal Tags verwendet.

Das Hauptproblem an der Selektion ist, dass diese extrem empfindlich auf Veränderungen reagiert und das man nicht sieht wie sie sich verhält. Also ein reiner Blindflug.

Okay. Wenn ich jetzt noch mal drüber schaue könntest du mit dem gluPerspective auch recht haben. Das muss ja auch nach gluPickMatrix aufgerufen werden. Wie das mit dem ViewPort aussieht weiß ich nicht. Den benutzt du ja auch für die PickMatrix. In der Regel bietet sich auch an die Perpektive und den ViewPort nur dann neu zu setzen, wenn der sich auch verändert hat. Also in einem OnResize des Forms oder so.

Dann mal zum Code. Bei dem glTranslatef(0, 0, -5). Du befindest dich dort eigentlich auf der ProjektionsMatrix. Da solltest du vorher auf die ModelViewMatrix wechseln. Das könnte es evtl auch schon gewesen sein. Deckt sich jedenfalls mit der letzten Beschreibung. So noch ohne Kaffee betrachtet.

Im Selection Artikel findest du im Rendercode ein bisschen Code zum Abfragen des Rendermodus. Das solltest du auch tun und dann entsprechend dein SwapBuffer weglassen. Wärend der Selektion wird nichts gerendert sondern in einen Feedbackbuffer geschrieben. Wenn du dann wechselst dann siehst du ein alten bzw. korruptes Bild. Das äußerst sich als kurzes Flackern oder so.

Flash: Ich weiß persönlich nicht was man da noch machen sollte. Der Code und die ganzen Beschreibungen sollten eigentlich alles abhandeln was möglich wäre.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 15:43 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Na halt nochmal draufhinweisen, dass die Perspektive in den durchläufen gleich sein muss, und das dieses und jenes nicht gemacht werden darf. EInfach nochmal ne kurze zusammenfassung in Tabelarischer form.

_________________
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  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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