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

Aktuelle Zeit: Do Jul 17, 2025 07:46

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: Selection funktioniert nicht
BeitragVerfasst: Fr Nov 19, 2004 09:16 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Irgendwie klicke ich mein 3D-Objekt an, aber die Variable "treffer" hat immer eine 0 als Inhalt. Hier der Code:

Code:
  1.  
  2. begin
  3.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  4.   glSelectBuffer(256, @Puffer);                                 //Den Puffer zuordnen
  5.   glRenderMode(GL_SELECT);                              //In den Selectionsmodus schalten
  6.   glmatrixmode(gl_projection);                //In den Projektionsmodus
  7.   glPushMatrix;                                        //Um unsere Matrix zu sichern
  8.   glLoadIdentity;                                      //Und dieselbige wieder zurückzusetzen
  9.  
  10.   gluPickMatrix(basex, viewport[3]-basey, 1.0, 1.0, viewport);
  11.   gluPerspective(45.0, glform.panel1.Width/glform.panel1.Height, 1, 100);
  12.  
  13.   GLOutput;                                                     //Die Szene zeichnen
  14.   glmatrixmode(gl_projection);                //Wieder in den Projektionsmodus
  15.   glPopMatrix;                                          //um unsere alte Matrix wiederherzustellen
  16.  
  17.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  18.  
  19.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  20.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  21.   for i := 0 to Treffer-1 do
  22.     if Puffer[(i*4)+1] < Z_Wert then
  23.     begin
  24.       getroffen       := Puffer[(i*4)+3];
  25.       Z_Wert := Puffer[(i*4)+1];
  26.     end;
  27.   Result := getroffen;
  28. end;
  29.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 19, 2004 14:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Gibst du deinen Objekten auch einen Namen? GLaube das war über glLoadName oder so.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 19, 2004 15:39 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Jepp, genau hier:

Code:
  1.  
  2. if show_raw=true then                                    
  3.   begin
  4.     glColor3f(0.8,0.8,0.8);
  5.     glinitnames;
  6.     glpushname(0);
  7.     for i := 0 to (faces-1) do
  8.     begin
  9.       calcNormals(Source[i][0][0],Source[i][0][1],Source[i][0][2],Source[i][1][0],Source[i][1][1],Source[i][1][2],Source[i][2][0],Source[i][2][1],Source[i][2][2]);
  10.       glloadname(i);
  11.       glBegin(GL_TRIANGLES);
  12.         glNormal3f(nv.x,nv.y,nv.z); glVertex3f(Source[i][0][0],Source[i][0][1],Source[i][0][2]);
  13.         glNormal3f(nv.x,nv.y,nv.z); glVertex3f(Source[i][1][0],Source[i][1][1],Source[i][1][2]);
  14.         glNormal3f(nv.x,nv.y,nv.z); glVertex3f(Source[i][2][0],Source[i][2][1],Source[i][2][2]);
  15.       glEnd;
  16.     end;
  17.   end;
  18.  


Der Code liest aus einem Array die Dreieck-Faces aus und gibt jedem Face eine Nummer (seinen Index im Array) als Namen. Hoffe, das ist richtig so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 19, 2004 18:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
entferne mal bei der Draw_routine die zwei Zeilen

Code:
  1. glinitnames;
  2. glpushname(0);

Und basex bzw basey enthalten wirklich die Mauskoordinaten? Manchmal scheitert es an den einfachsten Problemen :wink:

_________________
"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 Nov 22, 2004 19:14 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wieso entfernen? Hab ich gerade was verpasst? Ich dächte auch, dass man das bei jedem Zeichnen neu machen muss. (Hab aber auch schon lange net mehr selctiert...)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 22, 2004 19:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ne, ich glaub, des gehört in die Selection Prozedur, ich zitiere mal SoS` Tutorial (
http://www.delphigl.de/tutorials/selection_de.html):
Code:
  1. function TGLForm.GetSelectBufferHit : Integer;
  2. var
  3.  SelectBuffer : array[0..512] of TGLUInt;
  4.  Viewport     : TGLArrayi4;
  5.  Hits,i       : Integer;
  6.  HitZValue    : TGLUInt;
  7.  Hit          : TGLUInt;
  8. begin
  9. glGetIntegerv(GL_VIEWPORT, @viewport);
  10. glSelectBuffer(512, @SelectBuffer);
  11. glRenderMode(GL_SELECT);
  12. glInitNames;                                                       //!!!!!!!!!!!!!
  13. glPushName(0);                                                  //!!!!!!!!!!!!!
  14. glMatrixMode(GL_PROJECTION);
  15. glPushMatrix;
  16.  glLoadIdentity;
  17.  gluPickMatrix(mx, viewport[3]-my, 1.0, 1.0, viewport);
  18.  gluPerspective(45.0, ClientWidth/ClientHeight, 0.1, 1000);
  19.  DrawScene;
  20.  glMatrixMode(GL_PROJECTION);
  21. glPopMatrix;
  22. Hits := glRenderMode(GL_RENDER);
  23. Hit       := High(TGLUInt);
  24. HitZValue := High(TGLUInt);
  25. for i := 0 to Hits-1 do
  26.  if SelectBuffer[(i*4)+1] < HitZValue then
  27.   begin
  28.   Hit       := SelectBuffer[(i*4)+3];
  29.   HitZValue := SelectBuffer[(i*4)+1];
  30.   end;
  31. Result := Hit;
  32. end;


Kann natürlich sein, das das egal ist, aber wenn ich mich ans Tut gehalten habe, hats bis jetzt eigentlich immer reibungslos gefunzt...

_________________
"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 Nov 22, 2004 22:40 
Offline
DGL Member

Registriert: Do Nov 20, 2003 19:52
Beiträge: 48
Wohnort: Tillingen bei Chemnitz
Wo das glInitNames und glPushName(0) steht ist eigentlich egal, es muß nur einmal vor dem eigentlichen Namengeben gemacht werden.
Kann es sein daß du beim erneuten zeichnen der Szene im Selektionsmodus (GL_SELECT) den Viewport veränderst? Dann funktioniert das ganze nämlich nicht. Ich hab das ganze so gelöst

Code:
  1.  
  2. procedure Tform_main.DrawScene;
  3. var RM                             : GLuint;
  4. begin
  5.   [...]
  6.  
  7.   // Den aktuellen Rendermodus in der Variable RM ablegen
  8.   GLGetIntegerv(GL_RENDER_MODE, @RM);
  9.  
  10.   glMatrixMode(GL_PROJECTION);
  11.   if RM <> GL_SELECT then begin
  12.     glViewport(0, 0, ClientWidth, ClientHeight);
  13.     glLoadIdentity;
  14.     gluPerspective(45, AspectRatio, 1, 512);
  15.   end;
  16.  
  17.   [...]
  18. end;
  19.  


Auch das Ausgeben von Text (umschalten in OrthoModus) kann Probleme bereiten, warum bin ich mir grad nich so sicher, war schon ne Weile her als ich das mal ausprobiert hab, aber besser (und schneller) ist es nur das Notwendigste im Selectionsmodus zu zeichnen.

_________________
...die Idee ist gut, doch die Welt noch nicht bereit...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 24, 2004 09:37 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Danke für die Antworten! basex und basey haben die korrekten Werte aber es funktioniert leider immernoch nicht. Ich muss vielleicht erstmal verstehen, was die verschiedenen Render-Modi bedeuten. Wenn ich die linke Mousetaste klicke und die Mouse bewege, verändere ich tatsächlich die Ansicht (drehen/verschieben/zoomen), ob Ihr das mit "Änderung des Viewport" meint? Aber beim Klick bewege ich die Mouse ja gar nicht... ich werde mal weiter rumprobieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 24, 2004 13:02 
Offline
DGL Member

Registriert: Do Nov 20, 2003 19:52
Beiträge: 48
Wohnort: Tillingen bei Chemnitz
Poste doch mal deine Zeichenprozedur, vielleicht kann man da was feststellen.

_________________
...die Idee ist gut, doch die Welt noch nicht bereit...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 24, 2004 13:41 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Ich tausche gerade die komplette "Engine" aus gegen die von dem oben genannten Selection-Tutorial. Aber erstmal muss ich es hinbekommen, dass die Skalierung stimmt, denn nun sind meine Objekte viel zu gross und zu nah an der Kamera, als dass sie angezeigt werden können. Wenn ich die Kamera nach hinten schiebe (z=-50), verschwindet das Objekt, als wenn es nur bis z=-2 angezeigt werden könnte...

EDIT: Die Perspektive klappt jetzt korrekt... vielleicht schaff ichs heute noch das Selection-Dingen auszuprobieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 24, 2004 14:13 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Nun passiert etwas seltsames: Wenn ich ins Leere klicke bekomme mal einen Hit, mal nicht. Es macht keinen Unterschied, ob da ein Objekt ist oder nicht. Vielleicht sind da 2 verschiedene Views am Werk? Ich benutze nun obige Funktion "GetSelectBufferHit", darin kann also kein Fehler sein... Wie kann ich eigentlich sehen, wie viele Objekte auf dem Name-Stack sind?


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