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

Aktuelle Zeit: Fr Jul 18, 2025 11:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 12, 2004 15:55 
Offline
DGL Member

Registriert: Mo Jan 12, 2004 15:48
Beiträge: 7
Hi.

Ich habe in meinem Programm eine Grundfläche auf dem Boden, bestehend aus mehreren GL_QUADS. Dank eines Tutorials von dieser Seite bin ich auch in der Lage, herauszufinden, auf welches dieser Quadrate vom Benutzer geklickt wurde, allerdings brauche ich auch noch die Position auf selbigem Quadrat, da ich genau dort ein Objekt hinbewegen möchte.
Wie kann man diese Position ermitteln???

MfG
rtfm


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 12, 2004 16:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Um die 2D-Mausposition zum Zeitpunkt des Klicks in eine 3D-Position zu wandeln, gibt es die Funktion gluUnproject. Dieser musst du neben den X/Y-Koordinaten der Maus allerdings auch noch den Z-Wert an der geklikten Position übergeben, welcher sich mittels glReadPixels (Format = GL_DEPTH) ermitteln lässt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 12, 2004 16:40 
Offline
DGL Member

Registriert: Mo Jan 12, 2004 15:48
Beiträge: 7
Zitat:
model
Specifies the modelview matrix (as from a glGetDoublev call).

Aus irgendeinem Grund bin ich gerade geistig nicht in der Lage, zu wissen, was ich für Model und für Proj einsetzen muss *verzweifel*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 12, 2004 16:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Du musst mittels des Befehls glGetDoublev einmal die Projektionsmatrix und einmal die Modelansichtsmatrix in eine eigene Variable (z.B. Proj : array[0..15] of Double) speichern und diese dann an gluUnproject übergeben.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 12, 2004 16:53 
Offline
DGL Member

Registriert: Mo Jan 12, 2004 15:48
Beiträge: 7
Zitat:
Temp : Array[0..3] Of glFloat;

glReadPixels(MausPosX, MausPosY, 800, 600, GL_DEPTH, GL_FLOAT, @Temp);


Irgendwie bekomme ich für den Z-Wert immer 0 raus. Allerdings sollte der rein theoretisch bei -1 liegen. Könnte mein Fehler bereits hier liegen??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 12, 2004 16:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ja, bei OpenGL (Grundlagen!) liegt der Urpsrung nicht oben/links, sondern unten/links. Du musst also vorher den Viewport ermitteln :
Code:
  1. Viewport     : TVector4i;
  2. glGetIntegerv(GL_VIEWPORT, @viewport);

Und dann von Viewport[3] deine Y-Position abziehen. Das sind aber Grundlagen die man als OpenGL-Programmierer kennen sollte, bevor man sich mit schwererer Materie auseinandersetzen will.

P.S. : Sicher das du ganze 800x600 Pixel in deinen Temppuffer einlesen willst? Eigentlich müsste ein Pixel doch reichen :shock:

P.P.S. : Und warum Temp : Array[0..3] Of glFloat;? Wenn du einen Pixel auslesen willst, bekommst du nur einen Floatwert in dem die Tiefeninformation steht.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2004 12:40 
Offline
DGL Member

Registriert: Mo Jan 12, 2004 15:48
Beiträge: 7
Danke erstmal.
Eigentlich bin ich auch noch dabei, Grundlagen zu lernen. Allerdings hat es mich mal interessiert, ob und wie man so eine Abfrage realisieren kann.
Ich werd mir auf jeden Fall nochmal die Tutorials durchlesen und versuchen, sie genau zu verstehen.
Aber eine Frage bezüglich dieses Threads hab ich trotzdem noch:
Kommt dort der X/Y-Wert des Klicks in der 3D-Welt oder auf dem angeklickten Polygon heraus??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2004 13:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das kommt ganz darauf an was für eine Tiefe (WinZ) du übergibst. Da du aus dem Tiefenbuffer die Tiefe liest bekommst du die Koordinate des Polygons herraus. Wenn du als Tiefe 5 übergeben würdest, dann würdest du die Koordinate dieses Punktes bekommen. Wobei das letztere eher selten sinnvoll ist. Außer du willst Objekte anhand von einer Mausposition erstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2004 19:42 
Offline
DGL Member

Registriert: Mo Jan 12, 2004 15:48
Beiträge: 7
Ich würd mal darauf tippen, dass ich irgendwas falsch mache...
Ich erhalte immer die gleichen Werte für einzelne Positionen, selbst dann, wenn dort kein Objekt ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2004 19:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dann machst du definitiv was falsch. Poste mal die relevanten Codeteile, dann kann man besser helfen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2004 19:57 
Offline
DGL Member

Registriert: Mo Jan 12, 2004 15:48
Beiträge: 7
Code:
  1. Procedure Koordinaten(mpX, mpY : Integer; Var X,Y,Z : glDouble);
  2. Var
  3.   Viewport   : Array [1..4]  Of Integer;
  4.   ModelView  : Array [1..16] Of Double;
  5.   Projection : Array [1..16] Of Double;
  6.   winZ       : glFloat;
  7. Begin
  8.   ZeichneSzene;
  9.   glGetDoublev(GL_MODELVIEW_MATRIX, @ModelView);
  10.   glGetDoublev(GL_PROJECTION_MATRIX, @Projection);
  11.   glGetIntegerv(GL_VIEWPORT, @Viewport);
  12.   glReadPixels(mpX, -mpY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @winZ);
  13.   gluUnProject(mpX, viewport[4]-mpY, winZ,
  14.                @ModelView, @Projection, @ViewPort,
  15.                X, Y, Z);
  16. End;


Das hab ich so ungefähr von einer anderen Seite übernommen.
Stellt es ein Problem dar, dass ich gluLookAt verwende?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2004 20:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hab doch oben erwähnt, das der Ursprung bei OpenGL unten/links liegt, also musst du das natürlich auch bei glReadPixels (so wie dus doch bei gluUnProject) gemacht hast berücksichtigen. Momentan liest du an ner komplett falschen Stelle den Tiefenwert aus, nämlich an ner negativen Fensterposition, also im Endeffekt gar nix, und eigentlich müsste dir dann OpenGL auch nen Fehler liefern (glGetError).

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2004 20:12 
Offline
DGL Member

Registriert: Mo Jan 12, 2004 15:48
Beiträge: 7
Ups. Das hab ich irgendwie übersehen.
Aber vielen Dank!! Jetzt funktioniert das ganze auch *freu*


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.008s | 15 Queries | GZIP : On ]