Fischauge
-
Hallo zusammen,
ich habe in der FH die Aufgabe bekommen die Fischaugenprojektion zu programmieren.
Als Programmiersprache ist C zu benutzen und die WinAPI (d.h "nur" die Befehle LineTo und MoveTo).Als Beispiel hat uns der Prof. sein Programm gezeigt. Hier sitzt man in einem dreidimensionalem Raum und kann den gewünschten Blickwinkel angeben, der angezeigt werden soll.
Nun bin ich bereits soweit gekommen, dass ich einen dreidimensionalen Raum (je 2 for-Scheifen für eine Wand --> 12 for-Schleifen gesamt (inklusive Hinterwand)) programmiert habe.
Ich bin mir aber nicht sicher, ob die Projektion auf den Bildschirm korrekt ist, weil ich die dreidimensionalen Vektoren jeweils duch ihre z-Komponente Teile und mit einem konstanten Faktor d multipliziere. Irgendwie habe ich das mit einer Projektionsmatrix nicht geschafft.Ich bin dann vor einiger Zeit beim Prof. gewesen und habe mir nochmal sein Programm angeguckt.
Er meinte dann, dass die Vektoren zu den einzelnen Punkten normiert werden müssen und die Länge neu berechnet werden müsste und danach die Vektoren mit dieser Länge multipliziert werden müssten. Er hat dabei einen Ansatz mit dem tangens gewählt, dem ich aber nicht folgen konnte und auch nicht mitschreiben konnte, weil er nur sehr kurz an der Tafel stand.
Weiterhin hat der dann noch etwas von einer Differentialgleichung erzählt, um auch ein wenig Mathematik in das Programm zu bringen. In diesem Zusammenhang hat er dann etwas von Ringgebieten auf einer Kugel erzählt. Aber ich habe auch hier absolut keinen Ansatz diese DGL aufzustellen, geschweigedenn weiss ich wozu man sie hier überhaupt benötigt. Ist sie vielleicht zur Abbildung einer Kugel auf eine Ebene nötig?Also nun endlich zu meinen Fragen:
1. Ist meine Lösung mit der Projektion so richtig, oder lässt es sich geschickter mit einer Projektionsmatrix erledigen, bzw. wird es sonst später zu Problemen kommen? Wenn ja, wie sieht diese Projektionsmatrix aus?
2. Welche Formel muss auf die einzelnen Vektoren angewendet werden, so dass die Fischaugenprojektion dargestellt wird?
3. Wie sieht die mögliche DGL aus, die aufgestellt werden muss und wozu ist diese genau nötig?
PS.: Natürlich habe ich bereits nach Antworten im Internet gefunden, aber das Material zu Fischauge ist sehr spärlich und meisst auch nicht das richtige.
Danke schonmal für die Antworten.
-
Programmiertechnisch habe ich noch nie mit Projectionsmatrizen gearbeitet aber vom Mathematischen Standpunkt aus bildest du den R3 nach 2R ab bzw. R3 nach R3 und dann auf den Bildschirm ins R2, die Vorgabe Fischauge stellt einfach nur Art der Vverzerrung dar. Denke dass ist dir selbst klar.
Wenn du die geometrische Verzerrung in mathematischer Form kennst sollte es die leichteste Lösung sein einfach die Projectiosmatrix mit der Verzerrungsmatrix zu multipliezieren um deine Fischauge Perspektive zu erreichen. Falls dir die Geschichte nichts sagt wären "(lineare) Abbildungen", "Abbildungsmatrix" und "Drehmatrix" interessante Stichwörter.
Wie genau das nun umgesetzt wird kann ich dir leider nicht sagen, ich kratze hier nur meine HM2 Kenntnisse zusammen.

Zu deiner ersten Frage:
Um den Fischaugeneffekt darstellen zu können musst du ja so oder so für jeden Punkt im Raum seine "neue" Position auf dem Bildschirm berechen.
Durch die Fischaugen-gemäße Projection kannst du das Problem praktisch trivialisieren. Die Geschichte mit der Projectionsmatrix ist einfach der geschickteste und mathematisch einfachste und vorallem kürzeste Weg einen n-dimensionalen Raum in einem m-Dimensionalen Raum abzubilden. Die Projektion kann praktisch alles bedeuten, verschieben, drehen, abrunden. Gemäß irgendwelchen Formeln werden die x,y,z koordinaten irgendwohin "verschoben" (projeziert) und
wie du schon richtig erkannt hast besteht dass hauptproblem der Aufgabe wohl darin die richtige Matrix aufzustellen.Zu deiner zweiten Frage:
http://de.wikipedia.org/wiki/Fischaugen-Objektiv
http://wiki.delphigl.com/index.php/Tutorial_Matrix2
http://sf.net/projects/panotools/Zu deiner dritten Frage:
Wozu eine DGL? Du hast ja hoffentlich keine zeitliche Wechselwirkung oder sonstige dynamische Abhängigkeiten die du berücksichtigen musst. Müsste mich doch sehr täuschen wenn du hier mit DGLs arbeiten müsstest. Du solltest hier eigentlich nur deine Ursprüngliche Dimension nehmen und sie verzerren. Vielleicht solltest du deien genauen Aufgabentext mal zum besten geben.
-
Gibt auch so ein Quake 1 Dingens, was das kann. Ist IIRC Open Source, könnte man also mal anschauen.
Bye, TGGC(War, bin, sein.)