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

Aktuelle Zeit: Fr Jul 18, 2025 11:55

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit namestack (picking)
BeitragVerfasst: Di Aug 19, 2003 15:48 
Offline
DGL Member

Registriert: Di Aug 19, 2003 15:14
Beiträge: 7
ich bin neu hier, also seid bitte nett zu mir :)

ich habe einen eigenen typ TVertex (record) erstellt und der enthält X,Y und Z (glFloat)
dann ein dynamisches array NumVertices: TVertex

die länge von NumVertices hab ich beim programmstart auf 4 gesetzt und dann zeichne ich um jeden punkt einen würfel (durchmesser 0.1)
die farbe soll blau sein, aber wenn ich die maus drüberbewege soll sich der würfel rot färben (sollen dann später die markierten/unmarkierten eckpunkte von flächen sein (so ähnlich wie bei 3dsmax 8) ))

jetzt zu meinem problem:
ich habe ein paar tutorials zum namestack gelesen (nehe, delphigl.de, ...) auch hier im forum was darüber gefunden, aber ich bekomms einfach nicht hin :(

jedesmal wenn ich mich mit der maus über ein objekt befinde, bricht der compiler mit einer fehlermeldung ab

hier jetzt mein quelltext:
zuerst mal die würfel zeichnen:
Code:
  1.  
  2.   for i := Low(MyNetz.Vertices) to High(MyNetz.Vertices) do
  3.   begin
  4.     if Selected[i] then glColor3f(1.0, 0.0, 0.0) else glColor3f(0.0, 0.0, 1.0);
  5.     glLoadName(NameVertices[i]);
  6.     glPushMatrix;
  7.     glBegin(GL_QUADS);
  8.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z + 0.05);
  9.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z + 0.05);
  10.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z + 0.05);
  11.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z + 0.05);
  12.  
  13.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z + 0.05);
  14.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z - 0.05);
  15.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z - 0.05);
  16.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z + 0.05);
  17.  
  18.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z + 0.05);
  19.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z - 0.05);
  20.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z - 0.05);
  21.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z + 0.05);
  22.  
  23.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z + 0.05);
  24.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z - 0.05);
  25.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z - 0.05);
  26.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z + 0.05);
  27.  
  28.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z + 0.05);
  29.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z - 0.05);
  30.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z - 0.05);
  31.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z + 0.05);
  32.  
  33.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z - 0.05);
  34.       glVertex3f(MyNetz.Vertices[i].X - 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z - 0.05);
  35.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y - 0.05, MyNetz.Vertices[i].Z - 0.05);
  36.       glVertex3f(MyNetz.Vertices[i].X + 0.05, MyNetz.Vertices[i].Y + 0.05, MyNetz.Vertices[i].Z - 0.05);
  37.     glEnd();
  38.   end;
  39.  


und hier meine mousemove-prozedur (später wirds sicher eine mouse-up / down, wollte mir aber vorläufig das klicken ersparen)

Code:
  1. procedure TFRAMEedit.FrameMouseMove(Sender: TObject; Shift: TShiftState; X,
  2.   Y: Integer);
  3. var
  4.   SelectBuffer: array of gluInt;
  5.   ViewPort: TViewPortArray;
  6.   Hits, i: Integer;
  7.   Choose, Depth: Integer;
  8. begin
  9.   SetLength(SelectBuffer, 512);
  10.  
  11.   glGetIntegerv(GL_VIEWPORT, @ViewPort);
  12.   glSelectBuffer(512, @SelectBuffer);
  13.  
  14.   glRenderMode(GL_SELECT);
  15.   glInitNames;
  16.   glPushName(0);
  17.  
  18.   glMatrixMode(GL_PROJECTION);
  19.   glPushMatrix;
  20.   glLoadIdentity();
  21.  
  22.   glViewPort(0, 0, Width, Height);
  23.   gluPickMatrix(X, ViewPort[3]-Y, 1.0, 1.0, ViewPort);
  24.   gluPerspective(45.0, (ViewPort[2]-ViewPort[0])/(ViewPort[3]-ViewPort[1]), 0.1, 2048.0);
  25.  
  26.   glMatrixMode(GL_MODELVIEW);
  27.   glDraw;
  28.   glMatrixMode(GL_PROJECTION);
  29.   glPopMatrix;
  30.   glMatrixMode(GL_MODELVIEW);
  31.  
  32.   Hits := glRenderMode(GL_RENDER);
  33.  
  34.   if Hits > 0 then
  35.   begin
  36.     Choose := SelectBuffer[3];
  37.     Depth := SelectBuffer[1];
  38.     for i := 1 to  Hits do
  39.       if SelectBuffer[i*4+1] < Depth then
  40.       begin
  41.         Choose := SelectBuffer[i*4+3];
  42.         Depth := SelectBuffer[i*4+1];
  43.       end;
  44.   end;
  45.  
  46.   glMatrixMode(GL_PROJECTION);
  47.   glPopMatrix;
  48.   glMatrixMode(GL_MODELVIEW);
  49. end;
  50.  


spiel mich jetzt seit 2 tagen damit rum, komm aber einfach nicht dahinter wo der fehler liegt

vielleicht hat ja jemand von euch auch mal probleme mit dem thema gehabt und ein gutes tutorial parat
oder vielleicht kennt ja jemand den fehler in meinem programm

ihr seid meine letzte hoffnung :wink: !
danke im vorraus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 15:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dein Fehler liegt mit großer Wahrscheinlichkeit hier :
Code:
  1. for i := 1 to  Hits do

Ein Array beginnt in Delphi beim Index 0 und nicht bei 1, deine Schleife verletzt also die Grenzen deines Arrays und deshalb auch die Fehlermeldung.Es muss also so aussehen :
Code:
  1. for i := 0 to  Hits-1 do

Hättest du mein Tut (www.delphigl.de) genau durchgelesen, hättest du bemerkt das meine Schleife auch so aussieht, und ausserdem verfügt deine Delphi-IDE über eine Compileroption namens "Bereichsprüfung", die dich auf solche Probleme hinweist (siehe auch Debugging-Tut auf der Seite hier).

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 16:05 
Offline
DGL Member

Registriert: Di Aug 19, 2003 15:14
Beiträge: 7
@son of satan

danke für die schnelle antwort
aber das problem tritt schon ein paar zeilen vor der for-schleife auf:

Choose := SelectBuffer[3];

--

werd mir das debugging tut mal anschaun
danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 16:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Da du dein Array bereits über SetLength(SelectBuffer, 512); dimensioniert hast, kann in der Zeile die du angegeben hast gar kein Fehler auftreten, da dein Array ja mehr als drei Elemente enthält.Evtl. hat der Compiler hier Probleme mit der Fehlerallokation.

An deiner Stelle würde ich sowieso (wie in meinem Tut) ein vordimensioniertes Array (also SelectBuffer : array[0..512] of TGLUInt) nehmen, wenn du ja sowieso immer die gleiche Größe dafür verwendest.Damit umgehst du etwaige Probleme die durch die Übergabe eines dynamischen Arrays entstehen könnten.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 16:51 
Offline
DGL Member

Registriert: Di Aug 19, 2003 15:14
Beiträge: 7
@son of satan
wahsinn
du antwortest ja verdammt schnell!
SUPER

hab dein tut (delphi.de tut nr.3 is doch von dir?) gesaugt und gleich ein problem gehabt: du hast opengl12.pas verwendet, ich aber gl.pas und glu.pas (von delphi3d.net)
hab dann opengl12.pas gesaugt und dein programm compiliert -> rennt wunderbar

da dein letzter vorschlag, kein dynamisches array zu verwenden, auch nix gebracht hat, frag ich mich obs vielleicht an den units liegt?

es ist ja auch glinteger unterschiede definiert: gluint und tgluint (oder is das ein blöder vergleich?)

wenn ich statt gl und glu opengl12 einbinde, startet mein programm gar nicht erst, sondern bricht während dem initialisieren von opengl wieder ab

ich werd mal meine opengl-init-procedure umschreiben, vielleicht bringst ja was

achja: ich hab in opengl noch nicht so viel erfahrung und wahrscheinlich poste ich hier auch falsch (immerhin gibts ja einen eigenen thread für anfänger, hab ich aber zu spät entdeckt)

danke für deine unterstützung
deine tuts sind super (sind übrigens alle auf delphigl.com)
wüsste nicht, wie ich ohne eure hilfe opengl programmieren lernen sollte 8)


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

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn du die OpenGL.pas verwendest die bei Delphi dabei ist, kann dein Problem durchaus aufgrund dieses Headers entstehen, denn die OpenGL-Header von Borland sind alles andere als komplett und haben so einige Probleme.

Deshalb empfehl ich dir, nur die OpenGL12.pas zu nutzen, welche nicht nur mehr Funktionsumfang bietet sondern auch auf jeden Fall funzt.Kannst dir ja von unsrer Seite die Templates runterladen, die das komplette Framework für ein OpenGL12-Programm enthalten.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 17:52 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Code:
  1.  
  2. glSelectBuffer(512, @SelectBuffer);
  3.  

Ich bin der Ansicht, das diese Zeile einen großen Fehler enthält - ein dynamsiches Array ist as it nur ein Pointer, du übergibts also einen Pointer auf einen Pointer. Du solltest den ersten Index an das Array anhängen, etwa: @SelectBuffer[0]. Wenn dann OpenGl den Pointer mit müll beschreibt, landest du beim Zugriff auf das Array natürlich im Nirwana - Crash. Mein Debugging Tut beschreibt das übrigens: It's magic, real magic - oder Zeigerprobleme die Zweite.

Wenn du allerdings kein dynamsiches Array verwendest und es Crasht trotzdem wirds seltsam - etwa an der gleichen Stelle?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 18:25 
Offline
DGL Member

Registriert: Di Aug 19, 2003 15:14
Beiträge: 7
@Delphic

wie genau soll das in meinem fall aussehen?
glSelectBuffer(Var1, @SelectBuffer[Var2]) ?
was gehört statt Var1 und Var2? oder is das ganz falsch?

wenn ich kein dynamisches array verwende, hängt das programm in der nächsten zeile, also: Depth := SelectBuffer[1];

das ganze verwirrt mich ziemlich, dabei bin ich bis jetzt von opengl total begeistert gewesen(im gegensatz zu directx! :) )

hoffentlich krieg ich das bald hin...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 21:26 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
glSelectBuffer(512, @SelectBuffer[0])

meinte ich damit, so erzeugst du einen Pointer auf das erste Element des Arrays, wie es glSelectBuffer erwartet. Und wie SoS bereits sagte, würde ich unbedingt auf eine aktuellere OpenGl Unit umsteigen, u.U. liegt der Fehler hier, aber dafür kenne ich die Borland Unit zu schlecht(ich weiß bloß, das ich in meinen OpenGl Schritten damit böse auf die Nase gefallen bin). Dazu lese man vielleicht auch in den FAQ nach, wie man es vermeidet, alle Typennamen umschreiben zu müssen - eigentlich trivial, aber manchmal sollte man doch an diese Möglichkeit erinnern: viewtopic.php?t=1229

Könntest du vielleicht auch noch sagen, mit welcher Fehlermeldung das Programm sich genau abmeldet?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 21:40 
Offline
DGL Member

Registriert: Di Aug 19, 2003 15:14
Beiträge: 7
hallo DelphiC!
hab folgendes geändert: anstatt Hits, i, Choose und Depth als Integer zu definieren hab ichs mit gluInt probiert und jetzt "funkts" ohne Fehlermeldung

allerdings gibt er mir lediglich eine 0 zurück, sobald ich den cursor über irgendein gl objekt bewege

ich kapier das mit dem buffer nicht ganz (und dem array)
SelectBuffer[0..521] gibt insgesamt max. 521 treffer zurück an der aktuellen mauspos, richtig?
aber an stelle 3 befindet sich der namen des objektes

vielleicht kannst du mir das in ein paar einfachen sätzen verklickern, so dass ich das auch schnall' :lol:

bin grad am googeln, aber wenn das auch nix bringt wäre vielleicht das redbook eine gute idee zum nachschlagen...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 21:43 
Offline
DGL Member

Registriert: Di Aug 19, 2003 15:14
Beiträge: 7
achja: hab noch was vergessen!

ich benutze die units gl.pas und glu.pas von delphi3d.net
glaub nicht, dass das gleiche is wie die opengl.pas von borland

falls die opengl12.pas aber "besser" ist, steig ich natürlich um


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 22:11 
Offline
DGL Member

Registriert: Di Aug 19, 2003 15:14
Beiträge: 7
ich habs geschafft! :D
ich hab meinem array NameVertices keine werte zugewiesen, deswegen haben alle stellen den wert 0 gehabt... (is mir jetzt zwar peinlich, aber so is es :oops: )
jetzt liefert mir der namestack den richtigen integerwert zurück...

problem gelöst
danke für eure hilfe delphic und sos


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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 | 16 Queries | GZIP : On ]