Registriert: Sa Mär 14, 2009 17:48 Beiträge: 99
Programmiersprache: D, Java, C++
Hi, ich möchte gerne meinen Bildschirm in ein Grid aufteilen, dieses Grid bestehlt beispielsweise aus 5 Spalten und 6 Reihen, jetzt soll in jede Zelle dieses Grids eine Textur dargestellt werden, dass Problem ist nur, dass ich das ganze nicht im Orthogonalmodus, sondern im Perspektivischen machen möchte, da dieses Grid bei bedarf auch rotiert oder verschoben werden soll.
Wie bekomme ich es nun hin, dass dieses Grid genau Bildschirmfüllend, aber eben im 3D Raum gezeichnet wird???
Wenn das Teil genau Bildschirmfüllend ist, ist es nach einer Rotation oder Translation sicher nicht mehr genau bildschirmfüllend.
Außerdem verstehe ich nicht, wieso es mit Ortho nicht möglich sein soll, zu rotieren oder verschieben. Also zumindest ich verstehe nicht, wo das Problem ist.
Registriert: Sa Mär 14, 2009 17:48 Beiträge: 99
Programmiersprache: D, Java, C++
Das es nach einer translation oder rotation nichtmehr bildschirmfüllend ist ist klar .
Mal konkreter, ich möchte eine GUI zeichnen welche sich nach klick auf einen button nach hinten hin wegklappt, und dass ohne die gui in eine textur zu rendern, mir steht leider nur opengl es 1.0 zur verfügung. Deshalb möchte ich wissen welche x/y koordonaten ich brauch, um auf der ebene eines gegebeben z-wertes den gesamten bildschirm zu füllen, also quasi die left/right/top/bottom werte des viewing frustums bei einem gegebenen z wert, meinetwegen z=-2.
Sorry für kleinschreibung und rechtschreibfehler, ich tippe vom handy.
Z' ist nun der Z-Wert in normalisierten Gerätekoordinaten (NDC). Nun nimmst du deine Projektionsmatrix. Diese kannst du z.B. via glGetFloatv(GL_PROJECTION_MATRIX, ....) auslesen und invertierst sie. Das nennen wir dann invProj. Im folgenden sind X' und Y' jeweils entweder -1 oder 1, je nach dem welche Ecke du haben willst.
Code:
p = invProj * (X', Y', Z', 1) p = p / p.w
In p.x und p.y findest du nun die gesuchten Werte. Das sind die Werte wenn die Kamera genau in Richtung der Z-Achse (*) blickt. Wenn du also die Koordinaten der Ecken vergleichst weißt du wie breit bzw. hoch dein Bild bei dieser Z-Koordinate ist. Wenn du wirklich die 3D-Koordinaten brauchst musst du noch deine ModelView-matrix berücksichtigen (vor dem Invertieren mit der Projektionsmatrix multiplizieren). Da reicht es dann natürlich nicht mehr nur die XY-Koordinaten zu betrachten, da die Kamera eben so im Raum liegt wie du sie eben z.B. mit gluLookAt platziert hast.
Sofern es in OpenGL ES die Funktion gluUnProject gibt, kannst du auch diese verwenden. Die kümmert sich dann um das invertieren der Matrizen. Da hier auch der Viewport berücksichtigt wird, wären X' und Y' dann natürlich in Viewport-Koordinaten. Z' muss aber trotzdem berechnet werden.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich glaub die Frage hatten wir schon mal (hatte ich damals) aber so schön erklärt noch nie. Könnte man mal irgendwo unter Techniken und Algorithmen ablegen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Sa Mär 14, 2009 17:48 Beiträge: 99
Programmiersprache: D, Java, C++
Coolcat hat geschrieben:
Sofern es in OpenGL ES die Funktion gluUnProject gibt, kannst du auch diese verwenden. Die kümmert sich dann um das invertieren der Matrizen. Da hier auch der Viewport berücksichtigt wird, wären X' und Y' dann natürlich in Viewport-Koordinaten. Z' muss aber trotzdem berechnet werden.
Soo ich kam jetzt eindlich mal dazu damit rumzuspielen, klar auf gluUnProject hätte ich auch kommen können *doh*.
Wenn ich für near 1.0 und für far 100.0 einsetze, und dann Z erst mit -1 und dann mit -100 befeuer bekomme ich für z = -1 raus => -1 und für z = -100 => 100
Für gluUnProject bräuchte ich aber z-Werte im Bereich von [0, 1.0], werden die Depth-Werte ([-100.0, -1.0]) einfach auf den Bereich [0, 1.0] gemappt? Also wenn ich z = 0 an gluUnProject gebe bekomme ich genau die Koordinaten um Bildschirmfüllend auf der NearClippingPlane (depth = -1.0) zeichnen zu können, ebenso siehts für z = 1.0 und depth = -100.0 aus.
Wenn ich für near 1.0 und für far 100.0 einsetze, und dann Z erst mit -1 und dann mit -100 befeuer bekomme ich für z = -1 raus => -1 und für z = -100 => 100
Gut das du nicht alles glaubst was man dir erzählt.
Es fehlt nämlich die Division durch W.....wobei W in diesem Fall -Z ist....dann stimmt's. Das liefert Werte zwischen -1 und 1....eben NDC-Koordinaten. Möglich das gluUnproject was zwischen 0 und 1 braucht....ich hab diese Funktion noch nie benutzt.
Mitglieder in diesem Forum: 0 Mitglieder und 7 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.