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

Aktuelle Zeit: Fr Jul 18, 2025 16:40

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Wie funktioniert gluUnProject?
BeitragVerfasst: Do Mai 12, 2005 22:30 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich würde gerne mal wissen was intern bei gluUnProject abgeht. Also woher weis OpenGL auf welcher Tiefe (im Raum) der User geklickt hat? Geht das über heuristiken, oder was? Im Wiki (und damit in allen bekannten Dokumentationen) steht leider nix greifbares. Würde das gerne wissen (und dann nachtragen.)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 13, 2005 21:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Wenn man davon ausgeht das man nur die Wirkung der Matrizen umkehren braucht, dann hätte ich sogar zwei Lösungvorschläge. Was mich an der Sache noch stutzen läßt ist das gluUnProjekt einen Viewport braucht.

Wenn wir in OpenGL einen Punkt angeben so wird dieser zunächst mit der Modelviewmatrix multipliziert und dann mit der Projektionsmatrix. Um das ganze zu vereinfachen schlage ich erstmal vor die beiden Matrizen in einer zusammenzufassen.Wenn zum Beispiel die Projektionsmatrix eine Skallierung bewirkt und die Modelviewmatrix ist eine Verschiebung so lassen sie sich duch Multiplikation(?) zusammen fassen.

a)Nun haben wir nur noch eine Matrix die wir invertiren müssen. Mutipliziert man ein Ergebnis(von ursprünglicher Matrix mal Vektor) mit dieser invertieren Matrix so erhält man den urspünglichen Vektor. Jedoch sei hier gesagt, dass nicht jede Matrix invertierbar ist.

b)Neben der Möglichkeit eine invertierte Matrix aufzustellen können wir auch einfach 4 Gleichungen mit 4 Unbekannten aufstellen und sie zum Beispiel nach Gaus auflösen lassen.

Wenn wir setzen also in der Gleichung nicht x,y,z und w ein sondern die Ergebnis-Werte:
Code:
  1.  
  2. x*XAchse.x + y*YAchse.x + z*ZAchse.x + w*Position.x = Erbenis.x
  3. y*XAchse.y + y*YAchse.y + z*ZAchse.y + w*Position.y = Erbenis.y
  4. z*XAchse.z + y*YAchse.z + z*ZAchse.z + w*Position.z = Erbenis.z
  5. w*XAchse.w + y*YAchse.w + z*ZAchse.w + w*Position.w = Erbenis.w
  6.  


Diese Umkehrung läßt sich, rein von der Logig her nicht machen, wenn sich ein Vektor durch die anderen abbilden läßt.
(bei einer 3 Demensionalen Matrix würde das heißen das die Vektoren nicht komplanar sein dürfen.)

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: Fr Mai 13, 2005 23:15 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Ich glaube die Frage ging mehr in die Richtung, wie OGL auf die z Koordinate kommt, wenn die Maus doch nur x und y liefert. Die Antwort ist einfach:

Code:
  1.  
  2. function  gluUnProject(winx, winy, winz: GLdouble;
  3.                       modelMatrix: PGLdouble;
  4.                       projMatrix: PGLdouble;
  5.                       viewport: PGLint;
  6.                       var objx, objy, objz: GLdouble): Integer; stdcall;
  7.  


Gar nicht.

:-)

Den Viewport brauchste übrigends, weil die Angaben in Pixeln sind. Zummindest, wenn ich mich richtig erinnere...

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 14, 2005 08:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
AL hat geschrieben:
Ich glaube die Frage ging mehr in die Richtung, wie OGL auf die z Koordinate kommt, wenn die Maus doch nur x und y liefert.

Ich glaube Flash war das schon klar! :wink:
Zitat:
Den Viewport brauchste übrigends, weil die Angaben in Pixeln sind. Zummindest, wenn ich mich richtig erinnere...

Klar, das muss es sein! Danke!

Dann kann es gut sein, dass die das so wie ich gelöst haben.

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: Sa Mai 14, 2005 18:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wie ich gluUnProjekt aufrufe weiß ich. ;) (Außerdem hätt ich auch im Wiki gucken können :mrgreen:)

Nein ich will einfach wissen wie OpenGL aus der x,y Fensterkoordinate einen Punkt im Raum bestimmt. Denn schließlich fehlt die z-Koordinate, was bedeutet, dass es eigentlich unendlich viele Lösungen geben kann. Woher weiß OpenGL welcher Punkt auf der Linie der Möglichen Werte der Richtige ist.

Die Projektionsmatrix vernichtet (glaub ich) die Tiefeninformation. (z=0)

@Flo: Selbst wenn dein Ansatz funktioniert, wärs für mich mal interessant zu Wissen, wie OpenGL das tatsächlich macht. ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 14, 2005 19:28 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das geht gar nicht. Man muß den z Wert doch angeben.
Wo meinst du, macht OpenGL denn das?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 14, 2005 22:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
LarsMiddendorf hat geschrieben:
Das geht gar nicht. Man muß den z Wert doch angeben.
Wo meinst du, macht OpenGL denn das?

Dem wäre nur noch anzufügen das man den Z Wert, den man neben X und Y braucht, zum Beispiel mit glReadPixels bestimmen kann.

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: So Mai 15, 2005 23:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmm gut langsam wirds klarer. Nur sind die Tiefeninfos die man mit Readpixels ließt nicht bereits Objektkoordinaten? Weil der Display hat ja keine Tiefe. Da sind ja nur X und Y wohldefiniert.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 16, 2005 13:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Nehmen wir mal an läßt OpenGL einen Punkt zeichnen. Die entgültige Position des Punktes, so wie wir ihn am Bildschirm sehen, ergibt sich aus der übergeben Position und den Veränderungen durch die Matrizen.
Den X und Y Wert dieser entgültigen Position können wir direkt am Bildschirm erkennen, und zum Beispiel der Maus an die entsprechende Stelle klicken.
Der Z-Wert der entgültigen Koordiante wurde, falls der Punkt sichbar ist, an der entsprechenden Stelle im Tiefenpuffer eingetragen. Mit glReadPixel können wir nun an der entsprechenden Stelle den Z-Wert ermitteln.

Nach dieser ganzen Prozedur haben wir die entgültige Position. Jedoch ist meißtens viel interessanter was zum Beispiel die ursprüngliche Postion des Punktes war. Diese ursprüngliche Positoin ermitteln wir in dem wir die Änderungen durch die Matrizen rückgängig machen.

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: Mo Mai 16, 2005 14:50 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja stimmt. Hab den Wald vor lauter Bäumen net gesehn. Danke. (Den Thread sollte mal jemand löschen 8) :oops: )

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 16, 2005 16:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Flash hat geschrieben:
(Den Thread sollte mal jemand löschen 8) :oops: )


Nein lieber nicht! Er kann super als Vorlage für einen Wiki-Artikel dienen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 16, 2005 18:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Lass dich nicht aufhalten ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 13, 2005 08:49 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Hey,

weiß zwar nicht ob es noch aktuell ist, aber ich habe die folgende Info gefunden, die da noch gut reinpasst.


(Quelle: http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.aix.doc/libs/openglrf/gluUnProject.htm)

The gluUnProject subroutine maps the specified window coordinates into object space coordinates using the model, proj, and view parameter values provided. Results are stored in objX, objY, and objZ. A return value of GL_TRUE indicates success, and GL_FALSE indicates failure.

To compute the coordinates (objX, objY, and objZ), gluUnProject multiplies the normalized device coordinates by the inverse of model *proj as follows:

Code:
  1.  
  2.                   (  2(winX - view[0])      )
  3.                   |  ----------------- - 1  |
  4.                   |       view[2]           |
  5. (      )          |                         |
  6. | objX |          |  2(winY - view[1])      |
  7. | objY | = INV(PM)|  ----------------- - 1  |
  8. | objZ |          |       view[3]           |
  9. (  W   )          |                         |
  10.                   |       2(winZ) - 1       |
  11.                   |                         |
  12.                   (            1            )
  13.  

INV( ) denotes matrix inversion. W is an unused variable, included for consistent matrix notation.[/url]

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 13, 2005 10:12 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das ist toll. Da könnte jetzt mal wirklich jemand (der Formeln machen kann ;) ) sich die Teile schnappen und den Wiki-Artikel um einen Teil zur Berechnung erweitern. 8)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 13, 2005 13:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Was da steht kann man sowieso nicht anders machen. Mich würde interssieren wie sie die Manipulation durch die Matrizen rückgängig machen. Da gibt es nämlich mehrere Wege.

MfG
Flo

_________________
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  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 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 ]