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

Aktuelle Zeit: Di Jul 15, 2025 06:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Problem mit gluUnProject
BeitragVerfasst: Di Aug 23, 2005 13:22 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bin gerade etwas verwirrt. Habe folgenden Code:

Code:
  1.  
  2. var viewport  : TGLVectori4;
  3.     modelview : TGLMatrixd4;
  4.     projection: TGLMatrixd4;
  5.     rX,rY,rZ  : PGLdouble;
  6.  
  7.     glGetDoublev(GL_MODELVIEW_MATRIX, @modelview ); //Aktuelle Modelview Matrix in einer Variable ablegen
  8.     glGetDoublev(GL_PROJECTION_MATRIX, @projection ); //Aktuelle Projection[s] Matrix in einer Variable ablegen
  9.     glGetIntegerv(GL_VIEWPORT, @viewport ); // Aktuellen Viewport in einer Variable ablegen
  10.  
  11.     gluUnProject(x,y,0,ModelView,Projection,ViewPort,rX,rY,rZ);
  12.  


Beim Aufruf von gluUnProject() wird eine "Zugriffsverletzung bei Adresse 68FCA955 im Modul 'GLU32.dll'. Schreiben von Adresse 77D1E905" ausgelöst.

Ich benutze die DGLOpenGL.pas (1.5). OpenGL ist initialisiert. Ich habe zu dem Zeitpunkt schon was gezeichnet. Andere GLU Befehle werden Problemlos aufgerufen.

Ich hab im Debugger die Variablen gecheckt. Alle Matrizen und Eingehende Variablen scheinen korrekte Werte zu enthalten.

glGetError sagt bis zum AUfruf von gluUnProject seien keine Fehler aufgetreten

Was mach ich falsch?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 13:33 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
rX,rY,rZ : GLdouble; müssen als GLdouble deklariert werden und der Zeiger dann erst beim Aufruf gluUnProject(x,y,0,ModelView,Projection,ViewPort,@rX,@rY,@rZ); erstellt werden, sonst zeigen die Variblen irgendwo (vermutlich 77D1E905) hin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 14:03 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Danke...jetzt gehts...zumindest bekomme ich ergebnisse.
Diese stimmen aber, wie sollte es auch anders sein, nicht mit meinen Erwartungen überein.
Ich erklär mal kurz was ich machen will:

Ich hab ein Modell von einer Atomstruktur. Jetzt möchte ich eine Kameraflugbahn definieren. Bisher hab ich die Positionsangabe von Checkpoints auf der Route manuell gemacht (Scrollbars + Editfelder).
Das will ich jetzt per Mouse machen. Also benutze ich das MouseMove Ereignis und übergebe die X/Y Koordinaten an gluUnProjekt. Mein Modell befindet sich immer im Koord.UrSprung. Das Modell ist ungefähr 10 GLEinheiten breit.
Aber egal welche X/Y übergeben werden, die zurückgelieferten Koordinaten sind immer deutlich kleiner als 1. Wenn ich das Zentrum des Bildschirms übergebe (welche auf dem KOU zeigt) bei einer Tiefe von 0, dann liefert mir gluUnProjekt nicht 0,0,0 zurück.

Also...im Moment bin ich gerade nicht in der Lage zu verstehn, wieso das nicht funktioniert.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 17:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die z Koordinate von 0 könnte zu klein sein. Falls die Darstellung zweidimensional ist, könnte es einfacher sein das ganze direkt umzurechnen,denn man weiß ja welchen Bereich man darstellen möchte, als mit glu zu hantieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 20:14 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich hab leider keine Ortho-darstellung. Is ganz normal 3D. Ich werd bei Zeiten nochmal den relevanten Code posten. Bis dahin erstmal danke.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 30, 2005 11:22 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
So hier nochmal mein Code und ne genauere Beschreibung:

Code:
  1. glGetDoublev(GL_MODELVIEW_MATRIX, @modelview ); //Aktuelle Modelview Matrix in einer Variable ablegen
  2. glGetDoublev(GL_PROJECTION_MATRIX, @projection ); //Aktuelle Projection[s] Matrix in einer Variable ablegen
  3. glGetIntegerv(GL_VIEWPORT, @viewport ); // Aktuellen Viewport in einer Variable ablegen
  4.  
  5. d := CP.Pos[RenderOptions.aktProjection-1];
  6. gluUnProject(x,viewport[3] - y,d,ModelView,Projection,ViewPort,@rX,@rY,@rZ);
  7.  
  8. aktX := round(rX);
  9. aktY := round(rY);


Folgendes Ziel habe ich:

Stellt euch vor ihr habt eine Achsenparallele projektion vor euch...sagen wir mal wir schauen entlang der X-Achse.
Vor euch schwebt im Raum ein Punkt.
Jetzt möchte ich diesen Punkt mit der Maus "Verschieben" bzw. "Wegziehen". Die Tiefe (also in diesem Fall die X-Koordinate) bleibt davon unbeeindruckt. Nur die YZ-Koordinten werden geändert. Um das ganze noch doller zu machen will ich immer in ganzen OpenGL-Einheiten verschieben. Deshalb runde ich das Ergebnis auf den nächsten Integerwert.

Im obigen Kode ist d die Tiefe des Punktes. Je nach Projektionsrichtung muss ich dazu eine andere Koordinate nehmen (aus X-Richtung X, aus Y-Richtung Y, ...). Das mit dem Viewport[3] hab ich aus dem Wiki. Mit oder ohne diesem Code, macht keinen unterschied...die Ergebnisse sind auf alle Fälle falsch. Diesmal (seitdem ich d statt 0 nehme) kommen viiiiiiel zu große ergebnisse raus. (400 OpenGL Einheiten sind schon ganz schon viel... ;) )

Was mach ich falsch?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 30, 2005 12:41 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Das mit dem ViewPort[3] - Y funktioniert nur, wenn du den Viewport auch nach deinen Fensterkoordinaten gesetzt hast, also die Höhe des Fensters.
Denke mal, das wusstest du schon und daran liegts nicht, aber kann ja alles sein :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 30, 2005 14:30 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mein Fenster ist ein Panel, und das müsste gegeben sein. Hat damit aber eigentlich nix zutun. gluUnProjekt liefert mir einfach unrealistische Werte. Keine Ahnung wieso.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 30, 2005 14:38 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
DP-Löschen

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Zuletzt geändert von Flash am Di Aug 30, 2005 14:44, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 30, 2005 14:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Mein Vorschlag:

alte Objekt Position nehmen: mit gluProject Tiefe berechnen. Dann diesen Z wert mit den neuen Mauskoordinaten an gluUnProject übergeben um neue Position zu ermitteln.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 30, 2005 14:46 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Danke...das hat mir schon etwas weiter geholfen. Jetzt liefert gluUnProjekt immer für x 0 zurück. y bekommt korrekte Werte.

Code:
Code:
  1. glGetDoublev(GL_MODELVIEW_MATRIX, @modelview ); //Aktuelle Modelview Matrix in einer Variable ablegen
  2. glGetDoublev(GL_PROJECTION_MATRIX, @projection ); //Aktuelle Projection[s] Matrix in einer Variable ablegen
  3. glGetIntegerv(GL_VIEWPORT, @viewport ); // Aktuellen Viewport in einer Variable ablegen
  4.  
  5. gluProject(CP.Pos[0],CP.Pos[1],CP.Pos[2],modelview,projection,viewport,@rX,@rY,@rZ);
  6. gluUnProject(x,viewport[3] - y,rZ,ModelView,Projection,ViewPort,@rX,@rY,@rZ);
  7.  
  8. aktX := round(rX);
  9. aktY := round(rY);

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 30, 2005 15:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Also in dem geposteten Code kann ich nichts falsches entdecken. Schau dir mal die Z Werte auch mit an! evt. hast du eine Matrix etwas unglücklich gesetzt.

Ansonsten poste doch auch die Deklarationen der Variablen mit. Kann hier ja hier viel ausmachen ob man double oder float/single benutzt.
Flo


PS: Kannst du das nächste mal wieder pascal statt code blocks verwenden? Danke :)

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 02, 2005 01:07 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das mit dem Z war natürlich der Punkt.... Diesen Teil des Problems habe ich somit gelöst, aber es gibt ein neues Problem und zwar mit dem zurückrechnen bei geändertet Projektion. Um was es da genau geht, schreib ich, wenn ich den Problemcode zur hand habe... ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 02, 2005 15:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
So...hier kommt das versprochene Problem...

Zuerst die Beschreibung:

Ich habe durch die Lösung des ersten Problems folgendes erreicht. Die Position der Maus wird im MousOver-Event in Weltkoordinaten umgerechnet und in z.B: CPManipulation.CPNextPos gespeichert.
Beim nächsten Zeichendurchlauf möchte ich nun an der entsprechenden Stelle eine (transparentes) Quad anzeigen. Dazu wechlse ich in eine Orthogonale Projektion, welche die Ausmaße der Zeichenfläche hat. Die Modelviewmatrix wird nicht zurückgesetzt, da sie genau so steht, wie die Sie bei der Speicherung von CPNextPos stand.

Wenn ich nun aber die Gespeicherten Werte in gluProject übergebe, kömmen keine Sinnvollen werte heraus. Die Z-Screenkoordinaten sollte bei der Umwandlung ja keine entscheidente rolle spielen, da der Screenbereich nunmal nur 2D ist.

Was muss ich ändern, damit gluProject mir die Position auf dem Panel zurückliefert, an der CPNextPos gerendert werden würde?

Und hier noch der Code:
Code:
  1.      glMatrixMode(GL_PROJECTION);
  2.      glPushMatrix;
  3.      glLoadIdentity;
  4.      glOrtho(0,HptFenster.Panel1.Width-1,0,HptFenster.Panel1.Height-1,-1,10);
  5.  
  6.      glMatrixMode(GL_MODELVIEW);
  7.      glPushMatrix;
  8.      // nicht glLoadIdentity aufrufen, weil MVMatric bereits richtig ausgerichtet ist.
  9.      //glLoadIdentity;
  10.  
  11.      glGetDoublev(GL_MODELVIEW_MATRIX, @modelview ); //Aktuelle Modelview Matrix in einer Variable ablegen
  12.      glGetDoublev(GL_PROJECTION_MATRIX, @projection ); //Aktuelle Projection[s] Matrix in einer Variable ablegen
  13.      glGetIntegerv(GL_VIEWPORT, @viewport ); // Aktuellen Viewport in einer Variable ablegen
  14.  
  15.      if CPManipulation.ShowWhat = 0
  16.         then begin
  17.                gluProject(CPManipulation.CPNextPos[0],CPManipulation.CPNextPos[1],CPManipulation.CPNextPos[2],modelview,projection,viewport,@rX,@rY,@rZ);
  18.                glColor4f(0.5,1.0,0.5,0.75);
  19.              end
  20.         else begin
  21.                gluProject(CPManipulation.CPNextLookAt[0],CPManipulation.CPNextLookAt[1],CPManipulation.CPNextLookAt[2],modelview,projection,viewport,@rX,@rY,@rZ);
  22.                glColor4f(1.0,0.5,0.5,0.75);
  23.              end;
  24.  
  25.      iX := round(rX);
  26.      iY := round(rY);
  27.  
  28.      glDisable(GL_DEPTH_TEST);
  29.      glDisable(GL_CULL_FACE); //Nur zu Testzwecken
  30.  
  31.      glBegin(GL_QUADS);
  32.        glVertex2i(iX-1,iY+1);
  33.        glVertex2i(iX-1,iY-1);
  34.        glVertex2i(iX+1,iY-1);
  35.        glVertex2i(iX+1,iY+1);
  36.      glEnd;
  37.      glEnable(GL_DEPTH_TEST);
  38.      glEnable(GL_CULL_FACE);
  39.  
  40.      glPopMatrix;
  41.      glMatrixMode(GL_PROJECTION);
  42.      glPopMatrix;
  43.      glMatrixMode(GL_MODELVIEW);

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 02, 2005 17:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Flash hat geschrieben:
So...hier kommt das versprochene Problem...

Zuerst die Beschreibung:

Ich habe durch die Lösung des ersten Problems folgendes erreicht. Die Position der Maus wird im MousOver-Event in Weltkoordinaten umgerechnet und in z.B: CPManipulation.CPNextPos gespeichert.

Wieso? Die Maus hat doch bereits "Weltkoordinaten" nur Z fehlt dir halt. Das Z bekommst du in dem du wie gesagt mit gluProejct mit den gleichen Daten aufrufst wie mit dennen du dein Objekt zeichnest. Also die Model, Projektion von dem Zeitpunkt an dem du dein Objekt zeichnest und natürlich auch die Position von deinen Objekt.

Dann hast du die genaue Position an die dein zweites Objekt soll nur halt in Weltkoordinaten. gluUnProject wandelt sie dir wieder in Objektkoordinaten um(mit den gleichen Matrizen und Viewport wie vorher aufrufen). An diesen Objektkoordinaten zeichnest du nun im nächsten Durchlauf dein weises Quadrat und gut ist.

Was handtierst du da mit einer orthogonalen Projektionsmatrix rum??

Also entweder ich verstehe dich falsch oder du machst es dir unnötig schwer ;).

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


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


Wer ist online?

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