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

Aktuelle Zeit: Mi Jul 16, 2025 21:48

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Nov 19, 2006 16:29 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Hallo,

Ich habe ein Problem, das (wahrscheinlich) in den Bereich der Selektion fallen würde, ich bin mir aber nicht sicher:

Ich habe eine Heightmap geladen und möchte, dass ich die XY-Koordinaten einer Position, die ich anklicke, auf der Heightmap bekomme.

Wenn man es über Selektion machen würde, müsste man, so wie ich es verstanden habe, jedem Triangle einen Namen zuweisen, und das wäre mehr als nur umständlich und außerdem nicht so genau. Ich wollte nämlich X&Y als Fließkommazahlen.

Hat einer ne Ahnung wie ich das am besten anstelle?
Wenn unklar ist was ich meine, bitte einfach fragen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 19, 2006 16:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Die Antwort heißt glUnproject. Im Wiki dürftest du dazu ausreichend Informationen finden.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 19, 2006 18:01 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Das ist sicher schon mal der richtige Ansatz, aber ich hab leider nur die X und Y-Koordinate (Mausposition) der Fensterkoordinaten,
Z fehlt mir, da möchte ich den Z-Wert des Objektes, das am nächsen zum Viewpoint ist. (Also die Objekt-Coords der Stelle, auf die ich wirklich klicke).
Geht das irgendwie?

PS: Du hast doch gluUnProject gemeint, oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 19, 2006 19:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ja, ich meinte gluUnProject.
Ich versteh jetzt deinen zweiten Post nicht so richtig. Mit der Beispiel-Funktion im o.g. Wikiartikel, kannst du ja genau das erreichen, du gibst deine Mauskoordinaten auf dem Fenster ein und erhältst die 3D-Position der Maus auf dem Terrain.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 20, 2006 21:42 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Sorry ich hab nur auf die Definition geschaut und nicht auf das Beispiel wo ja schon ne Lösung gebracht wird.

Ich hab allerdings immer noch ein Problem damit: Und zwar hab ich keinen Schimmer wie die erhaltenen 3d-Koordinaten in Zusammenhang mit z.B. den Koordinaten einer der Ecken der Karte (z.B. des Ursprungs oben links in der Heightmap) stehen, ich brauch aber solche Viewpoint-unabhängigen Koordinaten um eine Einheit wie nen Soldat (soll nämlich ein Strategiespiel werden) dahin schicken zu können.
Ich hoffe du verstehst was ich meine.

Ich würde mich auf eine Antwort freuen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 21, 2006 05:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Hier ist halt ein wenig Denkarbeit angebracht. Aber wenn du weißt, wie groß dein Feld ist, wo es beginnt, und wo man geklickt hat, dürfte es ganz einfach sein. Falls dein Feld im Ursprung beginnt, dann ist es natürlich ganz einfach, dann kannst du direkt die Koordinaten, die dir gluUnProject liefert, weiterverwenden. Andernfalls musst du von diesen Koordinaten (gluU...) den Ursprung deines Feldes abziehen. Wenn du allerdings auch noch skalierst oder dein Feld irgendwie anders aufgebaut hast, musst du selber auf ne Lösung kommen, bzw du postest mal ein Bild/eine Zeichnung.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 14:01 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Irgendwie bekomm ich nur Zahlen aus gluUnproject heraus, die (für mich jedenfalls) nicht den geringsten Sinn ergeben, z.B. sind sie unterschiedlich, wenn man denselben Punkt aus verschiedenen Perspektiven anvisiert und die Funktion aufruft.
Meinst du ich kann hier mal nen gekürzten Quelltext posten oder es sonstwie übermitteln, damit du mir sagen kannst ob ich die Funktion falsch verwende oder irgendwie nicht richtig interpretiert habe?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 15:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also gluUnProject liefert dir genau die Koordinaten die du in deinem Objekt hast. Also wenn sich dein Quad von 0 bis 1 erstreckt bekommst du auch Werte von 0 bis 1. Das wichtige dabei ist aber, dass du auf jeden Fall die Matrizen zum Berechen brauchst die du bei dem Zeichnen des Objektes hast. Solltest du anschließend noch etwas anderes zeichnen wollen etc dann wird das Ergebniss nicht stimmen.

Mal eine kleine Veranschaulichung.

Code:
  1.  
  2.   glTranslatef(0, 0, -7.5);
  3.   glScalef(?, ? ,?);
  4.   glRotatef(?, 1, 0, 0);
  5.   glRotatef(?, 0, 1, 0);
  6.   glRotatef(?, 0, 0, 1);
  7.  
  8.   glBegin(GL_QUADS);
  9.     // Quads zeichnen
  10.     // optimaler Weise würden diese ab 0, 0 anfangen und sich nach
  11.     // 10, 10 (oder so) erstrecken
  12.   glEnd;
  13.  
  14.   // um es sinnvoll berechnen zu können brauchst du die Matrizen
  15.   // von DIESEM Punkt. Also da wo du deine Map zeichnest.
  16.   // Wichtig ist nur, dass du die ModelView nicht veränderst.
  17.   // Auch nicht beim Zeichnen deiner Map.
  18.  
  19.   glTranslatef(0, 0, -7.5);
  20.   glScalef(?, ? ,?);
  21.  
  22.   // An dieser Stelle (und nachfolgend) wären die Matrizen schon verändert
  23.   // und die Berechnung würde keine richtigen Ergebnisse mehr liefern.
  24.  
  25.   glBegin(GL_QUADS);
  26.     // Weiter Flächen zeichnen
  27.   glEnd;


Als kleine Anmerkung. Der Viewport und die Projektion ändern sich normalerweise nicht so häufig. Aber die Modelview Matrix ändert sich normalerweise ständig. Um ein wenig Leistung einzuparen sollte es genügen, wenn du zu diesem Zeitpunkt die ModelView (wie aus dem Wiki) sicherst. Die Tiefe, Projektion und den Viewport kannst du bei Bedarf auslesen. Ist sicherlich auch nicht optimal aber für den Anfang sollte es ausreichen.

Zum Optimieren könnte man es später sich machen, dass du beim Mausklick ein Flag (Boolean) setzt und diesen dann unten auswertest. Das Auslesen oder Setzen einer Matrix gehört leider mit zu den Operationen die man sparsam einsetzen sollte. Das aber nur mal am Rande.

Ach ja. Was du evtl auch beachten solltest. Diese Technick interessiert es nicht von was es die Koordinaten ausrechent. Solltest du also etwas vor oder auf deiner Heightmap haben so wird sie auch stumpf die Koordinaten davon ausrechnen. Und dann wirst du wieder nur dummes Zeug zurück bekommen.

PS: Wenn bedarf daran besteht kannst du natürlich immer Quellcodestückchen posten. Solltest du dein ganzes Projekt posten wollen dann immer mit allen benötigten Dateien und nur als zip. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 22:36 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
Irgendwie komm ich auf keinen grünen Zweig (es gibt schon nen Grund warum ich hier im Einsteiger-Forum frage).

hier mal meine Renderprozedur, aufs hierfür wesentliche gekürzt:

Code:
  1.  
  2.  
  3. procedure Render;
  4. var
  5.   xleft,xright,ytop,ybot,i,k:Integer;
  6.   p1y,p2y,p3y,p4y:Real;
  7. begin
  8.  
  9.   //Begrenzung des zu zeichnenden Bereiches der Heighmap durch rad(=Konstante)
  10.   if(PlayerPos.x-rad>0)then xleft:=Trunc((PlayerPos.x-rad)/Fac) else xleft:=0;
  11.   if(PlayerPos.x+rad<maxX*4)then xright:=Trunc((PlayerPos.x+rad)/Fac) else xright:=maxX-1;
  12.   if(PlayerPos.z-rad>0)then ytop:=Trunc((PlayerPos.z-rad)/Fac) else ytop:=0;
  13.   if(PlayerPos.z+rad<maxY*4)then ybot:=Trunc((PlayerPos.z+rad)/Fac) else ybot:=maxY-1;
  14.  
  15.   //ab hier wird einfach die Heighmap gelesen und gezeichnet,
  16.   glEnable(GL_CULL_FACE);
  17.   glBegin(GL_TRIANGLES);
  18.   for i:=ytop to ybot do
  19.    for k:=xleft to xright do
  20.     begin
  21.      p1y:=Heightmap[k,i];
  22.      p2y:=Heightmap[k+1,i];
  23.      p3y:=Heightmap[k,i+1];
  24.      p4y:=Heightmap[k+1,i+1];
  25.  
  26.      glVertex3f(k*Fac,p1y-1,i*Fac);
  27.      glVertex3f((k+1)*Fac,p4y-1,(i+1)*Fac);
  28.      glVertex3f((k+1)*Fac,p2y-1,i*Fac);
  29.  
  30.      glVertex3f(k*Fac,p1y-1,i*Fac);
  31.      glVertex3f(k*Fac,p3y-1,(i+1)*Fac);
  32.      glVertex3f((k+1)*Fac,p4y-1,(i+1)*Fac);
  33.     end;
  34.   glEnd;
  35.  
  36.   //ich hab jetzt die modelview und den viewport nach dem Zeichnen der HM gespeichert, um sie später verwenden zu können
  37.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelview );
  38.   glGetIntegerv(GL_VIEWPORT, @viewport );
  39.  
  40.  //hier folgen noch Einheiten und andere Objekte...
  41. end;
  42.  
  43.  


und hier die aufrufende Funktion:

Code:
  1.  
  2.  
  3. procedure TGLForm.FormMouseUp(Sender: TObject; Button: TMouseButton;
  4.   Shift: TShiftState; X, Y: Integer);
  5. var
  6.  pos:TGLVectord3;
  7. begin
  8.   pos:=WinPosTo3DPos(OMPos.X,OMpos.Y);     //OMPos=Mausposition
  9.   ShowMessage('x:'+IntToStr(trunc(pos[0]))+'; y:'+IntToStr(trunc(pos[1]))+', z:'+IntToStr(trunc(pos[2])));
  10.  end;
  11. end;
  12.  
  13.  


Wenn ich den Code ausführe, bekomm ich allerdings (fast genau) die Position der Kamera und nicht der Stelle die ich anklicke, egal wie weit weg die ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 22:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie schaut denn deine Methode WinPosTo3DPos aus? Benutzt du dort auch die von dir gespeicherten Matrizen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 24, 2006 18:48 
Offline
DGL Member

Registriert: Sa Okt 28, 2006 14:44
Beiträge: 39
So siehts soweit aus, das ist dann praktisch das Beispiel von gluUnProject, nur das jetzt viewport und modelview globale Variablen sind:

Code:
  1.  
  2.  
  3. function WinPosTo3DPos(X, Y: Integer): TGLVectord3;
  4. var
  5.   Z         : TGLdouble;
  6.   projection: TGLMatrixd4;
  7.   Y_new     : TGLInt;
  8. begin
  9.   glGetDoublev(GL_PROJECTION_MATRIX, @projection );
  10.   Y_new := viewport[3] - y;
  11.   glReadPixels(X, Y_new, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Z );
  12.   gluUnProject(X, Y_new, Z,modelview, projection,
  13.                      viewport,@Result[0], @Result[1], @Result[2]);
  14. end;
  15.  
  16.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 24, 2006 21:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Evtl wäre es dann besser, wenn du uns mal das ganze Projekt zur Verfügung stellst. Vorrausgesetzt das ist machbar und nicht ganz zu große. Falls es zu groß sein sollte kannst du es mir auch per mail schicken dann schaue ich mal oder lade es hoch.

Aber ich hatte das in meinem Projekt mal direkt so ausprobiert und dort hatte es auch genau so funktioniert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 27, 2006 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
So habe dein Projekt hochgeladen (1.3 MB) und schon mal kurz angesehen. Die eine Texture war keine Potenz von 2. Habe ich mal geändert.

Und ja irgendwie bekommt man fast die Position des Spielers raus. Er ignoriert irgendwie die Mausposition worauf ich mir so jetzt keinen Reim draus machen kann. Ich werde mir das aber später noch mal anschauen. Aber vielleicht sieht der ein oder andere mehr.


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 » Einsteiger-Fragen


Wer ist online?

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