Projektion



  • In meinem schlauen Buch über Computergrafik wird eine Funktion namens gluPerspective (GLdouble α, GLdouble aspect, GLdouble near, GLdouble far) mit der dazugehörigen Projektionsmatrix und den entsprechenden Berechnungsvorschriften erwähnt. Leider werden Objekte, die sich nicht im Bildmittelpunkt befinden, immer irgendwie nach außen hin verzerrt dargestellt. Kann man auch vernünftig, d.h. ohne Verzerrungen, projizieren (weiter oben wird eine Funktion glFrustum erwähnt, die aber angeblich unpraktisch ist), oder muss ich mich damit abfinden, dass das alles irgendwie doof aussieht? Zumindest in gängigen Computerspielen scheint das gleiche Problem zu bestehen.



  • Klar kann man das. Wichtig ist, daß das Seitenverhältnis von Bild und Projektionsfläche identisch ist.



  • das hieße also, dass ich die objekte auf das seitenverhältnis skalieren muss, oder?



  • @Wade1234 Nein, dann hast Du ja wieder Verzerrungen, die Du nicht willst. Du must entweder das Bild beschneiden oder die Projektionsfläche.



  • beschneiden? ich weiß nicht, was du meinst.

    also bei 800 * 600 ergibt das ja ein verhältnis von 1:1,333. ich hab eben mal testweise skaliert und die quadratische fläche sah irgendwie "richtig" aus, wobei ich mich da auch irren kann. aber ein bewegtes blatt papier sah zumindest ähnlich aus. edit: obwohl eigentlich nicht.



  • Wie stark ein Objekt verzehrt wird, hängt davon ab, welchen Abstand das Objekt zur Kamera hat. Wenn du ganz wenig verzerrung willst, dann must du das Objekt ganz weit weg von der Kamera platzieren und den foV(Field-Of-View) auf ein kleinen Wert setzen, damit man ganz nah an das weit enfernte Objekt ranzoomt.



  • also geht das doch nicht bzw. ich müsste mich mit verzerrungen abfinden? weil "objekt ganz weit weg und fov ganz klein" hört sich nach sehr intensivem rechenaufwand an.



  • @Wade1234 sagte in Projektion:

    also geht das doch nicht bzw. ich müsste mich mit verzerrungen abfinden? weil "objekt ganz weit weg und fov ganz klein" hört sich nach sehr intensivem rechenaufwand an.

    Nein, das sind nur bestimmte Parameter für Deine Projektion.



  • Hi,

    vielleicht solltest Du erst mal erwähnen, ob nur einfache flächige parallel zur Projektionsfläche liegende Objekte, flächige aber zur Projektionsfläche nicht parallele Objekte oder räumliche Körper abgebildet werden sollen.

    Gruß Mümmel



  • also das eine objekt, bei dem mir das aufgefallen ist, war ein doppelkegel, der auf der x-achse von -1 nach +1 hin- und herbewegt wurde und dessen mittelpunkt daher bei (-1 ... +1; 0; 0) lag, während die projektionsfläche bei (0; 0; -5) lag, also wohl ein räumlicher körper.

    das andere objekt war eine glatte, quadratische fläche/ebene, die auf der z-achse von -1 nach +1 hin- und her bewegt wurde und deren mittelpunkt bei (1; 0, -1 ... +1) lag, während die projektionsfläche bei (0, 2, -5) lag, also wohl ein flächiges aber zur projektionsfläche nicht paralleles objekt.



  • Das kommt vermutlich ganz darauf an, wie du "Verzerrung" definierst. Im Grunde ist jedes aufgemalte Objekt nur eine "Verzerrung" seiner Gestalt.



  • Mag daran liegen, ob es eine sphärische oder parallele Projektion ist.
    Bei paralleler Projektion (Teleobjektiv) erscheint alle sunverzerrt, bei sphärischer Projektion (Weitwinkel) haben die Menschen alle einen riesigen Knollenzinken im Gesicht.
    Wenn wir die Gegenstände direkt beobachten, dann fällt uns das nicht auf, weil wir es erwarten. Wenns aber auf einem Foto das vor uns liegt so aussieht, dann kann unser Gehirn das flach vor uns liegende Foto und die aufgedunsene Knollennase nicht in einen Zusammenhang bringen und wundert sich.



  • @Wade1234 Das macht überhaupt kein größeren Rechenaufwand. Den fovy-Parameter stellst du über gluPerspective beim ersten Parameter ein. In dein Eingangspost hast du diesen Parameter mit 'α' bezeichnet.

    Probiers doch einfach mal aus, wenn du bei gluPerspective beim ersten Parameter eine 0.1 übergibst und du die Kamera mit gluLookAt z.B. mit Abstand von 3000 Einheiten platzierst. Spiele an diesen Parametern einfach mal rum und schaue, wie das Objekt dann aussieht. Zu beachten ist noch, dass du beim zFar-Parameter bei gluPerspective dann auch mindestens eine 3000 übergeben musst. Also z.B. 4000 um sicher zu sein ,dass nach dem Clipping dein Objekt noch Sichtbar ist.

    [https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPerspective.xml](Link Adresse)

    [https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml](Link Adresse)



  • also ich habs gestern mal schnell probiert und das objekt weit weg platziert und das fov klein gemacht. die verzerrung war weg, die tiefendarstellung aber auch. da fehlt es wohl am feintuning, oder?



  • @Wade1234
    Ist zwar ein fotografisches Thema kann aber bei Deinem Problem wohl auch verwendet werden:

    https://www.gaeckler.at/Fotografie/foto_grundlagen.htm#Brennweite

    Hier siehst Du die unterschiedlichen Auswirkungen von Brennweite und Standort. Du mußt also nur die richtige Kombination von beiden finden, die Dein Objekt am besten darstellt.


Log in to reply