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

Aktuelle Zeit: Mi Jul 16, 2025 21:33

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mal wieder ein Selections-Problem
BeitragVerfasst: Mi Jan 04, 2006 22:35 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Ich habe mir mal das Selections-Tutorial angeschaut, und ich glaube es auch halbwegs verstanden zu haben...
Nur... es geht bei nicht so richtig...

Ich habe mir eine 4-Eck gebastelt, und wenn man darauf klickt, soll er eine Aktion ausführen...
Leider liefert mir die Selections-Funktion Werte wie 4888834 zurück... Das kann irgendwie net sein....


So weiß ich dem 4-Eck einen Namen zu:
Code:
  1. glInitNames;
  2. glPushName(0);
  3.  
  4.   glPushMatrix;
  5.    glLoadName(1);
  6.      glBegin(gl_quads);
  7.        glVertex3f(-1,3,-8);
  8.        glVertex3f(-2,3,-8);
  9.        glVertex3f(-2,2,-8);
  10.        glVertex3f(-1,2,-8);
  11.     glEnd;
  12.  glPopMatrix;



Die Selectionsfunktion schaut so aus: (genaus wie im tut, aber egal.. \":)\" )
Code:
  1. function 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. begin
  9.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  10.   glSelectBuffer(256, @Puffer);               //Den Puffer zuordnen
  11.  
  12.   glMatrixMode(GL_PROJECTION);                //In den Projektionsmodus
  13.   glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  14.   glPushMatrix;                               //Um unsere Matrix zu sichern
  15.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  16.  
  17.   gluPickMatrix(vars.xs, viewport[3]-vars.ys, 1.0, 1.0, viewport);
  18.   gluPerspective(45.0, 1.446, center.NearClipping, center.FarClipping);
  19.  
  20.   main.Render;                                     //Die Szene zeichnen
  21.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  22.   glPopMatrix;                                //und unsere alte Matrix wiederherzustellen
  23.  
  24.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  25.  
  26.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  27.   Z_Wert := High(GLUInt);                       //Höchsten Z - Wert
  28.  
  29.   for i := 0 to Treffer-1 do
  30.     if Puffer[(i*4)+1] < Z_Wert then
  31.     begin
  32.       getroffen       := Puffer[(i*4)+3];
  33.       Z_Wert := Puffer[(i*4)+1];
  34.     end;
  35.  
  36.   if getroffen=High(GLUInt)
  37.     then Result := -1
  38.     else Result := getroffen;
  39. end;



Ich benutze dabei die gleiche gluPerspective wie in der Render-Funktion...
Was kann da nicht stimmen? :?

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 00:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also langsam wirds mir bisl mystisch. Kann mal einer von den Fortgeschrittenen (würde ja selber. Aber Zeitmangel is ne echte Plage) das Tutorial nachbauen, und auch den geposteten Code im Wiki testen. Eventuell is da ja noch was im Argen. Bitte als Ausgangspunkt ein Template von hier nehmen um gleiche Vorraussetzungen zu schaffen.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 05, 2006 09:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Carmageddon hat geschrieben:
Ich benutze dabei die gleiche gluPerspective wie in der Render-Funktion...
Was kann da nicht stimmen? :?

Das hast du damit gerade beantwortet. Ich habe es gerade mal ausprobiert der doppelte Aufruf von gluPerspective zerstört irgendwie die zu Grunde liegende PickMatrix. Bei der Anzeige ist dies anscheinend egal nur bei der Selektion nicht. Wenn du gluPerspective immer in deiner RenderProcedur aufrufst, dann sollte es genügen, wenn es bei der Selektion entfernst. Damit wird es immer nur ein mal aufgerufen. Der Grund warum das bei der Selektion überhaupt drin ist ist der weil ein aufruf von gluPerspective in der Renderprocedur normal recht überflüssig ist. Du musst die Perspektive der ProjektionsMaxtrix ja nur einstellen wenn sich etwas am Fenster verändert hat. Wenn du das so tust müsstest du die normale Perspektive (wird normal im OnResize gesetzt) nach der Selektion wieder einstellen, da sie durch die Selektion verbogen wird.

Warum du allerdings so komische Werte zurück bekommst und nicht -1 ist mir geringfügig auch ein Rätsel. Normal sollte er schlau genug sein um das herrausfiltern zu können. Also es wurde dann ja eigentlich gar nicht getroffen. Somit müsste Treffer 0 sein und getroffen ist High(GLUInt) auf was auch abgefragt wird.

Flash: Den Code im Wiki habe ich selber gebaut und getestet. Der aus dem Tutorial ist so weit auch richtig. Also ändern könnte man da jetzt so nichts. Evtl höchstens die Sache mit dem Auswerten der Results (wenn mehrfach Namen gepushed wurden) und im Tut dass nicht auf treffer eingegangen wird. Aber das sollte prinzipiell beides so auch gehen. Aber ich schaue mir bei Gelegenheit auch mal das Template an.

Die Selektion ist auch ein wenig kleinlich was minimale Abweichung angeht. Vor allem da man Fehler nun mal auch nicht sieht sondern nur merkt, dass es nicht so geht wie es sein sollte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 10:43 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Okay, ich habe mal die gluPerspective weg gelassen... es ändert sich rein gar nichts.....

Aber wenn ich auch noch den Befehl Render weglasse bekomme ich immer -1 zurück.... Is auch jeden fall besser als so hohe Werte :D

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 11:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Wenn du Render weglässt, dann funktioniers ja gar nicht. Dann wird ja auch nicht gezeichnet. Aber du hattest nur eine gluPerspective weggelassen, oder? So muss ich jetzt ein bisschen passen. Wie üblich sieht der Code gut aus und mir ist ein bisschen ein Rätsel warum er nicht geht. Du kannst ja selber noch mal schauen oder schicke es mir mal per Mail dann schaue ich selber mal drüber. Also wenns es nicht zu groß ist.

Ach ja Flash. Das VCL Template ist denke ich nicht so direkt für die Selektion gedacht. Abgesehen davon existiert diese dort auch noch nicht so wirklich. Wäre also mal überarbeitungswürdig.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 12:13 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Hab mal alles hochgeladen

http://rapidshare.de/files/10434929/asteroids-clon.rar.html



Die Selections-Funktion befindet sich in der Unit "Hauptmenue.pas" im Ordner Hauptmenue...
Wäre net wenn du mal nachschauen könntest, weil ich hab echt keine Ahnung.. :(

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 13:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
So. Ich habe folgendes gemacht dann gings. An der Selektion selber habe ich nichts verändert nur am drumherum. Und hauptsächlich war das nur ein unnötiger Aufruf von gluPerspective. Alles in der center.pas.

Code:
  1. procedure Tmain.SetupGL;
  2. begin
  3.   FormResize(Self);  // NEU
  4.  
  5.   glClearColor(0, 0, 0.15, 0);       //Hintergrundfarbe
  6.   ...


Code:
  1. procedure Tmain.FormResize(Sender: TObject);
  2. begin
  3.   ...
  4. //  IdleHandler(Sender, tmpBool);  auskommentiert
  5.  ...



Code:
  1. procedure Tmain.Render;
  2. begin
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.  
  5. //  glMatrixMode(GL_PROJECTION);  Auskommentiert
  6. //  glLoadIdentity;   Auskommentiert
  7. //  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);   Auskommentiert
  8.   ...


Mir sind aber so auf die Schnell ein paar Sachen aufgefallen. Anscheinen bekommst du durch die 3D modelle einen Stack underflow. Es scheint also so als ob in der gl3ds.pas (ich weiß die ist nicht dir) ein glPopMatrix zu viel drin ist.
Aber da sind wir auch schon beim nächsten. Du musst nicht alles doppelt und 3fach sichern. Bedenke, dass der Matrix Stack eine Maximal größe hat und das außerdem einen recht kostspielige Aktionen sind. Das aber nur so am Rande.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 13:14 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Danke :D

Aber:

Was du vergessen hast, ist, das in der Selection-Funktion das gluPerspective wieder drinnstehen muss :P

<klugscheiß>Sonst geht's net :D </klugscheiß>


Das mit dem Stack-Underflow ist mir auch schon aufgefallen, aber wenn ich es auf einem älteren pc laufen lasse, bekomme ich ein stack-Overflow, also liegt der Fehler warschienlich net in der gl3ds.pas
Aber das ist eine andere Geschichte :)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 13:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja ja. Aber das war in dem gepackten Code ja bereits so. :P

Stack irgendwasflow: Also ich habe einen recht aktuellen Rechner und das sollte so oder so nicht passieren. Evtl macht sie ja je nach hardware etwas anders aber es sollte weder das Eine noch das Andere passieren. Evtl schaust du mal ob es noch auftritt, wenn du aus den Modellen Displaylisten machen lässt. Das ist sowieso schneller als so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 18:33 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich hab mal noch einen Hinweis im Wiki hinterlegt. Lossy kannste mal gucken ob das so stimmt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 05, 2006 19:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe es ein bisschen drastischer geschrieben.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 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 | 15 Queries | GZIP : On ]