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

Aktuelle Zeit: Fr Jul 18, 2025 22:17

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit Selections
BeitragVerfasst: Mo Jun 18, 2007 14:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

also ich will gerenderte Objekte mit der Maus selekten können. Den Code habe ich aus dem Tutorial:

Code:
  1.  
  2. function TRenderer.GetSelectBufferHit : Integer;
  3. var
  4.  SelectBuffer : array[0..512] of TGLUInt;
  5.  Viewport     : TVec4i;
  6.  Hits,i       : Integer;
  7.  HitZValue    : TGLUInt;
  8.  Hit          : TGLUInt;
  9. begin
  10. glGetIntegerv(GL_VIEWPORT, @viewport);
  11. glSelectBuffer(512, @SelectBuffer);
  12. glRenderMode(GL_SELECT);
  13. glInitNames;
  14. glPushName(0);
  15. glMatrixMode(GL_PROJECTION);
  16. glLoadIdentity;
  17. gluPickMatrix(MousePos.x, viewport[3]-MousePos.y, 1.0, 1.0, Viewport);
  18. gluPerspective(45.0, Form1.ClientWidth/Form1.ClientHeight, 0.1, 2048);
  19. Render;
  20. Hits      := glRenderMode(GL_RENDER);
  21. Hit       := High(TGLUInt);
  22. HitZValue := High(TGLUInt);
  23. for i := 0 to Hits-1 do
  24.  if SelectBuffer[(i*4)+1] < HitZValue then
  25.   begin
  26.   Hit       := SelectBuffer[(i*4)+3];
  27.   HitZValue := SelectBuffer[(i*4)+1];
  28.   end;
  29. Result := Hit;
  30. end;
  31.  


Vor dem Rendern:

Code:
  1.  
  2. GLGetIntegerv(GL_RENDER_MODE, @RM);
  3.  
  4. if RM <> GL_SELECT then
  5.  begin
  6.  glViewport(0, 0, Form1.ClientWidth, Form1.ClientHeight);
  7.  glMatrixMode(GL_PROJECTION);
  8.  glLoadIdentity;
  9.  gluPerspective(45, Form1.ClientWidth/Form1.ClientHeight, 0.1, 1024);
  10.  end;
  11. glMatrixMode(GL_MODELVIEW);
  12.  


Ich zeichne ein Spielfeld , also einfache Quads. Die einzelnen Felder auf den Spielfeld kann ich richtig anwählen.
Jetzt rendere ich aber noch ein paar Objekte (ms3d Meshes) dazu. Sieht dann etwa so aus (Mauszeiger war etwa bei dem "Fleck".
Bild

wenn ich meine Maus etwas weiter vorne habe Selecte ich den Panzer, wenn ich aber meine Maus wo anders auf dem Panzer habe selecte ich den Boden darunter.

Gerendert wird so:

Code:
  1.  
  2. glLoadName(GLID);
  3.         ...
  4.         //Testen ob es im Bild ist
  5.         glPushMatrix;
  6.          .... //farbe ändern wenn selectet
  7.          glTranslatef(ModelsToRender[i].XPos, 0, ModelsToRender[i].ZPos);
  8.          glRotatef(ModelsToRender[i].Rotate + 180, 0, 1, 0);
  9.          glScalef(ModelsToRender[i].Scale[0], ModelsToRender[i].Scale[1], ModelsToRender[i].Scale[2]);
  10.  

rendern
Code:
  1.  
  2.        for i:=0 to numGroups-1 do with Groups[i] do begin
  3.       //Setup the Materials
  4.       if MaterialIndex >= numMaterials then begin
  5.         result := MATERIAL_NOT_FOUND;
  6.         exit;
  7.       end;
  8.  
  9.       glMaterialfv(GL_FRONT_AND_BACK,  GL_AMBIENT,  @Materials[materialIndex].Ambient);
  10.       glMaterialfv(GL_FRONT_AND_BACK,  GL_DIFFUSE,  @Materials[materialIndex].Diffuse);
  11.       glMaterialfv(GL_FRONT_AND_BACK,  GL_SPECULAR, @Materials[materialIndex].Specular);
  12.       glMaterialfv(GL_FRONT_AND_BACK,  GL_SHININESS,@Materials[materialIndex].Shininess);
  13.       glMaterialfv(GL_FRONT_AND_BACK,  GL_EMISSION, @Materials[materialIndex].Emissive);
  14.  
  15.       //Bind the Texture if there is one
  16.       glBindTexture(GL_TEXTURE_2D, Materials[materialIndex].texture);
  17.  
  18.  
  19.       glBegin(GL_TRIANGLES);
  20.         for j:=0 to nTriangles-1 do begin
  21.           for k := 0 to 2 do with Triangles[triangleIndices[j]] do begin
  22.             glNormal3fv(@vertexNormals[k]);
  23.             glTexCoord2f(s[k],1-t[k]);
  24.             glVertex3fv(@Vertices[vertexIndices[k]].Position);
  25.           end;
  26.         end;
  27.       glEnd();
  28.  


Code:
  1.  
  2.         glPopMatrix;
  3.  


Wo kann der Fehler liegen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 18, 2007 15:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Noch ein Problem:

Wenn ich mehr als ein Model zeichne, dann wird immer nur ein Model angewählt. Das bedeutet, wenn ich 2 Models auf den Spielfeld habe, und
wenn ich mal den Fleck gefunden habe, wo ich das Model anwählen kann, dann wird egal welches ich mit meiner Maus anwähle, immer das erste, was gerendert wird, als angewähltes Objekt erkannt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 18, 2007 15:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi,
Markus hat geschrieben:
wenn ich mal den Fleck gefunden habe, wo ich das Model anwählen kann, dann wird egal welches ich mit meiner Maus anwähle immer das erste als angewähltes Objekt erkannt.

Vergibst du pro Objekt eine eigene ID mit glLoadName? Für mich sieht das nämlich so aus, als ob du mit: glLoadName(GLID); immer nur eine Konstante vergibst.

Zu dem Selektionsproblem:
Versuche mal die gleiche Perspective-Matrix zu benutzen. D.h.: In der Selektions-Procedure den gleichen Aufruf von gluPerspective zu verwenden, wie in der Render-Procedure! (Clipping-Werte unterscheiden sich: 1024 vs. 2048)

Hoffe etwas davon hat dir geholfen :wink:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 18, 2007 15:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ich benutze jetzt jedes mal ClientHeight bzw. ClientWidth, 0.1 und 1024. Problem besteht aber immernoch.

Die Models rendere ich in einer schleife und erhöhe GLID immer um 1. Daran kann es also nicht liegen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 18, 2007 16:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ok, den Fehler für das Selecten des falschen Models habe ich gefunden. Ich hatte die Models nicht immer in der gleichen Reihenfolge gerendert.

Bleibt aber immernoch der andere Fehler. Ich habe jetzt mal die gluPickMatrix vergrößert, also jetzt mal 75x75 genommen.

Jetzt selecte ich den Panzer richtig. wenn ich jetzt aber auf die ganznormale Map klicke, ist der Selectionbereich ja auch größer -> ich Selecte das Feld mit dem kleinsten Z-Wert. Das bedeutet, ich selecte jetzt zwar den Panzer, aber sonst immer ein feld weit neben dem Cursor.

gibts da andere Mäglichkeiten?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 18, 2007 20:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Nee, die gluPickMatrix würde ich schon so lassen wie sie ist.
Aber eben ist mir eingefallen woran es liegen könnte. Benutzt du eigentlich einen ScaleFactor > 1 für deinen Panzer in der Render Procedure?
Code:
  1. glScalef(ModelsToRender[i ].Scale[0], ModelsToRender[i ].Scale[1];

Denn das würde eventuell den verkleinerten Selektionsbereich erklären. Wenn du einen Factor > 1 benutzt, versuch mal deinen Panzer etwas größer zu zeichnen ohne glScalef(...).

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 19, 2007 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ohne glScalef() passiert genau das gleiche. Kann man vielleicht noch irgendwie anders eine Selection realisieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 19, 2007 13:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Kann man schon, doch das wird dann halt ein wenig Arbeit, wobei es mit der Opengl-Selektion einfacher und übersichtlicher geht.
Jetzt gehen mir langsam die Ideen aus woran es noch liegen könnte.
Am besten du lädtst mal den Quelltext mit allen benötigten units und texturen hoch, dann kann ich mal etwas genauer schauen, woran es liegt. Aber versprechen, dass ich den Fehler finde, kann ich nicht. :wink:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 19, 2007 14:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ich habs mal hochgeladen. Musst das ganze nur in C:\StrategyGame\ entpacken (den inhalt des "upload" ordners)

Und danke, dass du dir so eine Mühe machst.

http://rapidshare.com/files/38117428/Upload.rar.html


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 19, 2007 16:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi,
den Fehler hab ich jetzt nach 1,5 Stunden nicht wirklich gefunden, sorry. Aber da ja deine Selektion des Grounds funktioniert und die selection-methode nicht falsch ist (getestet), gehe ich davon aus, dass es an den 3D models selber hängt. Wenn du einfach mal einen Kasten renderst, nicht als ms3d, dann sollte das funktionieren. Alternativ würde ich mal den ModelLoader / das Modelformat wechseln. Falls dein Modelprogramm wavefront obj unterstützt (Blender tut es), kannst du mal mit meinem Modell-loader auf meiner Seite (siehe Signatur) herumprobieren.

Ich konnte dein Programm leider auch nicht kompilieren, da ich ein paar jv comps net hatte, aber mit der exe hab ich bisschen rumgespielt. Wenn ich einen Baum einfüge, dann kann ich, wenn ich ganz nah dran bin, die wurzeln perfekt selektieren.
Jedoch nicht die Baumkrone, oder jedenfalls nur dort in der Krone, wo der Stamm liegen müsste. Also denke ich man kann nur einen Teil des Objektes selektieren (hier der stamm), warum weiß ich aber nicht. Also probier mal mit nem anderen loader als ms3d. Vielleicht liegt der "Fehler" in der ms3d unit.

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 19, 2007 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ok, danke für deine Hilfsbereitschaft. Ich werde mir dann mal deinen Loader anschauen. Ich kann ja in .obj exportieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 20, 2007 11:54 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Mit deinem .obj Loader passiert genau das gleiche. Außerdem werden da keine Texturen angezeigt, alles ist schwarz. Dann werde ich wohl damit leben müssen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 20, 2007 12:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Markus hat geschrieben:
Außerdem werden da keine Texturen angezeigt, alles ist schwarz.

Komisch. Mit welchem Programm haste denn exportiert? Denn normalerweise klappt das mit den Texturen.

Markus hat geschrieben:
Dann werde ich wohl damit leben müssen.

Tia... dann tut es mir leid, dass ich nicht wirklich weiter helfen konnte...

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 20, 2007 13:53 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ich habe mit Milkshape3D exportiert. Aber ich glaube das liegt daran, dass du von der Reihenfolge in der du die Texturen erstellst auf die ID schließt. Aber wenn man vorher schon andere texturen geladen hat.... Das komische dabei ist nur, dass dann nichtmal ne andere Textur gezeigt wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 20, 2007 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Naja, weiß ich jetzt auch net so genau. Werde das mit MilkShape noch genauer testen müssen :wink:

_________________
http://texelviews.delphigl.com


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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