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

Aktuelle Zeit: Di Jul 15, 2025 17:13

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
BeitragVerfasst: Mo Jan 24, 2005 19:33 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Ich hoffe, dass ich euch nicht langsam mit meinen Fragen (bzw. Problemen) auf den Wecker gehe.

Die Selection funktioniert net.
Des ausgewählte Feld ist immer zu weit rechts.
Woran könnte des liegen?

Und ein großes SORRY, dass ich euch wieder nerve! (;))


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 24, 2005 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Zitat:
Die Selection funktioniert net.
Des ausgewählte Feld ist immer zu weit rechts.

Kannst du des genauer spezifizieren?
Wenn ich raten dürfte, dann nähme ich mal an, das du meinst, das ein bisschen rechts von der eigentlichen Mausposition die Selektionausgelöst wird. Für diesen Fall wäre die Lösung einfach, du hast wahrscheinlich bei
Code:
  1. gluPerspective(90.0,800/600,1,8192);

verschiedene Werte (das 800/600 muss überall gleich sein, die anderen Werte sind (fast) wurscht) in Selektion und Rendering. Probiers mal aus und gib Bescheid :)

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 24, 2005 19:46 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
ne, sind beide des gleiche. Ich wollte ja erst nen Screenshot machen, aber der lässt ja den Mauszeiger weg.
Aber sieht ungefähr so aus

####################
#_______________________#
#_______________________#
#_______________________#
#____M__________S______#
#_______________________#
#_______________________#
#_______________________#
####################

# = Rand des Spielfeldes.
_ = Boden
M = Mauszeiger
S = Selected


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 24, 2005 19:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Bitte benutze die Suchfunktion des Forums. Es gibt diverse Threads in denen dieses Problem bereits ausgiebig diskutiert und auch gelöst wurde.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 24, 2005 20:07 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Sorry, echt.
Ich habe (mal wieder) Scheiße gebaut.
BIG BIG BIG BIG SORRY!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 03, 2005 18:41 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich kapere hier mal den Thread. Bei mir geht die selektion auch nicht. Folgende Infos kann ich zur verfügung stellen.

1. Der Inhalt des SelectionPuffers:
Code:
  1.  Puffer[4*i] = 1; (immer)
  2. Puffer[(4*i)+1] = 4060283773; (immer)
  3. Puffer[(4*i)+2] = 4060416353; (immer)
  4. Puffer[(4*i)+3] = i+1;
  5.  


Ich schreibe gerade einen HexMap Editor. Das tolle ist, selbst wenn ich auf ein Hexfeld klicke (ich guck direkt von oben auf die Karte) bekomme ich 23 Treffer zurückgeliefert. Lustig daran ist, dass die karte keinen doppelten Boden besitzt. Die Hexfelder haben eine Kantenlänge von 2OGLEinheiten und das Pickfenster hat eine Breite von 1 wie ihr gleich sehen werdet:

Meine Selectionfunktion: (1zu1 aus dem Tut von DCW_Mr_T)
Code:
  1. function TForm1.Selection(x,y : double) : integer;
  2. var Puffer                : array[0..256] of GLUInt;
  3.     ViewPort              : TGLVectori4;
  4.     Treffer,i             : integer;
  5.     Z_Wert                : GLUInt;
  6.     Getroffen             : GLUInt;
  7. begin
  8.      glGetIntegerv(GL_VIEWPORT, @viewport);
  9.      glSelectBuffer(256, @Puffer);
  10.  
  11.      glRenderMode(GL_SELECT);
  12.      glMatrixMode(GL_PROJECTION);
  13.      glPushMatrix;
  14.        glLoadIdentity;
  15.  
  16.        gluPickMatrix( x, viewport[3]-y, 1.0, 1.0, viewport);
  17.        gluPerspective(45.0, Panel1.Width/Panel1.Height, NearClipping, FarClipping);
  18.  
  19.        render;
  20.        glMatrixMode(GL_PROJECTION);
  21.      glPopMatrix;
  22.  
  23.      treffer := glRenderMode(GL_RENDER);
  24.  
  25.      Getroffen := High(GLUInt);
  26.      Z_Wert := High(GLUInt);
  27.      for i := 0 to Treffer-1 do
  28.      if Puffer[(i*4)+1] < Z_Wert then
  29.         begin
  30.           getroffen := Puffer[(i*4)+3];
  31.           Z_Wert    := Puffer[(i*4)+1];
  32.         end;
  33.      Result := getroffen;
  34. end;


So zeichne ich meine Karte:
Code:
  1. procedure TForm1.Render;
  2. var breite,hoehe : real;
  3.     i            : integer;
  4. begin
  5. //
  6.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7.  
  8.   glMatrixMode(GL_PROJECTION);
  9.   glLoadIdentity;
  10.   gluPerspective(45.0, Panel1.Width/Panel1.Height, NearClipping, FarClipping);
  11.  
  12.   if aktMap <> nil
  13.      then begin
  14.                breite := (4*a) + (aktMap.Width-1)*3*a;
  15.                hoehe  :=   d   + (aktMap.Height-1)*(0.5*d);
  16.           end
  17.      else begin
  18.                breite := 20;
  19.                hoehe  := 15;
  20.           end;
  21.  
  22.   glTranslatef(-breite/2, -hoehe/2, ScrollBar3.Position*(-3));
  23.   //Scrollbars einfließen lassen
  24.   glTranslatef(-Scrollbar1.Position/100 * breite,0,0);
  25.   glTranslatef(0,Scrollbar2.Position/100 * hoehe,0);
  26.  
  27.   glMatrixMode(GL_MODELVIEW);
  28.   glLoadIdentity;
  29.  
  30.   glInitNames;
  31.   glPushName(0);
  32.  
  33.   if aktMap <> nil
  34.      then begin
  35.                for i := 0 to aktMap.Tiles.count-1 do
  36.                    begin
  37.                      glLoadName(i+1);
  38.                      TMapField(aktMap.Tiles[i]).Render(0);
  39.                    end;
  40.           end
  41.      else begin
  42.             glBegin(GL_QUADS);
  43.               glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
  44.               glColor3f(0, 1, 0); glVertex3f(1, 0, 0);
  45.               glColor3f(0, 1, 0); glVertex3f(1, 1, 0);
  46.               glColor3f(0, 1, 0); glVertex3f(0, 1, 0);
  47.             glEnd;
  48.           end;
  49.  
  50.   SwapBuffers(DC);
  51. end;


Und damit ihr wisst wie die Selektion aufgerufen wird:

Code:
  1. procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  2.   Shift: TShiftState; X, Y: Integer);
  3. begin
  4.      aktField := selection(x,y);
  5.      if aktMap <> nil then
  6.         aktMap.ChangeFieldTyp(aktField,aktPinsel);
  7. end;


Also wie üblich die Frage: WAS MACH ICH FALSCH?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 03, 2005 20:52 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Noch keine Idee!? Hmmm...was könnt ich noch sagen... Die Selektion liefert mir immer "1" zurück. Nicht 0 und auch nicht -1. D.h. es liegt etwas auf dem Namestack und es wird auch etwas getroffen. Nur hab ich auf das Feld mit dem OpenGL-Namen "1" nicht geklickt. Der leigt ein gutes stück weit entfernt.

Habt ihr jetzt ne Idee?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 03, 2005 22:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mensch Leute...sagts ruhig wenn euch das zu Primitiv war...Ich habs rausgegrigt...man sollte das auch unbedingt mit ins Tutorial schreiben.

Was? Na folgendes:

Nachdem innerhalb der Slection-Routine in den Rendermodus "Select" gewechselt wurde und die Perspective initialisiert und gesetzt wurde darf innerhalb der eigentlichen renderprocedure nicht nocheinmal glLoadIdentity aufgerufen werden.

Bei mir hieß das konkret: Abhängig von glGet(GL_RENDER_MODE) wird der Block ab glMatrixMode bis gluPerspective(...) einfach übersprungen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
gut zu wissen *bookmark setzt*

vielleicht werd ich mich doch für den selectionmodus erwärmen.

_________________
Bild

"User Error. Replace User and hit Continue."


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 6 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 ]