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

Aktuelle Zeit: Mo Jul 14, 2025 19:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Selektion mit Koordinatenangaben
BeitragVerfasst: Di Sep 30, 2003 16:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
Hallo,
Ich habe mir einmal das Selektions-Tutorial angeschaut und habe jetzt eine Frage: Wenn ich ein Quadrat habe und es anklicke, wie kann ich dann die Koordinaten herausfinden, an denen ich auf das Quadrat geklickt habe?
Da das Quadrat sozusagen auf dem Boden liegt, also y immer 0 ist muss ich ja nur noch den x- und den z-Wert herausfinden, das müsste doch eigentlich gehen. Nur wie?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 30, 2003 16:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Meines Wissens kannst du die Koordinaten einer bereits gezeichneten Fläche kannst nicht so ohne weiteres nicht abfragen. Es gibt in OpenGL neben dem Render und Selektionsmodus auch noch einen Feedbackmodus. Aber als Resultat davon bekommst du nur einen Text in dem das was du gerendert hast als Klartext drinne steht. Aber das ist für dich auch recht sinnlos. Die sinnvollste Möglichkeit die du hast ist anhand des selektierten Objektes eine Klasse (oder was auch immer) zu befragen die die Koordinaten kennt. Alles andere dürfte von der Performance auch nicht so sonderlich dolle sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 30, 2003 19:48 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Bin mir nicht ganz sicher, aber lönnte man da nicht die >Selektion mit gluunprojekt (siehe FAQ) verbinden?
Ich habe damit zwar noch nie gearbeitet, aber sollte klappen (besonders, weil man die Tiefe vom Objekt ja durch die Selektion bekommt....)
Evtl. hilfts dir ja weiter.....

_________________
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: Di Sep 30, 2003 20:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Damit würdest du aber leider nur die Position des aktuellen Punktes (an der Mausposition) bekommen. Aber leider nicht die Koordinaten der Eckpunkte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 30, 2003 20:52 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Die sinnvollste Möglichkeit wird wohl vom jeweiligen Fall abhängen und das verwenden, was Lossy eX schon schrieb.

Wenn Du etwa in einem Editor oder Tile-Based Spiel eine Tile bzw. Quadrat bestimmen willst, das ausgewählt wurde, kann man meist anhand des ALgorithmus, mit dem diese Felder erstellt wurden die Eckpunkte ausrechnen. Das geht dann ja auch mit den entgültigen 3D-Koordinaten, da diese von OpenGL ja auch nur durch Matrixmultiplikation (View & Projection) generiert werden. Allerdings sollte man das dann nicht für zu viele Punkte machen.
Also je nach Situation wird es andere Möglichkeiten geben auf irgendeinem Wege an deine Koordinaten des gewählten Objektes zu kommen.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 30, 2003 21:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenns "nur" um die Selektion der Eckpunkte geht, dann lässt sich das recht einfach realisieren :
Wenn man im Selektionsmodus "rendert", dann zeichnet man nicht seine Primitiven (Quads), sondern nur GL_POINTS, und legt vor jedem Vertex einen eindeutigen Namen auf den Namstack.
Der dann beim Treffer zurückgegebene Hit beinhaltet dann die ID des angeklickten Eckpunkts.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 30, 2003 21:28 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Eckpunkte? Irre ich mich oder war nie von den Eckpunken die Rede?!?
(Sorry, wegen Offtopic... ist mir ebn bloß so aufgefallen...)

_________________
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: Mi Okt 01, 2003 07:19 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Stimmt, da habe ich was verwechselt. :( Gefragt war ja nach den Koordinaten wo man das Objekt trifft.
Aber ich hab mir noch keine großen Gedanken dazu gemacht, doch könnte man dann nicht von der Kameraposition in Mausrichtung einen Ray schicken, und dann mit Ray-Triangle-Intersection die Koordinaten bekommen? Da man das Dreieck/Rechteck ja kennt (Selection) müsste das doch gehen. Ich meine irgendsoeine Ray-Geschichte wird auch in den Picking-Algorithmen unter Direct3D verwendet, da es dort ja keinen Selection-Modus gibt. Also vielleicht mal nach Picking und DirectX bzw. Direct3D suchen. Afaik gibt's da die SDK-Samples auch alle (zumindest die hierfür interessanten) nach Delphi übersetzt. Ansonsten ist für das Verständnis der Methode der C++ Code ja auch nicht aalzu schwer.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 01, 2003 07:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
DCW_Mr_T hat geschrieben:
Eckpunkte? Irre ich mich oder war nie von den Eckpunken die Rede?!?

Ja jetzt wo du es sagst und ich mir den Text noch 2-30 Mal durchgelesen hab. :roll: :oops:

Da man durch das Picken bereits die Tiefe des Punktes hat sollte man das mit gluUnprojekt (oder wie das genau heißt) die Position des geklickten Punktes berechnen können.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 03, 2003 13:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
Ich glaube ich habe meine Frage etwas falsch gestellt: Mir geht es nicht um die Selektion, ich möchte nur auf die OpenGL-Szene klicken und dann wissen, welche x- und z-Koordinaten der Punkt mit dem y-Wert 0 hat, der an dieser Stelle ist.
Ich habe das ganze einmal mit gluunproject probiert und mir auch die anderen Beiträge zu diesem Thema angesehen, es funktioniert aber einfach nicht: Egal was ich mache, ich bekomme immer als Endwert die Zahl -9,22337203685478E18 heraus. Hat jemand eine Ahnung was das für eine Zahl ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 03, 2003 15:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Eine sehr hohe negative Zahl. Ist aber auch wurscht - so kann das nämlich ohnehin nicht klappen.

Anhand deiner Fragestellung nehme ich mal an, dass du mit Y die Tiefe meinst - An der Tiefe 0 hat das Szenario aber keine (bzw. eine unendliche) Ausdehnung, somit kannst du auch keine x- und y- Koordinaten berechnen. Es hat schon seinen Sinn, dass ZNear in OpenGL niemals 0 sein kann:
Wenn du zum Fenster raus schaust, kannst du dir dein Blickfeld als einen Kegel mit der Spitze in deinem Auge vorstellen. Wenn nun ein Objekt die Tiefe 0 hat, steckt es dir praktisch im Auge drin, dann hast du andere Sorgen, als dich um die Mauskoordinaten darauf zu kümmern :) .

Spass beiseite - ich hoffe, es kommt halbwegs rüber, dass du an der Tiefe 0 keine x- und y- Koordinaten hast (bei mir ist die Tiefe z).
Spätestens wenn du dir überlegst, dass bei der Projektion eines Schnittpunktes durch dessen z-Wert dividierst muss dir klar werden, dass ein z-Wert von 0 keinen Sinn macht, bzw. den Punkt ins Unendliche katapultiert.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 03, 2003 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Hmm, tschuldige, beim nochmaligen Durchlesen habe ich dich wahrscheinlich falsch verstanden. Um Herauszufinden, wo die "Maus" über der Bodenplatte liegt, brauchst du eine Art Raytracing, die sich aber (wahrscheinlich nicht besonders schnell, funktioniert aber einwandfrei) auch über gluUnProject realisieren lässt - und zwar musst du einen Strahl durch das angeklickte Pixel in z-Richtung auf den Boden schießen - das funzt folgendermaßen - der Code ist aus Mcad entnommen, sind also ein paar Sachen drin, die du wahrscheinlich nicht brauchst - ich hab's aber kommentiert:

Code:
  1.  
  2.       glGetDoubleV(GL_MODELVIEW_MATRIX, Addr(modelmatrix));
  3.       glGetDoubleV(GL_PROJECTION_MATRIX, Addr(projmatrix));
  4.       glGetIntegerV(GL_VIEWPORT, Addr(viewport));
  5.       gluUnProject(x,GL.bottom-y,0, modelmatrix, projmatrix, viewport, @ox, @oy, @oz);
  6.       v1.x := ox; v1.y := oy; v1.z := oz;
  7. // v1 enthält Position an z=0
  8.  
  9.       gluUnProject(x,GL.bottom-y,0.1, modelmatrix, projmatrix, viewport, @ox, @oy, @oz);
  10.       v2.x := ox; v2.y := oy; v2.z := oz;
  11. // v2 enthält Position an z>0
  12.  
  13.       v.x := v2.x - v1.x;
  14.       v.y := v2.y - v1.y;
  15.       v.z := v2.z - v1.z;
  16. // v ist Richtungsvektor in z-Richtung
  17.  
  18.       if (abs(v.y)>0.001) and (v.y*v1.y<0) then begin
  19. // die Maus ist über dem Boden
  20.         f := v1.y / v.y;
  21.         v2.x := v1.x - f*v.x;
  22.         v2.y := v1.y - f*v.y;
  23.         v2.z := v1.z - f*v.z;
  24. // v2 enthält auf Boden projizierten Strahl - die Projektion ist sehr einfach, da die Bodenplatte keine Rotation enthält und auf der Höhe 0 liegt.
  25.  
  26.         if abs(v2.x)<0.001 then v2.x := 0;
  27.         if abs(v2.y)<0.001 then v2.y := 0;
  28.         if abs(v2.z)<0.001 then v2.z := 0;
  29.         disp := ls107 +
  30.                 FloatToStrF(v2.x, ffGeneral, 3, 3) + '  ' +
  31.                 FloatToStrF(v2.y, ffGeneral, 3, 3) + '  ' +
  32.                 FloatToStrF(v2.z, ffGeneral, 3, 3);
  33.         Org := v2;
  34. // vergiss die oberen Zeilen, die benötige ich in Mcad nur, um den Nullpunkt exakt anwählen zu können und eine Ausgabe zu tätigen
  35.       end
  36.       else begin
  37.         // hier machst du halt etwas, wenn die Maus gar nicht über dem Boden ist
  38.         // VectorSet(Org, 0, 0, 0);
  39.         ViewDirectionZ(-NewObjDist, Org);
  40.         Org := VectorAdd(Org, Vector(-vxp, -vyp, -vzp));
  41.       end;
  42.  


Ach ja, die Mausposition ist in x und y. Wie du bei der Ansicht des Codes bereits bemerkt haben dürftest musst du natürlich sicherstellen, dass sich die Maus überhaupt über der Bodenplatte befindet - liegt sie über dem Horizont, darf es dich nicht wundern, wenn du komische Werte rausbekommst (falls du dich wunderst, was mein Code macht: der stellt einfach sicher, dass ein neu generiertes Objekt schön im sichtbaren Bereich liegt).

Ich hoffe das hilft dir weiter - ich musste aber den Thread wirklich drei mal durchlesen, bis ich herausbekam, was du eigentlich wolltest :shock:

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 03, 2003 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
So langsam komme ich mir wirklich etwas blöd vor. Ich hab deinen Code jetzt eingebaut, bekomme aber immer noch das gleiche Ergebnis (Habe jetzt herausgefunden was es ist: Es ist der niedrigste Wert den eine Real-Variable annehmen kann).
Ich weiß nicht ob ich das ganze richtig eingebaut habe, also auch ob ich die richtigen Typen für deine Variablen verwendet habe und ob mein Typ point3d so richtig ist.
Hier der Code meines MouseDown-Aufrufes:


Code:
  1.  
  2. type point3d = record
  3. x,y,z:TGLFloat;
  4. end;
  5.  
  6. procedure TMainform.FormMouseDown(Sender: TObject; Button: TMouseButton;
  7.   Shift: TShiftState; X, Y: Integer);
  8. var  modelmatrix,projmatrix: TMatrix4d;
  9.      Viewport: TVector4i;
  10.      v,v1,v2,org: Point3d;
  11.      ox,oy,oz: TGLFloat;
  12.      f: TGLFloat;
  13.      disp:string;
  14. begin
  15.       glGetDoubleV(GL_MODELVIEW_MATRIX, Addr(modelmatrix));
  16.       glGetDoubleV(GL_PROJECTION_MATRIX, Addr(projmatrix));
  17.       glGetIntegerV(GL_VIEWPORT, Addr(viewport));
  18.       gluUnProject(x,Viewport[3]-y,0, modelmatrix, projmatrix, viewport, @ox, @oy, @oz);
  19.       v1.x := ox; v1.y := oy; v1.z := oz;
  20. // v1 enthält Position an z=0
  21.  
  22.       gluUnProject(x,Viewport[3]-y,0.1, modelmatrix, projmatrix, viewport, @ox, @oy, @oz);
  23.       v2.x := ox; v2.y := oy; v2.z := oz;
  24. // v2 enthält Position an z>0
  25.  
  26.       v.x := v2.x - v1.x;
  27.       v.y := v2.y - v1.y;
  28.       v.z := v2.z - v1.z;
  29. // v ist Richtungsvektor in z-Richtung
  30.  
  31.       if (abs(v.y)>0.001) and (v.y*v1.y<0) then begin
  32. // die Maus ist über dem Boden
  33.         f := v1.y / v.y;
  34.         v2.x := v1.x - f*v.x;
  35.         v2.y := v1.y - f*v.y;
  36.         v2.z := v1.z - f*v.z;
  37. // v2 enthält auf Boden projizierten Strahl - die Projektion ist sehr einfach, da die Bodenplatte keine Rotation enthält und auf der Höhe 0 liegt.
  38.  
  39.         if abs(v2.x)<0.001 then v2.x := 0;
  40.         if abs(v2.y)<0.001 then v2.y := 0;
  41.         if abs(v2.z)<0.001 then v2.z := 0;
  42.         disp := FloatToStrF(round(v2.x), ffGeneral, 3, 3) + '  ' +
  43.                 FloatToStrF(round(v2.y), ffGeneral, 3, 3) + '  ' +
  44.                 FloatToStrF(round(v2.z), ffGeneral, 3, 3);
  45.         Org := v2;
  46. // vergiss die oberen Zeilen, die benötige ich in Mcad nur, um den Nullpunkt exakt anwählen zu können und eine Ausgabe zu tätigen
  47.       end
  48.       else begin
  49.         // hier machst du halt etwas, wenn die Maus gar nicht über dem Boden ist
  50.         // VectorSet(Org, 0, 0, 0);
  51.        // ViewDirectionZ(-NewObjDist, Org);
  52.        // Org := VectorAdd(Org, Vector(-vxp, -vyp, -vzp));
  53.       end;
  54.  
  55. showmessage(disp);
  56. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 04, 2003 15:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
Habe gerade noch etwas herausgefunden: Die Werte die ich herausbekomme sind 'NAN' (= not a number). Erst dadurch dass ich sie runde werden sie zu -9,22337203685478E18. Scheinbar wird den drei Variablen in gluunproject etwas anderes als Zahlen übergeben. Weitergebracht hat mich das allerdings nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 04, 2003 15:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Probiers mal statt mit TGLFloat mit TGLDouble.Sowohl gluProject als auch gluUnProject übergeben dir in deinen Koordinaten Doublewerte,und deshalb bekommst du bei der Nutzung von Singlewerten auch unbrauchbare Werte.

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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


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.014s | 15 Queries | GZIP : On ]