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

Aktuelle Zeit: Do Jul 10, 2025 08:49

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Distanzprobleme bei Selektion
BeitragVerfasst: So Dez 16, 2007 15:36 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

ich hab grad ein ganz doofes Problem: Ich habe ein in verschiedene Viewports unterteiltes Fenster (1 perspektiv, 3 orthogonal). Jetzt will ich im perspektivischen Fenster Selektion reallisieren. Es funktioniert auch, aber nur, wenn man ganz nah am Quader oder innen drin ist! Hat jemand eine Idee, woran das liegen könnte?

Meine Source für das Rendern (Width=5, Height=5, Depth=10):
Code:
  1.  
  2.   glMatrixMode(GL_PROJECTION);                                    
  3.   glLoadIdentity;
  4.   glViewport(0, Surface.Height div 2, Surface.width div 2, Surface.Height div 2);
  5.   gluPerspective(45.0, Surface.Width/Surface.Height, 0.01, 1000);
  6.   glMatrixMode(GL_MODELVIEW);
  7.   glClearColor(0.0, 0.0, 0.0, 0.0);
  8.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  9.   glEnable(GL_TEXTURE_2D);
  10.   glLoadIdentity;
  11.   glRotatef(data3d.turn.x, 1, 0, 0);
  12.   glRotatef(data3d.turn.y, 0, 1, 0);
  13.   glRotatef(data3d.turn.z, 0, 0, 1);
  14.   glTranslatef(data3d.pos.x, data3d.pos.y, data3d.pos.z);
  15.   FWorld.Render;
  16.  
  17. procedure TWorld.Render;
  18. procedure GPoint(s, t, x, y, z: GLUInt);
  19. begin
  20.   glTexCoord2f(s, t);
  21.   glVertex3f(x, y, z);
  22. end;
  23. begin
  24. glBegin(GL_QUADS);
  25.           //hinten
  26.           GPoint(1, 1, 0, 0, 0);
  27.           GPoint(0, 1, Width, 0, 0);
  28.           GPoint(0, 0, Width, Height, 0);
  29.           GPoint(1, 0, 0, Height, 0);
  30.           //links
  31.           GPoint(1, 1, 0, 0, Depth);
  32.           GPoint(0, 1, 0, 0, 0);
  33.           GPoint(0, 0, 0, Height, 0);
  34.           GPoint(1, 0, 0, Height, Depth);
  35.           //unten
  36.           GPoint(1, 1, Width, 0, 0);
  37.           GPoint(0, 1, 0, 0, 0);
  38.           GPoint(0, 0, 0, 0, Depth);
  39.           GPoint(1, 0, Width, 0, Depth);
  40.           //vorne
  41.           GPoint(1, 0, Width, Height, Depth);
  42.           GPoint(0, 0, 0, Height, Depth);
  43.           GPoint(0, 1, 0, 0, Depth);
  44.           GPoint(1, 1, Width, 0, Depth);
  45.           //rechts
  46.           GPoint(0, 1, Width, 0, Depth);
  47.           GPoint(1, 1, Width, 0, 0);
  48.           GPoint(1, 0, Width, Height, 0);
  49.           GPoint(0, 0, Width, Height, Depth);
  50.           //oben
  51.           GPoint(0, 1, 0, Height, Depth);
  52.           GPoint(1, 1, Width, Height, Depth);
  53.           GPoint(1, 0, Width, Height, 0);
  54.           GPoint(0, 0, 0, Height, 0);
  55.         glEnd;
  56.    end;
  57.  


und meine Source für die Selektion:
Code:
  1. function TMainForm.SelObj(x, y: Integer): Integer;
  2. var buffer: array[0..512] of GLUInt;
  3.     viewport: TglVectori4;
  4.     treffer, i: Integer;
  5.     getroffen, Z_Wert: GLUInt;
  6. begin
  7.   result := -1;
  8.   glViewport(0, Surface.Height div 2, Surface.width div 2, Surface.Height div 2);
  9.   glGetIntegerv(GL_VIEWPORT, @Viewport);
  10.   glSelectBuffer(512, @buffer);
  11.   glDisable(GL_CULL_FACE);
  12.   glRenderMode(GL_SELECT);
  13.   glMatrixMode(GL_PROJECTION);
  14.   glPushMatrix;
  15.   glLoadIdentity;
  16.   gluPickMatrix(x, Viewport[3]-y, 1.0, 1.0, viewport);
  17.   gluPerspective(45.0, Surface.Width/Surface.Height, 0.01, 10000)
  18.   glMatrixMode(GL_MODELVIEW);
  19.   glLoadIdentity;
  20.   glRotatef(data3d.turn.x, 1, 0, 0);
  21.   glRotatef(data3d.turn.y, 0, 1, 0);
  22.   glRotatef(data3d.turn.z, 0, 0, 1);
  23.   glTranslatef(data3d.pos.x, data3d.pos.y, data3d.pos.z);
  24.   FWorld.Render(true, false);
  25.   glScalef(-1, -1, -1);
  26.   FWorld.Render(true, false);
  27.   glLoadIdentity;
  28.   glMatrixMode(GL_PROJECTION);
  29.   glPopMatrix;
  30.   treffer := glRenderMode(GL_RENDER);
  31.   getroffen := High(GLUInt);
  32.   Z_Wert := High(GLUInt);
  33.   for i := 0 to Treffer-1 do
  34.     if buffer[(i*4)+1] < Z_Wert then
  35.     begin
  36.       getroffen       := Buffer[(i*4)+3];
  37.       Z_Wert := buffer[(i*4)+1];
  38.     end;
  39.   if getroffen = High(GLUInt) then
  40.     result := -1
  41.   else
  42.     result := getroffen;
  43. end;
  44.  


Also wenn man zu weit weg ist, ist treffer=0. Schonmal vielen Dank im Voraus fü Hilfe!

Gruß Joni.


Zuletzt geändert von Joni am Mo Dez 17, 2007 16:13, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 16, 2007 23:48 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Probleme mit der far-clipping-plane?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 17, 2007 07:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ist der Code oben die FWorld.Render? Wenn ja, dann solltest du das Setzen der Perspektive auslagern oder deaktivieren können. Denn während der Selektion setzt du die PickMatrix und anschließend die normale Perspektive. In der FWorld.Render überschreibst du aber die Projektion vollständig. Das darfst du nicht tun. Während dem Zeichnen muss die gesetzte Projektion erhalten bleiben.

PS: Abgesehen davon sollte heutzutage eher eine Farbselektion gemacht werden. Denn die klassische Selektion ist nicht mehr zeitgemäß. Und auch weil die Selektion einfach zu empfindlich ist. Siehe dein Problem.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 17, 2007 16:22 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

das hier passiert, wenn man zu viel wegkürzt :(. Ich habs mal entsprechend geändert. Zur Farbselektion: Kommen die Farben denn auch 100%ig so an, wie man sie einspeist (also ob der beispielsweise zwischen 0,0039 (1/255) und 0,0078 (2/255) unterscheidet)? Is wahrscheinlich ne doofe Frage, aber ich würds schon gern wissen.

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 17, 2007 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich mach in meinen aktuellen Sachen auch nur noch Farbselektion (da die alte Selektion z.b mit NVidia-Treibern nach Rel-90 extrem langsam ist), und ja, die Farben kommen unter Verwendung eines 32-Bit Farbpuffers beim Auslesen so zurück wie man sie setzt. Kleinere Probleme (je nach Szenario) bekommt man jedoch evtl. mit aktivierter Kantenglättung, da dann naturgemäß an den Objektkanten leicht abgeänderte Farbwerte vorliegen. Hier sollte man dann die Abstände zwischen zwei Selektionsfarben etwas erhöhen und eine Toleranzgrenze einbauen.

P.S. : Man kann auch direkt Bytewerte für die Farbe übergeben, mit glColor3b z.B.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 17, 2007 20:57 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

danke für die Tipps, ich werde versuchen, das mittels Farbselektion zu implementieren. Nochmal vielen Dank an alle, die geholfen haben.

Gruß Joni.


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 » 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.009s | 16 Queries | GZIP : On ]