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

Aktuelle Zeit: Do Jul 17, 2025 02:42

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 17, 2003 18:01 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Hi!
Ich habe ein kleines Problem mit der Selection:
nachdem ich abgefragt habe, welches Objekt "getroffen" wurde, wird mein Bildschirm einfach schwarz! Beheben lässt dieses sich dadurch, dass ich einmal form.rezise aufrufe, dann läuft das ganze weiter....
des weiteren wird aber leider das objekt scheinbar nicht erkannt! Ich habe in meiner Szene zwei Namen:
1) Schalter
2) Umgebung

Wenn ich nun recht weit weg vom Schalter stehe, dannwir dieser auch wenn ich genau draufziele scheinbar nicht getroffen! (Es wird der Wert "2" für die Umgebung wiedergegeben) Stehe ich nun nah dran, dann wird nicht der Integer für die Umgebung ausgegeben, sondern "-1", was ja weder dem Schalter, noch der Umgebung entspricht.... dieses geschieht im übrigen auch, wenn ich nahe am Schalter stehe und NICHT auf den Schalter klicke.......
Woran könnte das alles liegen? (Ich hoffe, jeder hat es verstanden... falss nicht: ich habe das Programm in die DGL-Upload-Sec geladen.... den effekt, der entsehen soll, wenn man den Schalter drückt, kann man auch durch das Drücken der Space-Taste erreichen.......)

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 17, 2003 23:06 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Hat denn keiner eine Idee?
Ich selber habe das ganze dem Selection-Tut von delphigl.de nachgeahmt, weil ich selber kein anderes Tut dazu kenne.... Naja: vielleicht hilft ja etwas Code (obgleich der ganze ja in der Upload-Sek zu finden ist):

Meine "Selection" - Funktion:

Code:
  1.  
  2. function Selection : integer;
  3. var
  4.  SelectBuffer : array[0..256] of GLUInt;
  5.  Viewport     : array[0..3] of Integer;
  6.  Hits,i       : Integer;
  7.  HitZValue    : GLUInt;
  8.  Hit          : GLUInt;
  9. begin
  10. glGetIntegerv(GL_VIEWPORT, @viewport);
  11. glSelectBuffer(256, @SelectBuffer);
  12. glRenderMode(GL_SELECT);
  13. glInitNames;
  14. glPushName(0);
  15. glMatrixMode(GL_PROJECTION);
  16. glPushMatrix;
  17. glLoadIdentity;
  18.  
  19. gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, @viewport);
  20. gluPerspective(45.0, form1.ClientWidth/form1.ClientHeight, 1, 100);
  21.  
  22. render;
  23. glMatrixMode(GL_PROJECTION);
  24. glPopMatrix;
  25.  
  26. Hits := glRenderMode(GL_RENDER);
  27.  
  28. Hit       := High(GLUInt);
  29. HitZValue := High(GLUInt);
  30. for i := 0 to Hits-1 do
  31.  if SelectBuffer[(i*4)+1] < HitZValue then
  32.  &nbsp;begin
  33.  &nbsp;Hit &nbsp; &nbsp; &nbsp; := SelectBuffer[(i*4)+3];
  34.  &nbsp;HitZValue := SelectBuffer[(i*4)+1];
  35.  &nbsp;end;
  36.  
  37.  &nbsp;Result := hit;
  38.  end;
  39.  


Und hier der Code wo ich Rendere:

Code:
  1.  
  2. procedure render;
  3. begin
  4. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
  5. glLoadIdentity; &nbsp;
  6.  
  7. if rdir = 1 then
  8. begin
  9. rot := rot-5*timefactor;
  10. end;
  11.  
  12. if rdir = 2 then
  13. begin
  14. rot := rot+5*timefactor;
  15. end;
  16.  
  17. if getasynckeystate(vk_up) <> 0 then
  18. begin
  19. my_x := my_x-0.4*sin(degtorad(rot))*timefactor;
  20. my_y := my_y+0.4*cos(degtorad(rot))*timefactor;
  21. end;
  22.  
  23. if getasynckeystate(vk_down) <> 0 then
  24. begin
  25. my_x := my_x+0.4*sin(degtorad(rot))*timefactor;
  26. my_y := my_y-0.4*cos(degtorad(rot))*timefactor;
  27. end;
  28.  
  29. if getasynckeystate(vk_right) <> 0 then
  30. begin
  31. my_x := my_x+0.2*sin(degtorad(rot-90))*timefactor;
  32. my_y := my_y-0.2*cos(degtorad(rot-90))*timefactor;
  33. end;
  34.  
  35. if getasynckeystate(vk_left) <> 0 then
  36. begin
  37. my_x := my_x+0.2*sin(degtorad(rot+90))*timefactor;
  38. my_y := my_y-0.2*cos(degtorad(rot+90))*timefactor;
  39. end;
  40. glcolor3f(1,1,1);
  41.  
  42. glinitnames;
  43. glpushname(0);
  44.  
  45. glrotate(rot,0,1,0);
  46. gltranslate(my_x,-1.1,my_y);
  47.  
  48. glloadname(umgebung);
  49. draw_raum1; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//Dies ist
  50. draw_verbindung; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//alles nur meine
  51. draw_raum2; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//Levelgeometrie
  52.  
  53. glloadname(schalter);
  54. gldisable(gl_texture_2d);
  55.  
  56.  
  57. .... //Der Schalter halt
  58.  
  59.  
  60. glcolor3f(1,1,1);
  61.  
  62. glenable(gl_texture_2d);
  63.  
  64. SwapBuffers(form1.myDC);
  65.  

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 18, 2003 09:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
So...hab mir den Quellcode dann mal angesehen und auch prompt den Fehler gefunden, und zwar einen den sehr viele Leute machen : Bitte achtet doch auf die korrekte Nutzung der verschiedenen Matrizen (Modelansicht und Projektion) !

In deiner Selektion siehts nämlich so aus :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;

gluPickMatrix(xs, viewport[<span class='integer'>3</span>]-ys, <span class='integer'>1.0</span>, <span class='integer'>1.0</span>, @viewport);
gluPerspective(<span class='integer'>45.0</span>, form1.ClientWidth/form1.ClientHeight, <span class='integer'>1</span>, <span class='integer'>100</span>);

render;
[...]</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Dort schatltest du ja in die Projektionsmatrix und renderst dann deine Szene auch in dieser Matrix (Was ja falsch ist).Deshalb muss du in deiner Render.Prozedur ganz am Anfang auch unbedingt in die Modelansichtsmatrix wechseln :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>procedure</span> render;
<span class='reserved'>begin</span>
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT <span class='reserved'>or</span> GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
glLoadIdentity;
[...]</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Danach funktioniert der Lichtschalter auch problemlos.Ich leg dir aufgrund deines Fehlers unbedingt das entsprechende Kapitel des Redbooks ans Herz.Der Unterschied zwischen Modelannsichts- und Projektionsmatrix ist sehr wichtig, aber leider werden diese kaum beachtet und es entstehen so viele Fehler.

P.S. : Lustige Idee mit dem Lichtschalter B)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 18, 2003 09:55 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Jiiiiihawww!
danke ;-) *SoS ganz lieb knuddel*
Wie leicht man doch über recht einfache Fehler stolpern kann um sich anschließen totzusuchen :-)
Hast recht: Funzt nun alles wunderbar :-)

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]