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

Aktuelle Zeit: Mi Jul 16, 2025 07:02

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 Verschoben
BeitragVerfasst: Do Mär 10, 2005 15:56 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
Hallo,

So nach einer längeren Pause versuch ich mein 3D Schach doch zum laufen zu bringen ...
... doch leider hängst wie damals an der Selektion.

Normal sollte jedes der 8*8 Felder eine Zahl von 1 - 64 zurückgeben

Doch leider sieht das wie folgt aus (in der weißen Fläche, die ungefähr mit der wirklich Fläche überseinstimmt, bekommt man bei klick eine der zahlen 1-64)

1 Quadrat ist 1 x 1 OglEinheit Groß ... die Selection quetscht aber 8 verschiedene Selection Rückgaben auf 6 Felder
Bild

In den bisherigen Threads hab ich nichts gefunden da es dort meist an falscher Perspektive o.ä. lag.

- gluPerspective ist gleich
- wird auch gleich verschoben und gezeichnet

Aber hier nochmal der Quellcode


Code:
  1. procedure TBrett.Render; //Rendern des Bretts
  2. var x, y: Integer;
  3. begin
  4.  //Selection
  5.  glinitnames;
  6.  glpushname(0);
  7.  
  8.  for x := 1 to 8 do
  9.   begin
  10.    for y := 1 to 8 do
  11.     begin
  12.       if Gerade(x+y) then
  13.        begin
  14.         glPushMatrix;
  15.         gltranslatef(y-9 , 0, x-9);
  16.         glLoadName((x-1)*8+y);
  17.         glBindTexture(GL_TEXTURE_2D, texDunkel);
  18.         RenderTile(x, y);
  19.         glPopMatrix;
  20.        end
  21.       else
  22.        begin
  23.         glPushMatrix;
  24.         gltranslatef(y-9 , 0, x-9);
  25.         glLoadName((x-1)*8+y);
  26.         glBindTexture(GL_TEXTURE_2D, texHell);
  27.         RenderTile(x, y);
  28.         glPopMatrix;
  29.        end;
  30.     end;
  31.   end;
  32. end;
  33.  
  34. procedure TBrett.RenderTile(x, y: Integer);
  35. begin
  36.  glBegin(gl_Quads);
  37.  gltexcoord2f(1,0);
  38.  glvertex3f(y-1 , -1, x+1);
  39.  gltexcoord2f(0,0);
  40.  glvertex3f(y+1 , -1, x+1);
  41.  gltexcoord2f(0,1);
  42.  glvertex3f(y+1 , -1, x-1);
  43.  gltexcoord2f(1,1);
  44.  glvertex3f(y-1 , -1, x-1);
  45.  glEnd;
  46. end;
  47.  
  48. procedure TSchach.ApplicationEventsIdle(Sender: TObject; var Done: Boolean); //idle
  49. begin
  50. glMatrixMode(GL_PROJECTION);
  51. glLoadIdentity;
  52. glViewPort(0, 0, ClientWidth, ClientHeight);
  53. gluPerspective(60, ClientWidth/ClientHeight, 1, 128);
  54.  
  55. glMatrixMode(GL_MODELVIEW);
  56. glLoadIdentity;
  57. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  58.  
  59.  // Kamera Anweisungen
  60.  glTranslateF(0, 0, -18);
  61.  glRotateF(30 , 1, 0 ,0);
  62.  
  63.  // Render Answeisungen
  64.  Brett.Render;
  65.  
  66. SwapBuffers(DC);
  67. Done := False;
  68. end;
  69.  
  70. function TBrett.Selection : Integer; Selection //Selection
  71. var
  72.  Puffer       : array[0..256] of GLUInt;
  73.  Viewport     : TGLVectori4;
  74.  Treffer,i    : Integer;
  75.  Z_Wert       : GLUInt;
  76.  Getroffen    : GLUInt;
  77. begin
  78.  glGetIntegerv(GL_VIEWPORT, @viewport);
  79.  glSelectBuffer(256, @Puffer);
  80.  glRenderMode(GL_SELECT);
  81.  glmatrixmode(gl_projection);
  82.  glPushMatrix;
  83.  glLoadIdentity;
  84.  
  85.  gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  86.  gluPerspective(60, Schach.ClientWidth/Schach.ClientHeight, 1, 128);
  87.  
  88.   // Kamera Anweisungen
  89.   glTranslateF(0, 0, -18);
  90.   glRotateF(30 , 1, 0 ,0);
  91.  
  92.   // Render Answeisungen
  93.   Brett.Render;
  94.  
  95.  glmatrixmode(gl_projection);
  96.  glPopMatrix;
  97.  
  98.  treffer := glRenderMode(GL_RENDER);
  99.  Getroffen := High(GLUInt);
  100.  Z_Wert := High(GLUInt);
  101.  for i := 0 to Treffer-1 do
  102.  if Puffer[(i*4)+1] < Z_Wert then
  103.   begin
  104.    getroffen       := Puffer[(i*4)+3];
  105.    Z_Wert := Puffer[(i*4)+1];
  106.   end;
  107.  
  108.  Result := getroffen;
  109. end;


MFG
RealTec


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 10, 2005 16:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich denke mal ich weiß wo dein Fehler liegt. Rufst du deine Selection methode in der Methode Render auf? Wenn ja dann schiebst du dein Feld zwei mal in die Richtung. Du müsstest das entweder zu Begin der methode ApplicationEventsIdle oder im MouseMove aufrufen. Dadurch findet es nicht mehr in einem Rendervorgang statt und kommt somit wohl auch nicht mehr mit deinem Zeichnen durcheinander.

Dein Schachbrett würde ich persönlich anders rendern. Ich würde eine Textur binden, dann ein glBegin aufrufen und die entsprechenden Flächen am Stück rendern. Also alle die zu der Textur gehören. Das kann man ziemlich einfach ausrechnen. Denn die Matrixoperationen und ständigen Texturwechsel sind der Tot für OpenGL. Dadurch bremmst du das ein ganzes Stück aus. Evtl kannst du ja auch zu begin deines Programs ein mal alle Koordinaten berechnen und in einer Liste oder einem Array ablegen. Beim Zeichnen läufst du dann ein mal durch sie hindurch und das wars. Dann brauchst du nur noch rendern und nichts mehr berechnen. Das dürfte ziemlich schnell sein. Aber erst einmal die Selektion.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 10, 2005 17:00 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
Lossy eX hat geschrieben:
Also ich denke mal ich weiß wo dein Fehler liegt. Rufst du deine Selection methode in der Methode Render auf? Wenn ja dann schiebst du dein Feld zwei mal in die Richtung. Du müsstest das entweder zu Begin der methode ApplicationEventsIdle oder im MouseMove aufrufen. Dadurch findet es nicht mehr in einem Rendervorgang statt und kommt somit wohl auch nicht mehr mit deinem Zeichnen durcheinander.


Leider ist es auch das nicht. Steht im MouseDown Ereignis

Code:
  1. procedure TSchach.FormMouseDown(Sender: TObject; Button: TMouseButton;
  2.   Shift: TShiftState; X, Y: Integer);
  3. begin
  4.  Xs := X;
  5.  Ys := Y;
  6.  statusbar1.Simpletext := 'Sie haben auf ' + IntToStr(Brett.Selection) + ' geklickt!';
  7. end;


Lossy eX hat geschrieben:
Dein Schachbrett würde ich persönlich anders rendern. Ich würde eine Textur binden, dann ein glBegin aufrufen und die entsprechenden Flächen am Stück rendern. Also alle die zu der Textur gehören. Das kann man ziemlich einfach ausrechnen. Denn die Matrixoperationen und ständigen Texturwechsel sind der Tot für OpenGL. Dadurch bremmst du das ein ganzes Stück aus. Evtl kannst du ja auch zu begin deines Programs ein mal alle Koordinaten berechnen und in einer Liste oder einem Array ablegen. Beim Zeichnen läufst du dann ein mal durch sie hindurch und das wars. Dann brauchst du nur noch rendern und nichts mehr berechnen. Das dürfte ziemlich schnell sein.


Wenn die Selektion funktioniert werd ich den kompletten Code nochmal überarbeiten und optimieren.
Code:
  1.  


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

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
So ich hab mal das komplette Projekt hochgeladen

http://schneider.redirectme.net/downloads/Projekt.rar


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 11, 2005 23:25 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Ein kurzer Kommentar von mir: Bitte den Quelltext mal richtig Formartieren, sprich: EINRÜCKEN!!!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 12, 2005 10:34 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
Wirklich keiner der eine Lösung weis?

Ich spiel hier jetzt schon ewig mit den Werten rum doch nichts funktioniert :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 12, 2005 11:11 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
*autsch* Jetzt hab ich vergessen beim slections rendern in den Matrix Mode gl_Modelview zu wechseln :(

--------> ES FUNKTIONIERT ABER JETZT!!!!

Danke für eure Mühen!

MFG
RealTec


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 12, 2005 18:39 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Kannst du der vollständigkeit halber die lösung mal hier zeigen, oder wars nur das mit dem MatrixMode?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Selection Verschoben
BeitragVerfasst: So Mär 13, 2005 13:05 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
Code:
  1.  
  2. function TBrett.Selection : Integer; Selection //Selection
  3. var
  4.  Puffer       : array[0..256] of GLUInt;
  5.  Viewport     : TGLVectori4;
  6.  Treffer,i    : Integer;
  7.  Z_Wert       : GLUInt;
  8.  Getroffen    : GLUInt;
  9. begin
  10.  glGetIntegerv(GL_VIEWPORT, @viewport);
  11.  glSelectBuffer(256, @Puffer);
  12.  glRenderMode(GL_SELECT);
  13.  glmatrixmode(gl_projection);
  14.  glPushMatrix;
  15.  glLoadIdentity;
  16.  
  17.  gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  18.  gluPerspective(60, Schach.ClientWidth/Schach.ClientHeight, 1, 128);
  19.  
  20.  { --------------------- Diese Zeilen vergessen ----------------- }
  21.  glMatrixMode(GL_MODELVIEW);
  22.  glLoadIdentity;
  23.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  24.  
  25.   // Kamera Anweisungen
  26.   glTranslateF(0, 0, -18);
  27.   glRotateF(30 , 1, 0 ,0);
  28.  
  29.   // Render Answeisungen
  30.   Brett.Render;
  31.  
  32.  glmatrixmode(gl_projection);
  33.  glPopMatrix;
  34.  
  35.  treffer := glRenderMode(GL_RENDER);
  36.  Getroffen := High(GLUInt);
  37.  Z_Wert := High(GLUInt);
  38.  for i := 0 to Treffer-1 do
  39.  if Puffer[(i*4)+1] < Z_Wert then
  40.   begin
  41.    getroffen       := Puffer[(i*4)+3];
  42.    Z_Wert := Puffer[(i*4)+1];
  43.   end;
  44.  
  45.  Result := getroffen;
  46. end;


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 3 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.010s | 14 Queries | GZIP : On ]