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

Aktuelle Zeit: Mi Jul 16, 2025 12:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: So Dez 12, 2004 16:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Also ich habs mir jetzt angeschaut...
Wie SoS schon angemerkt hat, musst du unsere Tipps schon einbauen:
Also so:
- Alle gluPerspective auf gleichen Inhalt bringen
(empfehle zum testen: gluPerspective(90, 800/600, 1, 100);)
- Vor dem Rendern in der Selection-Prozedur noch glMatrixMode(gl_MODELVIEW); aufrufen

Dann müsste es eigentlich gehen, testweise solltest du erstmal nur ein einfaches Quad rendern, um zu sehen, ob da deine Selection schon anschlägt:
Code:
  1. procedure TSchach.Render;
  2. begin
  3.  //Render Anweisungen
  4.  glLoadname(1);
  5.  gltranslatef(0, 0, -6);
  6.  glBegin(GL_QUADS);
  7.   glVertex3f(0, 0, 0);
  8.   glVertex3f(1, 0, 0);
  9.   glVertex3f(1, 1, 0);
  10.   glVertex3f(0, 1, 0);  
  11.  glend();
  12.  //glLoadIdentity;
  13.  //gltranslatef(0, 0,-25);
  14.  //glrotatef(rotX, 1,0,0);
  15.  //glrotatef(rotY, 0,1,0);
  16.  
  17.  //CreateFeld;
  18.  //RenderModels;
  19.  
  20.  SwapBuffers(DC);
  21. end;

_________________
"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: So Dez 12, 2004 16:23 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
So ich wechsel nun vor dem Rendern in die ModelView Matrix, und die Selection Funktioniert, allerdings nur wenn ich von oben auf das Schachbrett schaue und nicht um die Y Achse rotiert wurde, sonst funktioniert es nur abundzu, bzw. wenn ich schräg von oben auf das Schachbrett schau funktioniert es gar nicht!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 12, 2004 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
So wie ich das gelesen habe, liegt es evtl. daran das du die rotation im rendern für die selection auslässst?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 12, 2004 16:39 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
Nein, ich verschiebe und drehe auch wenn ich für selection render!

Edit:// Nein bei dem Quad schlägt die Selection bei mir nicht an!

Edit2:// Es funktioniert ... zumindest größten teils (warscheinlich zufrüh in die ModelView Matrix gewechselt) d.h manchmal wird die falsche Schachfigur angewählt und abundzu auch mal wird gar nichts abgewert obwohl selection nicht -1 zurückliefert!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 12, 2004 19:42 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
So, irgendwie will Delphi nicht das Selektieren was ich will :( Entweder es liegt daran das die Nummern falsch gesetzt werden, oder er selektiert falsch

Hier werden die Nummern gesetzt

Code:
  1.  y := 0;
  2.   glinitnames;
  3.   glpushname(0);
  4.  //Schachbrett zeichnen
  5.  for i := 1 to 8 do
  6.   begin
  7.    for x := 1 to 8 do
  8.     begin
  9.      inc(y);
  10.      glloadname(y);
  11.      if Gerade((i+x)) then
  12.      begin
  13.       glPushMatrix;
  14.       gltranslatef(x-9 , 0, i-9);
  15.       glBindTexture(GL_TEXTURE_2D, texDunkel);
  16.       glBegin(gl_Quads);
  17.       gltexcoord2f(1,0);
  18.       glvertex3f(x-1 , -1, i+1);
  19.       gltexcoord2f(0,0);
  20.       glvertex3f(x+1 , -1, i+1);
  21.       gltexcoord2f(0,1);
  22.       glvertex3f(x+1 , -1, i-1);
  23.       gltexcoord2f(1,1);
  24.       glvertex3f(x-1 , -1, i-1);
  25.       glEnd;
  26.       glPopMatrix;
  27.      end;
  28.      if not (Gerade((i+x))) then
  29.      begin
  30.       glPushMatrix;
  31.       gltranslatef(x-9, 0, i-9);
  32.       glBindTexture(GL_TEXTURE_2D, texHell);
  33.       glBegin(gl_Quads);
  34.       gltexcoord2f(0,0);
  35.       glvertex3f(x-1 , -1, i+1);
  36.       gltexcoord2f(0,1);
  37.       glvertex3f(x+1 , -1, i+1);
  38.       gltexcoord2f(1,1);
  39.       glvertex3f(x+1 , -1, i-1);
  40.       gltexcoord2f(1,0);
  41.       glvertex3f(x-1 , -1, i-1);
  42.       glEnd;
  43.       glPopMatrix;
  44.      end;
  45.     end;
  46.   end;


-----> Eventuell liegt auch der Fehler in der Selektions Funktion ... siehe dazu Seite 1 , Post 1 des Threads.

Hier wird die Selection ausgewertet [im MouseDown Ereignis]

SelectedFeld als Integer definiert, darin wird der Rückgabewert der Selection FUnktion gespeichert
Feld: array[1..8,1..8] of integer , darin wird gespeichert wo welches Model steht

Dieses ganze div 8, mod 8 +1, +7 wird benutz um den Rückgabewert der Selection Funktion in X,Y Wert des Feldes umzurechnen.

Code:
  1.  SelectedFeld := Selection;
  2.  SelectedFeld := SelectedFeld+7;  
  3.  if Feld[SelectedFeld div 8, (SelectedModel mod <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->+1] > 0 then
  4.   SelectedModel := SelectedFeld
  5.  else
  6.   begin
  7.    if SelectedModel > 0 then
  8.     ModelMove(SelectedFeld div 8, (SelectedFeld mod <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->+1, SelectedModel div 8, (SelectedModel mod <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->+1);
  9.   end;


Das muss irgendwo ein Fehler sein, doch ich find in nicht :(

MFG
RealTec


Zuletzt geändert von RealTec am So Dez 12, 2004 19:47, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 12, 2004 19:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Schonmal selbst versucht die Selektion zu debuggen? Geht recht einfach : Du wechselst nicht in den Selektionsmodus, zoomst nicht 1x1 Pixel, sonder z.B. 10x10 Pixel, wechselst am Ende der Selektion die Puffer und legst dann ne Pause ein (z.B. bis ne Taste gedrückt wird). So siehst du direkt ob bei der Selektion auch das dargestellt wird was dargestellt werden soll.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 12, 2004 20:25 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
Puffer wechseln?? (Damit SwapBuffers(DC) gemeint?)
Soweit hab ichs verstanden:

Code:
  1. function TSchach.Selection : 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.  go           : Boolean;
  9. begin
  10.  glGetIntegerv(GL_VIEWPORT, @viewport);      
  11.  glSelectBuffer(256, @Puffer);                              
  12.  //glRenderMode(GL_SELECT);                            Nicht in den Selektions Modus wechseln
  13.  glmatrixmode(gl_projection);                
  14.  glPushMatrix;                                        
  15.  glLoadIdentity;                                  
  16.  
  17.  gluPickMatrix(Xs, viewport[3]-Ys, 10.0, 10.0, viewport);                          //10 x10 Pixel herzoomen
  18.  gluPerspective(90.0, Schach.ClientWidth/Schach.ClientHeight, 1, 100);
  19.  
  20.   glmatrixmode(gl_ModelView);
  21.  
  22.  Render;                                            
  23.  
  24.  glmatrixmode(gl_projection);              
  25.  glPopMatrix;                                      
  26.  
  27.  treffer := glRenderMode(GL_RENDER);        
  28.  
  29.  Getroffen := High(GLUInt);                
  30.  Z_Wert := High(GLUInt);                    
  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.  Result := getroffen;
  39.  
  40. go := false;   //Auf Tastendruck warten
  41. repeat
  42.  if GetKeyState(VK_UP) <> 0 then
  43.  go := true;
  44. until go;
  45. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 12, 2004 22:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ja, nach dem Rendern die Puffer tauschen und dann pausieren, dann sieht man in etwa den Ausschnitt der für die Selektion genutzt wird und kann zumindest sagen ob an die richtige Stelle selektiert wird. Übrigens muss man beim Rendern auch die gleichen zNear und zFar-Werte nutzen, die sind bei der Selektion nämlich 1/100, was für größere Szenen etwas gering klingt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 13, 2004 15:10 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
So, also beim selektieren wird das gleiche angezeigt, wie beim normalen Render.

Und ja ZFar und ZNear der Selektion sind gleich wie beim rendern (Es ist ja nur das Schachbrett, also eine kleinere Szene) ....

Ich weiß einfach nicht mehr weiter :cry:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


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