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

Aktuelle Zeit: Mi Jul 16, 2025 09:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Mai 26, 2007 16:45 
Offline
DGL Member

Registriert: Do Jan 25, 2007 19:12
Beiträge: 17
Oki also ich habe eine recht komplexe Frage(zu der ich einfach keinen Titel finde) und bitte ersteinmal den recht nichtssagenden Titel zu entschuldigen.

Also es geht darum, dass ich herausfinden möchte, an welcher Stelle (also bei welchen 3D-Koordinaten) der Mauszeiger auf ein
Objekt trifft...

Um die Situation genauer darzustellen: Ich habe eine Landschaft, und möchte nun mit dem Cursor eine Textur an der Cursorposition drüberlegen
(Vergleichbar mit der Auswahl von C&C für Gebietsschadentechniken).
Außerdem brauche ich die Position (also X und Y) für weitere Berechnungen...

Vielen Dank für die Hilfe in Vorraus

Euer
The Fettel-Error

_________________
*sudo*
may the force
be with
you!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 26, 2007 17:07 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
mit gluunproject (ich glaub so hieß der befehl) kannst du die 2d koordinaten der maus in 3d koordinaten umrechnen, den z wert musst du afaik aus dem z-buffer auslesen (guckt dir mal den selection source an, da wird der z buffer afaik verwendet)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 26, 2007 17:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Seth: Warum Selction? Schau einfach mal in den Artikel zu gluUnProject.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 26, 2007 22:34 
Offline
DGL Member

Registriert: Do Jan 25, 2007 19:12
Beiträge: 17
joa hmkay also ich habe mir den Kauderwelsch mal angesehen und irgendwann einfach nach dem [STRG]+[C] & [STRG]+[V] gegriffen...

und habe, wie es nicht anders zu erwarten war erstmal einen Fehler bekommen, der mich darauf hinweist, dass keine overload-version von
glReadpixels besteht, die mit den entsprechend verwendeten Parametern aufgerufen werden könnte. Also ich habe jetzt nochmal gute 2 Stunden damit verbracht nen Fehler zu finden aber ich sehe nix...

das is der Code(aus dem DGLWiki-Beispiel) der den Fehler verursacht (die Datentypen poste ich mal mit):

Code:
  1.  
  2. var
  3.  ...
  4.   Z         : TGLdouble;
  5.  ...
  6. begin
  7. ...
  8. glReadPixels(X, Y_new, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Z ); // <--- hier taucht der Fehler auf
  9. ...
  10. end;
  11.  


Zitat:
There is no overload version of 'glReadPixels' that can be called with these arguments


Achso: Vielen Dank für die schnellen Antworten... großes Lob die page ist super :!: :lol:

The Fettel-Error

_________________
*sudo*
may the force
be with
you!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 27, 2007 08:38 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Ebenfalls eine leichte Möglichkeit vor allem bei komplexen Gebilden oder unterschiedlichen Klickbereichen ist es die Szene bei einem Klick noch einmal mit allen relevanten Objekten ohne Texturen, Licht und sonstigen Kram zu zeichnen. Reine Geometrie, wobei jeder Klickbereich (Objekt) in einer einmaligen Farbe gezeichnet wird. Dann brauchst nur noch den Farbwert an der aktuellen Mausposition abfragen und in einer Liste das Objekt an Hand der Farbe identifizieren.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 27, 2007 12:16 
Offline
DGL Member

Registriert: Do Jan 25, 2007 19:12
Beiträge: 17
Ja ich will ja net wissen welches Objekt angeklickt wird, sondern wo es angeklickt wurde:

Code:
  1. //Dreiecke
  2. glVertex3f (-10,-5,10);
  3. glVertex3f (10,-5,10);
  4. glVertex3f (5,5,10);
  5.  



Jetzt klicke ich in die Mitte meines Bildschirms un möchte jetzt als Rückgabe haben:

"Der Mausklick trifft Objekt 'Dreieck' an der Stelle (0,0,10)"

Ich möchte halt meine Textur am Cursor über die Textur der eigentlichen Struktur legen.

Sinn und Zweck des ganzen: Ich möchte einen Geländeeditor basteln, und mithilfe der Maus dabei das Gelände absenken oder erhöhen. dafür muss ich aber wissen, wo drauf die Maus deutet (vor allem brauche ich die exakte Position also nicht nur Objekt) um einmal dort eine Pinsel-Graphik einsetzen und dann auch tatsächlich das Gelände verändern zu können.

Vielleicht hat jemand von euch ja ne ganz andere Idee wie man so etwas realisieren könnte... trotzdem würde mich interessieren wie ich diesen Fehler bezüglich der overload-version von glReadpixels wieder loswerde^^

The Fettel Error

_________________
*sudo*
may the force
be with
you!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 27, 2007 15:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Der Quelltext im Wiki ist vermutlich falsch.
1) Die Position des Pixels muss in Integer Koordinaten angegeben werden und nicht in double.

2)Da bei als Format GL_FLOAT angegeben wurde, muss Z dann auch diesem Datentype (TGLFloat) entsprechen.

Code:
  1. function WinPosTo3DPos(X, Y: Integer): TGLVectord3;
  2. var
  3.   viewport  : TGLVectori4;
  4.   modelview : TGLMatrixd4;
  5.   projection: TGLMatrixd4;
  6.   Z         : TGLFloat;
  7.   Y_new     : Integer;
  8. begin
  9.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelview ); //Aktuelle Modelview Matrix in einer Variable ablegen
  10.   glGetDoublev(GL_PROJECTION_MATRIX, @projection ); //Aktuelle Projection[s] Matrix in einer Variable ablegen
  11.   glGetIntegerv(GL_VIEWPORT, @viewport ); // Aktuellen Viewport in einer Variable ablegen
  12.   Y_new := viewport[3] - y; // In OpenGL steigt Y von unten (0) nach oben
  13.  
  14.   // Auslesen des Tiefenpuffers an der Position (X/Y_new)
  15.   glReadPixels(X, Y_new, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Z );
  16.  
  17.   // Errechnen des Punktes welcher mit den beiden Matrizen multipliziert (X/Y_new/Z) ergibt:
  18.   gluUnProject(X, Y_new, Z,modelview, projection, viewport,@Result[0], @Result[1], @Result[2]);                        
  19. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 27, 2007 19:10 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Lossy eX hat geschrieben:
Seth: Warum Selction? Schau einfach mal in den Artikel zu gluUnProject.


ich hab doch geschrieben er soll gluunproject verwenden :shock:


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 27, 2007 20:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Lossy eX hat geschrieben:
Warum Selction?

Ähm. Du hast diese Frage aber schon gesehen, oder? Er brauch ja nicht bei der Selection schauen weil in dem Artikel von gluUnProject ist alles dabei was man braucht. :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 28, 2007 08:50 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
deshalb habe ich ja auch zuerst gluunproject geschrieben ;) aber mir den artikel net angeguckt ;)


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 28, 2007 14:57 
Offline
DGL Member

Registriert: Do Jan 25, 2007 19:12
Beiträge: 17
@LarsMiddendorf: Vielen dank ... das hat mir sehr geholfen...

Jetzt habe ich natürlich ein Probelm:
Wenn ich meine Landschaft verändere (also einzelne Höhenpunkte)
und dann auch noch die "Welt" rotieren lasse (glrotatef), kann ich ja garnet mehr von
den Weltkoordinaten auf die Texturkoordinate schließen?

Also ich hab da ein Raster mitten im Raum liegen (zB 10x10 Kontrollpunkte mit einem Abstand von 1).
Ich führe noch einen Rotatebefehl aus, der das ganze in so einer leichten 120°-Winkel bringt (zwischen Kameravector und dem Raster).
Wie bekomme ich also heraus wo auf dem raster ich mich befinde? Ich brauche ne neue kreative Idee^^

Über eine manuelle umrechnung habe ich mir schon gedanken gemacht, das bringt nur leider sehr wenig, da ich ja die Geländehöhe
editieren will, und dann das Problem habe, dass ja einige Kontrollpunkte höher liegen und somit anders gedreht werden (und ich daher mit Sin&Co net mehr weiterkomme) ... vllt hat ja jemand mit sowas erfahrung ... ein paar Vorschläge wären nice.

Ansonsten erstma danke für die Hilfe und
@Lossy&Seth: ich fand bisher alle posts verständlich... also keinen Streit vermeiden^^ :wink:

Euer The Fettel-Error

_________________
*sudo*
may the force
be with
you!


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.013s | 17 Queries | GZIP : On ]