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

Aktuelle Zeit: Mi Jul 30, 2025 07:47

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Selection liefert immer Werte
BeitragVerfasst: Sa Sep 04, 2004 23:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Feb 21, 2004 14:05
Beiträge: 17
Hi,
schon hab ich mein nächstes Problem :roll:
Ich habe 4 Viewports auf einem RenderingContext und rendere auf jeden die gleiche Szene, nur aus verschiedenen Perpektiven, wenn ich jetzt die Selection durchlaufen lasse, liefert sie erstens immer 3 Treffer, obwohl ich nur 2 Objekte auf dem Namestack habe und zweitens liefert sie diese Treffer _immer_ egal wohin ich klicke.
Die Selection-Funktion hab ich größtenteils aus dem Tutorial von dieser Site geklaut:

Code:
  1. function TViewPort.Select(ax, ay: integer): integer;
  2. var  Buffer: array[0..256] of GLUInt;
  3.      Viewport: TGLVectori4;
  4.      HitCount,i: Integer;
  5.      Z_Value: GLUInt;
  6.      Hit: integer;
  7. begin
  8.   glScissor(x,y,Width,height);
  9.   glViewport(x,y,Width,Height);
  10.   viewport[0] := x;
  11.   viewport[1] := y;
  12.   viewport[2] := Width;
  13.   viewport[3] := Height;
  14.  
  15.   glSelectBuffer(256, @Buffer);
  16.   glRenderMode(GL_SELECT);
  17.   glMatrixMode(GL_PROJECTION);
  18.   glPushMatrix;
  19.   glLoadIdentity;
  20.  
  21.   gluPickMatrix(ax, Viewport[3]-ay, 1.0, 1.0, viewport);
  22.  
  23.   RenderScene;
  24.   glmatrixmode(gl_projection);
  25.   glPopMatrix;
  26.  
  27.   HitCount := glRenderMode(GL_RENDER);
  28.  
  29.   Hit := -1;
  30.   Z_Value := High(GLUInt);
  31.   for i := 0 to HitCount-1 do
  32.     if Buffer[(i*4)+1] < Z_Value then
  33.       begin
  34.         Hit := Buffer[(i*4)+3];
  35.         Z_Value := Buffer[(i*4)+1];
  36.       end;
  37.  
  38.   Result := Hit;
  39. end;


Unter RenderScene mach ich folgendes:
eventuelle Tasten mittels GetAsyncKeyState zur kamerasteuerung abfragen
glScissor und glViewport setzen
Kamera setzen
2 Displaylisten und ein paar andere Sachen rendern
und das alles natürlich schön in den richtigen MatrixModes

Ich hoffe jemand findet meinen fehler

mfg
Alphamoose


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 05, 2004 12:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Spontan fallen mir da nur zwei Fehlerquellen ein :
- Falscher RC aktiv
- Du setzt in RenderScene die Projektionsmatrix neu, was nicht passieren darf.

Ansonsten sag mal was in ax bzw. ay landet. Die Mauskoordinaten müssen ja relativ zum Ursprung des jeweiligen Viewport-Panels (oder was du nimmst) sein.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 05, 2004 12:53 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Feb 21, 2004 14:05
Beiträge: 17
Son of Satan hat geschrieben:
Falscher RC aktiv

Das kann nicht sein, ich hab nur einen :)

Son of Satan hat geschrieben:
Du setzt in RenderScene die Projektionsmatrix neu, was nicht passieren darf.

Meinst du mit glMatrixMode(GL_PROJECTION)? Das könnte der Fehler sein...

Son of Satan hat geschrieben:
Ansonsten sag mal was in ax bzw. ay landet. Die Mauskoordinaten müssen ja relativ zum Ursprung des jeweiligen Viewport-Panels (oder was du nimmst) sein.

ax und ay ist die Mausposition, die mir OnMouseDown des Viewport-Panels ausspuckt, ich denke, die dürften richtig sein...

Naja werd mal ein bissal rumprobieren :)

mfg
Alphamoose


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 05, 2004 13:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn du die Projektionsmatrix in RenderScene veränderst, liegt dein Problem definitiv dort. In deiner Selektion erstellst du dir ja ne Pickingmatrix, die auf die Mausposition zentriert und nur sehr klein ist. Wenn du dann wieder eine Projektionsmatrix in RenderScene setzen tust, wird diese Pickingmatrix natürlich verworfen und die Selektion kann dann nicht mehr funktionieren.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 05, 2004 13:20 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Feb 21, 2004 14:05
Beiträge: 17
Hm OK,
ich hab jetz die RenderScene mal direkt in die Select-Funktion geschrieben um so viel wie möglich weglassen zu können, jetz bekomm ich aber gar keine Treffer mehr :roll:

Vielleicht hab ich auch einen Fehler beim Initialisieren des Namestacks, das hab ich nicht so ganz verstanden:
Code:
  1. procedure CreateDisplayList;
  2. var i: integer;
  3. begin
  4.   if DisplayList = 0 then
  5.     begin
  6.       i := 1;
  7.       while glIsList(i) do
  8.         inc(i);
  9.       DisplayList := i;
  10.     end;
  11.  
  12.   glNewList(DisplayList, GL_COMPILE);    
  13.     glInitNames;
  14.     glPushName(0);
  15.     glLoadName(DisplayList);
  16.  
  17.     glBegin(GL_TRIANGLE_STRIP);
  18.       .........
  19.     glEnd();    
  20.   glEndList();
  21. end;
  22.  


Den muss ich doch bei jedem Renderaufruf wieder initialisieren oder hab ich das falsch verstanden?

mfg
Alphamoose


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 05, 2004 13:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das hier :
Code:
  1. glInitNames;
  2. glPushName(0);

initialisiert den Namestack. Allerdings darf man das nur EINMAL am Anfang des Renderns machen, und nicht vor dem Rendern eines jeden Objektes.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 06, 2004 12:17 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Feb 21, 2004 14:05
Beiträge: 17
Hm es funktioniert immer noch nicht, nur wenn ich nahe ranzoome scheint es an bestimmten Stellen zu funktionieren, aber anscheinend auch nur ganz zufällig, die mit der gerenderten Ansicht nix zu tun haben.
Vielleicht is ja doch noch ein Fehler drin :cry:

Code:
  1. function TViewPort.Select(ax, ay: integer): integer;
  2. var  Buffer: array[0..256] of GLUInt;
  3.      Viewport: TGLVectori4;
  4.      HitCount,i: Integer;
  5.      Z_Value: GLUInt;
  6.      Hit: integer;
  7. begin
  8.   glScissor(x,y,Width,height);
  9.   glViewport(x,y,Width,Height);
  10.   viewport[0] := x;
  11.   viewport[1] := y;
  12.   viewport[2] := Width;
  13.   viewport[3] := Height;
  14.  
  15.   glSelectBuffer(256, @Buffer);
  16.   glRenderMode(GL_SELECT);
  17.   glMatrixMode(GL_PROJECTION);
  18.   glPushMatrix;
  19.   glLoadIdentity;
  20.  
  21.   gluPickMatrix(ax, Viewport[3]-ay, 1.0, 1.0, viewport);
  22.  
  23.   case ViewStatus of
  24.     vsPerspective:
  25.       begin
  26.         gluPerspective(3000/cZoom,Width/Height,1,100);
  27.         glMatrixMode(GL_MODELVIEW);
  28.         glLoadIdentity;
  29.         gluLookAt(cPos[0],cPos[1],cPos[2],
  30.                   cPos[0]+cLocalZ[0],cPos[1]+cLocalZ[1],cPos[2]-cLocalZ[2],
  31.                   cLocalY[0],cLocalY[1],cLocalY[2]);
  32.         glRotatef(Rot.Y*100,1,0,0);
  33.         glRotatef(Rot.X*100,0,1,0);
  34.       end;
  35.     vsFront:
  36.       begin
  37.         glOrtho(-Width/cZoom,Width/cZoom,-Height/cZoom,Height/cZoom,Z_NEAR,Z_FAR);
  38.         glMatrixMode(GL_MODELVIEW);
  39.         glLoadIdentity;
  40.         gluLookAt(cPos[0],cPos[1],cPos[2],
  41.                   cPos[0]+cLocalZ[0],cPos[1]+cLocalZ[1],cPos[2]-cLocalZ[2],
  42.                   cLocalY[0],cLocalY[1],cLocalY[2]);
  43.         glTranslatef(Rot.X,-Rot.Y,0);
  44.       end;
  45.     vsTop:
  46.       begin
  47.         glOrtho(-Width/cZoom,Width/cZoom,-Height/cZoom,Height/cZoom,Z_NEAR,Z_FAR);
  48.         glMatrixMode(GL_MODELVIEW);
  49.         glLoadIdentity;
  50.         gluLookAt(cPos[0],cPos[1],cPos[2],
  51.                   cPos[0]+cLocalZ[0],cPos[1]+cLocalZ[1],cPos[2]-cLocalZ[2],
  52.                   cLocalY[0],cLocalY[1],cLocalY[2]);
  53.         glTranslatef(Rot.X,0,-Rot.Y);
  54.       end;
  55.     vsSide:
  56.       begin
  57.         glOrtho(-Width/cZoom,Width/cZoom,-Height/cZoom,Height/cZoom,Z_NEAR,Z_FAR);
  58.         glMatrixMode(GL_MODELVIEW);
  59.         glLoadIdentity;
  60.         gluLookAt(cPos[0],cPos[1],cPos[2],
  61.                   cPos[0]+cLocalZ[0],cPos[1]+cLocalZ[1],cPos[2]-cLocalZ[2],
  62.                   cLocalY[0],cLocalY[1],cLocalY[2]);
  63.         glTranslatef(0,-Rot.Y,Rot.X);
  64.       end;
  65.   end;
  66.   glInitNames();
  67.   glPushName(0);
  68.   glCallList(DisplayList1);
  69.   glCallList(DisplayList2);
  70.  
  71.   glPopMatrix;
  72.  
  73.   HitCount := glRenderMode(GL_RENDER);
  74.  
  75.   Hit := -1;
  76.   Z_Value := High(GLUInt);
  77.   for i := 0 to HitCount-1 do
  78.     if Buffer[(i*4)+1] < Z_Value then
  79.       begin
  80.         Hit := Buffer[(i*4)+3];
  81.         Z_Value := Buffer[(i*4)+1];
  82.       end;
  83.  
  84.   Result := Hit;
  85. end;

Zur Erklärung:
cPos ist die Kameraposition, cLocal sind die lokalen Koordinatenachsen der Kamera
Rot.X,Rot.Y sind die Verschiebungen bzw. Drehungen die ich mit der Maus steuere

Die DisplayListen sehen folgendermaßen aus:
Code:
  1. procedure CreateDisplayList;
  2. var i: integer;
  3. begin
  4.   if DisplayList = 0 then
  5.     begin
  6.       i := 1;
  7.       while glIsList(i) do
  8.         inc(i);
  9.       DisplayList := i;
  10.     end;
  11.  
  12.   glNewList(DisplayList, GL_COMPILE);    
  13.     glLoadName(DisplayList);
  14.  
  15.     glBegin(GL_TRIANGLE_STRIP);
  16.        ..............
  17.     glEnd();    
  18.  
  19.   glEndList();
  20. end;


Sorry, das ich euch so beanspruche (vor allem Dich, Son of Satan Bild ), aber ich finde nichts, was daran schuld sein könnte :cry:

mfg
Alphamoose


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 06, 2004 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ob das jetzt zum Fehler führt (der Code sieht i.O.) aus kann ich nicht direkt sagen, aber du machst ein fehlerhaftes glPopMatrix; (vor HitCount := ...). Du hast oben deine Projektionsmatrix auf den Stack gelegt, willst aber unten mit dem glPopMatrix eine Modelansichtsmatrix (da du ja noch in GL_MODELVIEW bist) holen, was im Endeffekt zu nem Stackunterlauf führt, und evtl. dein Problem sein könnte. Du willst dort sicher die Projektionsmatrix die du oben auf den Stack gelegt hast wieder davon runterholen, also musst du auch vor dem glPopMatrix wieder in den korrekten Matrizenmodus schalten.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 06, 2004 15:01 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Feb 21, 2004 14:05
Beiträge: 17
AAAAH ich hab den Fehler gefunden, er liegt in gluPickMatrix. Ich habe nicht darauf geachtet, dass meine 4 Viewports logischerweise nicht die größe des ganzen RCs haben sondern nur ein Viertel davon, daher muss ich schreiben gluPickMatrix(ax,y+Height+Top-ay,1,1,viewport) :oops:
Ich weiß, solche Dummheit gehört bestraft, aber bitte net hauen...

Trotzdem vielen Dank für die Tips Son of Satan Bild

mfg
Alphamoose


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


Wer ist online?

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