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

Aktuelle Zeit: Do Jul 17, 2025 14:07

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Apr 07, 2011 12:32 
Offline
DGL Member

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???

Danke & Viele Grüße!!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 07, 2011 16:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 08, 2011 00:02 
Offline
DGL Member

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 08, 2011 08:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ok....du nimmst deinen Z-Wert Z und die near bzw. far-Plane von deiner Projektion (das was du bei gluPerspective benutzt hast):
Code:
Z' = ((far+near) / (near - far)) * Z + ((2.0*far*near) / (near - far))


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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Apr 09, 2011 22:04 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Apr 13, 2011 15:25 
Offline
DGL Member

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*.

Mir scheint nur folgendes komisch:

Coolcat hat geschrieben:
Code:
  1. Z' = ((far+near) / (near - far)) * Z + ((2.0*far*near) / (near - far))


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.

Viele Grüße & Danke!!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Apr 13, 2011 15:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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. :roll:
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.

_________________
Yeah! :mrgreen:


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


Wer ist online?

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