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

Aktuelle Zeit: Do Jul 17, 2025 07:41

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



Ein neues Thema erstellen Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Slection (von 3ds-Models)
BeitragVerfasst: Sa Dez 11, 2004 20:49 
Offline
DGL Member

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

Nun bin ich schon wieder stecken geblieben :( . Diesmal bei der Slection von 3ds-Models.
Ich versuche gerade ein 3D Schach zu programmieren bei dem ich die einzelne Models anwählen und verschieben (bzw. rotieren) lassen will.

Ich hab mir das Tutorial zur Selection auf dieser Seite mal angeschaut und habe Fragen zu den Folgenden Code Teilen:


Code:
  1. function Selection : integer;
  2. var
  3. Puffer       : array[0..256] of GLUInt;
  4. Viewport     : array[0..3] of Integer;
  5. Treffer,i    : Integer;
  6. Z_Wert       : GLUInt;
  7. Getroffen    : GLUInt;
  8. begin
  9. glGetIntegerv(GL_VIEWPORT, @viewport);      
  10. glSelectBuffer(256, @Puffer);                                
  11. glRenderMode(GL_SELECT);                            
  12. glmatrixmode(gl_projection);              
  13. glPushMatrix;                                        
  14. glLoadIdentity;                                      
  15.  
  16. gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, @viewport);  { Wegen dem @Viewport wollte Delphi mir mein Projekt nicht compilieren und ich konnte mit dem Code nicht experimentieren }
  17. gluPerspective(45.0, form1.ClientWidth/form1.ClientHeight, 1, 100);
  18.  
  19. render;            // Diese Procedure hab ich nicht, ich render im OnIdle Ereigniss ... doch wie einbinden?                                          
  20. glmatrixmode(gl_projection);                
  21. glPopMatrix;                                          
  22.  
  23. treffer := glRenderMode(GL_RENDER);        
  24.  
  25. Getroffen := High(GLUInt);                
  26. Z_Wert := High(GLUInt);      
  27.  
  28. for i := 0 to Treffer-1 do
  29. if Puffer[(i*4)+1] < Z_Wert then
  30.  begin
  31.  getroffen       := Puffer[(i*4)+3];
  32.  Z_Wert := Puffer[(i*4)+1];
  33.  end;
  34.  
  35.  Result := getroffen;
  36. end;


1.) Wie kann ich die OnIdle Methode aufrufen?
--> ApplicationEventsIdle(nil, true) bzw. false als letzter Paramter funktioniert nicht

2.) Muss ich bevor ich die Models Render glloadname(x) aufrufen oder vor dem Create der Models?
---> und glinitname und glpushname(0) muss ich vor glloadname(x) aufrufen, oder wie?

Ich bin einfach nicht durchgestiegen und hoffe auf verwertbare Antworten von euch
(und bitte nicht lachen ich bin Anfänger ;) )

MFG
RealTec


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Slection (von 3ds-Models)
BeitragVerfasst: Sa Dez 11, 2004 23:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
RealTec hat geschrieben:
1.) Wie kann ich die OnIdle Methode aufrufen?
--> ApplicationEventsIdle(nil, true) bzw. false als letzter Paramter funktioniert nicht

Delphi-Grundlagen : Der letzte Parameter von ApplicationEventsIdle ist ein sog. Variablenparameter, da kann man nicht einen festen Wert übergeben, sondern die Funktion will eine Variable in die sie etwas hineinschreiben kann.

RealTec hat geschrieben:
2.) Muss ich bevor ich die Models Render glloadname(x) aufrufen oder vor dem Create der Models?
---> und glinitname und glpushname(0) muss ich vor glloadname(x) aufrufen, oder wie?

Selection muss man während des Renderns setzen. Und OpenGL ist eine Statemaschine, der gesetzte Selektionsname wird solange für alle Primitiven verwendet, bis ein anderer gesetzt wird. Und ja, die beiden Sachen (Init und Push) muss man in jedem Frame am Anfang der Selektion aufrufen.

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


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

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
So, ich kann jetzt das komplette Projekt compilieren, doch egal wo ich klicke Selection liefert mir immer den Wert 1 zurück.



Code:
  1. procedure TSchach.RenderModels; //Wird in dem OnIdle Ereigniss aufgerufen
  2. var i,x,y : integer;
  3. begin
  4.  y := 1;
  5.  glinitnames;
  6.  glpushname(0);
  7.  for i := 1 to 8 do
  8.   begin
  9.    for x := 1 to 8 do
  10.     begin
  11.      glPushMatrix;
  12.      glloadname(y);
  13.       //Hier werden dann die Models gerendert ...
  14.      inc(y);
  15.      glPopMatrix;
  16.     end;
  17.   end;
  18. end;


Und an der Slection Funktion musste ich aus was ändern:

Code:
  1. function TSchach.Selection : integer;
  2. var
  3.  Puffer       : array[0..256] of GLUInt;
  4.  Viewport     : TGLVectori4; //Statts der Array of Integer
  5.  Treffer,i    : Integer;
  6.  Z_Wert       : GLUInt;
  7.  Getroffen    : GLUInt;
  8. begin
  9.  glGetIntegerv(GL_VIEWPORT, @viewport);  
  10.  glSelectBuffer(256, @Puffer);                              
  11.  glRenderMode(GL_SELECT);                          
  12.  glmatrixmode(gl_projection);                
  13.  glPushMatrix;                                      
  14.  glLoadIdentity;                                
  15.  
  16.  gluPickMatrix(Xs, viewport[3]-Ys, 1.0, 1.0, viewport); //Ohne @
  17.  gluPerspective(45.0, Schach.ClientWidth/Schach.ClientHeight, 1, 100);
  18.  
  19.  ApplicationEventsIdle(nil, Idle);                                              
  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.  
  34.  Result := getroffen;
  35. end;


Die Funktion wird immer im MouseDown Ereigniss aufgerufen, und dan in eine Text Datei geschrieben (damit ich sehen kann was angewählt wurde)

Doch wie oben schon gesagt er liefert mir immer 1 zurück. Da muss noch irgendwo ein Fehler sein, blos wo?

Danke für eure Hilfe schonmal im Vorraus

MFG
RealTec


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

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Du darfst logischerweise in deiner Renderprozedur nicht nocheinmal die Matrizen (Modelansicht und Projektion) ändern, da du ja für die Selektion eigene Matrizen hast, die auf einen bestimmten Bildpunkt zielen. Also musst du das eigentliche Rendern der Szene (ohne Setzen der Matrizen) auslagern und nur dass aufrufen, also nicht den Idle-Event in dem die Matrizen verändert werden.

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


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

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
*Kopf gegen Wand hau* Danke!

Ich hab jetzt die Renderprocedure (ohne setzen der Matrizen) ausgelagert. Jetzt erkennt er zwar ob ich neben ein Model geklickt hab (-1), aber er kann immernoch nicht unterscheiden auf welches Model ich geklickt hab (bringt immer 1) ...

Edit:// Ungefähr jeder 20. Klick "funktioniert" (auch wenn die anderen genau so gut getroffen haben ^^) ... und sonst kommt immer -1

MFG
Real Tec


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

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Benutzt du zum Rendern auch die selbe FOV-Einstellung (45°) wie bei der Selektion? Der muss nämlich für Rendern und Selektion gleich sein.

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


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

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
Ich hab jetzt mal im DGL Wiki nach der Bedeutung der einzelnen Paramtern von gluPerspective gesucht und auch gefunden. DOch das mit dem FOV nicht ganz kapiert. Hab mal eine kleine Zeichnung angefertigt (im Querschnitt) wie ich mir das vorstelle....

Bild

Der Punkt in der Mitte soll die Y Achse darstellen und das grün Abgegrenzte den FOV Bereich. (also in diesem Beispiel müsst ich 90 als ersten Parameter angeben)

Stimmt das so?

Dan müsst ich wenn ich die Mitte des Schachbretts auf 0 habe 360° angeben, oder?

MFG
RealTec


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

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ich glaub, du hast da ein Verständnis-Problem:
Die Winkel-Angabe in gluPerspective gibt dir an, wie weit du als Betrachter nach links und recht um dich herum etwas wahrnimmst, bei mir is da so um die 90° !? Dieser Wert sollte eigentlich immer gleich bleiben. Hatte mit der Selektion auch schon Probleme, als ich unterschiedliche Werte in Selection und OGL-Init hatte. Das Bild, das OGL dann zum selektieren verwendet schaut dann ganz anders aus, als das, das du siehst. So stelle ich mir das immer vor...

_________________
"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 14:56 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
Ich benutz jetzt die gleiche FVO Einstellung (60°) für Render und Selektion, doch tut sich jetzt gar nichts mehr ... (also immer -1)

Und das ich die Szene verschoben und gedreht hab (bzw. auch die 3ds Mdeols gedreht hab) wird ja beim rendern mit berücksichtigt und muss ich nicht extra angeben?


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

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
90° ist bei Quake usw.. Standard. Je nachdem wie weit man vom Monitor entfernt sitzt wäre 60° eigentlich korrekter, aber dann sieht man zu wenig gleichzeitig auf dem Bildschirm. Man muß ja berücksichtigen, dass der Monitor nicht das ganze Gesichtsfeld ausfüllt. Mehr als 180° ist auf normalen Weg nicht zu erreichen, aber es gibt ein Quake1 Mod, dass bis zu 720° rendert. Im Death Match hat man dadurch natürlich einen großen Vorteil.


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

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
ich hab das jetzt mit dem FVO verstanden :D . 60° reichen mir allerdings aus, da es ja nur in der kompletten Welt ein Schachbrett mit Figuren gibt ....

Trotzdem funktioniert die Selection, aus welchem grund auch immer noch nicht ...


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

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn du an obigem Code nichts geändert hast, befindest du dich zum Zeitpunkt des Renerns noch in der Projektionsmatrix, was falsch ist. Du musst vor dem Rendern in die Modelansichtsmatrix wechseln. Ansonsten müsste es eigentlich funktionieren.

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


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

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Kannst du die Sorces (mit den Libs, die du verwendest) mal posten, bzw mir per Mail schicken, dann schau ich sie mir mal an...

_________________
"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 15:44 
Offline
DGL Member

Registriert: Mi Nov 24, 2004 13:05
Beiträge: 35
http://schneider.redirectme.net/downloads/MeinOGLProgramm.zip

Ich hoffe du kannst den Fehler finden (und wunder dich net über die Ladezeit ...)


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

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Schätze mal du hast meinen letzten Post überlesen...

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


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 1, 2  Nächste
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 | 16 Queries | GZIP : On ]