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

Aktuelle Zeit: Fr Jul 18, 2025 06:46

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Selection...
BeitragVerfasst: Sa Feb 28, 2004 09:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hallo.

Hab da schonwieder mal ein Prob ^^
Ich habe mir das Tutorial angesehen, doch da klappt was net :-/

Ich muss dort wo "render;" steht, meine Buttons rendern oder?
Dann hab ich versucht die Funktion in 2 Teile zu zerlegen, brachte nichts :-(

Ein kleiner Tipp vielleicht?
Der Fehler tritt bei Result := getroffen auf.

PS: hier ist ja nichts mehr los seit ein paar Tagen... ich schau öfters mal vorbei aber nie was neues :-/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 28, 2004 11:41 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Irgendwie verstehe ich die Frage nicht ganz, aber nagut:

Das dort "Render;" steht liegt daran, dass ich meine Prozedur, welche bei mir den ganzen OGl-Code beinhaltet (Den Bildschirm löschen, Neue Objekte zeichnen und ein swapbuffers hinterher...), meistens "Render" nenne ... viele andere hier nennen die "gl_draw" ... andere haben sowas gar nicht, weil die direkt im On-Idle rendern .... egal, wie du das handhabst: die Prozedur muss hier komplett ausgeführt werden ... oder halt aufgerufen ... sonst gehts nicht ...
Ach ja noch etwas: am Anfang der Prozedur sollte einmal
"glMatrixMode(GL_MODELVIEW);" stehen ... sonst bleibt der Bildschirm nach einem Klick schwarz....

_________________
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: Sa Feb 28, 2004 12:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Veränderst du die Perspektive in deiner Render procedure?
Sie darf nämlich nicht verändert werden da dise die Selektionsmethode schon festlegt.
Wechselst du zum Beispiel in den 2D Modus gibt es Probleme.
MfG
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 28, 2004 12:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Ich habe alles direkt im on idle... muss ich ALLES in dieser funktion nochmal aufrufen?
also diese funktion einmal im on idle aufrufen und in der funktion das inidle nochmal aufrufen? ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 28, 2004 12:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Nee, tue ich nicht, ich hab nur en pushmatrix und popmatrix, sowie ein translate (nur für z) drinne. also zwischen meinen buttons


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 28, 2004 13:04 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
du musst das onidlevent dann aufrufen bzw wo alles gerendert wird...
da müssen allerdings dann auch die "Names" für die Objekte drin sein, sonst kann die selection nichts vernünftiges zurückgeben

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 28, 2004 13:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Da du den Begriff Buttons erwähnt hast, schätze ich mal das du die Selektion für deine GUI brauchst. Wenn dem so ist, dann machs do einfach (so mach ichs auch normalerweise) ohne Selektion.
Da du ja sowieso nur im Ortho-Modus arbeitest, kennst du sowohl die absolute Position deiner 2D-GUI-Elemente als auch deren Dimensionen. Da musst du dann nur die Mausposition ermitteln und gucken ob diese Position innerhalb eines deiner Steuerelemente liegt. Den Ortho-Modus setzt du dann ja sowieso wahrscheinlich fest (z.B. 640x480) und dann musst du deine Fenstermauskoordinaten nur entsprechend der Fenstergröße umrechnen.
Diese Methode ist nicht nur sehr viel schneller, sondern auch weitaus weniger fehleranfällig.

Zitat:
PS: hier ist ja nichts mehr los seit ein paar Tagen... ich schau öfters mal vorbei aber nie was neues :-/

Was soll das denn heissen? Im Forum passiert doch recht viel, und News können nur welche gepostet werden wenn welche da sind. Ich klappere mehrmals am Tag alle relevanten Seiten ab, aber wenn da keine News sind kann ich auch nicht einfach welche selbst machen...

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 28, 2004 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Nein, das geht nicht...
Da ich ein 3D Menü machen will :-/

Mh, ich gucke mehrmals am Tag hier rein, doch diese Kugeln sind immer grau beim forum


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 22, 2004 16:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich nehm auch gleich mal diesen Thread für mein Selection Problem.
Also folgendes. Ich Zeichne in meiner Renderprocedure meine Karte. Diese Besteht aus Texturierten Quads. Jedes Quad hat ne Nr. (beginnend bei 1).
Das Zeichnen geht so ab:
Code:
  1. procedure TForm1.Render;
  2. begin
  3. // Die eigentliche Zeichenprocedure
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.  
  6.   glMatrixMode(GL_PROJECTION);
  7.   glLoadIdentity;
  8.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  9.  
  10.   glTranslatef(0, 0, -5);
  11.  
  12.   glMatrixMode(GL_MODELVIEW);
  13.   glLoadIdentity;
  14.  
  15.   case GVStatus of
  16.        0: ShowStartScreen;            // Zeigt des Intro Bild
  17.       ...
  18.     6,7,60..65: ShowGame;             // Zeigt das Eigentliche Spiel
  19.       ....
  20.       else Showmessage('Spiel befindet sich in undefiniertem Zustand!');
  21.   end;
  22.  
  23.   SwapBuffers(DC);
  24. end;

Der Interessante Teil von ShowGame is folgender:
Code:
  1. var i, j           : byte;
  2.     Karte          : TMaptype;
  3.     name           : word;     // Die OpenGL Namen für die Provinzen (für Selection)
  4. begin
  5.      // Selection Vorbereiten
  6.      glInitNames;
  7.      glPushName(0);
  8.      name:=0;
  9.      //------------- Karte und Sonstige Inhalte --------------------------------
  10.  
  11.      // Sicht ausrichten
  12.      glTranslatef(-Mapwidth/2,2,-(MapHeight)*1.2);
  13.      glRotatef(40,1,0,0);
  14.      glTranslatef(-1,0,-MapHeight/3);
  15.      // Fenster scrollen
  16.      glTranslatef(GVCentre.X,0,GVCentre.Y);
  17.      Karte := GVMap.Karte;
  18.      For i := 1 to MapWidth do
  19.          for j := 1 to MapHeight do
  20.              begin
  21.                 // Selectionsname speichern
  22.                 inc(name);
  23.                 glLoadName(name);
  24.  
  25.                 // Sichtbarkeit bestimmen
  26.                 If GVCheatKarteZeigen then glColor3f(1,1,1) else
  27.                 begin
  28.                 if Karte[i,j].bekannt[1]=2
  29.                    then glColor3f(1,1,1)else
  30.                 if Karte[i,j].bekannt[1]=1
  31.                    then glColor3f(0.5,0.5,0.5)
  32.                    else glColor3f(0,0,0);
  33.                 end;
  34.  
  35.                 // Bodentextur feststellen und Provinz Zeichnen
  36.                 if Karte[i,j].Provinz then
  37.                    begin
  38.                      glBindTexture(GL_TEXTURE_2D,GVTextures[16].TextureID);
  39.                      glBegin(GL_QUADS);
  40.                        glTexCoord2f(0  ,0  ); glVertex3f(i  ,0,j);
  41.                        glTexCoord2f(0  ,0.5); glVertex3f(i  ,0,j+1);
  42.                        glTexCoord2f(0.5,0.5); glVertex3f(i+1,0,j+1);
  43.                        glTexCoord2f(0.5,0  ); glVertex3f(i+1,0,j);
  44.                      glEnd;
  45.                    end else
  46.                    FindWasserTex(Karte,i,j);
  47.                 //GVModels[0].Render;
  48.              end;
  49.  
  50.  
  51.      //----------------------- Menüs -------------------------------------------
  52.      glColor3f(1.0,1.0,1.0); // Damit Texturen mit orginal Farbe angezeigt werden
  53.      glLoadName(0);          // Menüs werden für die Selection gekennzeichnet
  54.      ShowGameBars;
  55. end;

In \"FindWasserTex()\" wird auch nur ein Texturiertes Quad gezeichnet. (Hier wird allerdings die Textur nach bestimmten Kriterien ausgerichtet.)

Die Selection ist nahezu identisch der im Tutorial:
Code:
  1. function TForm1.Selection(xs,ys : integer) : integer;
  2. var Puffer       : array[0..256] of GLUInt;
  3.     Viewport     : TGLVectori4;
  4.     Treffer,i    : Integer;
  5.     Z_Wert       : GLUInt;
  6.     Getroffen    : GLUInt;
  7. begin
  8.      glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  9.      glSelectBuffer(256, @Puffer);               //Den Puffer zuordnen
  10.      glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  11.      glmatrixmode(gl_projection);
  12.      glPushMatrix;
  13.      glLoadIdentity;
  14.  
  15.      gluPickMatrix(xs, Viewport[3]-ys, 1.0, 1.0, viewport);
  16.      gluPerspective(45.0, form1.ClientWidth/form1.ClientHeight, 1, 100);
  17.  
  18.      Form1.render;
  19.  
  20.      glmatrixmode(gl_projection);                //Wieder in den Projektionsmodus
  21.      glPopMatrix;                                //um unsere alte Matrix wiederherzustellen
  22.  
  23.      treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  24.  
  25.      Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  26.      Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  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.      if treffer = -1
  34.         then Result := treffer
  35.         else Result := getroffen;  
  36. end;


Das Problem ist, dass ich immer -1 Treffer habe. Soll heißen nix getroffen. Was mach ich falsch??

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 22, 2004 17:47 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich bin immer noch net weiter...hatte spekuliert, dass der gluPerspective() aufruf probleme macht, da ich im rendern nochmal gluPerspective aufrufe.
Habe den Aufruf im Selection mal auskommentiert ohne Resultat. Den im "Render" kann ich net rausnehmen da ja für jedes Zeichnen gebraucht.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 22, 2004 17:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
gluPickMatrix creates a projection matrix that can be used to restrict drawing to a small region of the viewport. This is typically useful to determine what objects are being drawn near the cursor. Use gluPickMatrix to restrict drawing to a small region around the cursor.


D.h. das gluPickMatrix eine passende Projectionsmatrix für deinen Selektionsbereich erstellt. Du lädst aber in deinem Renderaufruf mit glLoadIdentity die Identätsprojektionsmatrix, machst damit also quasi den Aufruf von gluPickMatrix zunichte. Deshalb mach folgendes in der Renderprozedur :
Code:
  1. RenderMode := glGet(GL_RENDER_MODE);
  2. if RenderMode = GL_RENDER then
  3.  gluPerspective(...);

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 22, 2004 18:16 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also danke erst mal soweit...das hat geholfen...
Jetzt griege ich immer als Namen die 0 zurück. 0 sind bei mir die Menüs im Spiel.

Blöderweise Click ich aber mitten auf die Karte, also Nix mit Menü. Woran könnte das Liegen?

EDIT: Habe gerade noch etwas geändert (erfolglos)

Da meine Spielmenüs im Orthomodus gezeichnet werden, und das die Perspektivmatrix für die Selection natürlich zerstört, habe ich den Aufruf von ShowGameBars auch vom Rendermode abhängig gemacht.
Code:
  1.  
  2.      glGetIntegerv(GL_RENDER_MODE, @RenderMode);
  3.      if RenderMode = GL_RENDER
  4.         then ShowGameBars;

Wie gesagt, hat nix geholfen....immer noch 0 überall.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 22, 2004 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dann probier mal folgendes (hoffentlich hab ich keinen Fehler gemacht) :
Code:
  1.  glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  2.      glSelectBuffer(256, @Puffer);
  3.      glRenderMode(GL_RENDER)
  4.      glmatrixmode(gl_projection);
  5.      glPushMatrix;
  6.      glLoadIdentity;
  7.  
  8.      gluPickMatrix(xs, Viewport[3]-ys, 10.0, 10.0, viewport);
  9.      gluPerspective(45.0, form1.ClientWidth/form1.ClientHeight, 1, 100);
  10.  
  11.      Form1.render;
  12.      
  13.      Sleep(5000);
  14.  
  15.      glmatrixmode(gl_projection);                
  16.      glPopMatrix;  
  17.  
  18.      treffer := glRenderMode(GL_RENDER);  
  19.  


Dann siehst du nämlich bei nem Klick für 5 Sekunden den angeklickten Bereich (den ich zu Testzwecken oben vergrößert habe), wodurch sich die Selektion recht einfach debuggen lässt. Da siehst nämlich ob gluPickMatrix an der richtigen Stelle ansetzt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 23, 2004 00:59 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
also ich hab das mal ausprobiert...es hätte von der Theorie her auch klappen müssen aber weder mit ner 1x1, 5x5, 10x10 noch 15x15 großen Clippingplane hat sich irgendwas verändert. ich habe auf die Karte geclickt und es war alles unverändert zu sehen.

Also es is irgendwie mystisch...

EDIT: Es geht!!! Juhu!!! Hatte beim Debugging beide gluPerspective gelöscht...aber ohne gehts halt net...

Endlich kanns weiter gehn....

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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]