Projektionsmatrix, die richtige Perspektive



  • Hi,

    ich bastele gerade an einem einfachen 3D-Spiel. Das Spielfeld befindet sich auf einer geraden "Straße" die am Horizont endet. Die Straße sollte am Horizont eine Breite von nur wenigen Pixeln haben. Das Problem ist, dass ich für eine sehr kleine Breite eine sehr lange Straße darstellen muss. Um das zu vermeiden, hab ich ein bisschen an der Projektionsmatrix rumgespielt (zB Nate Robins Tut.), aber ich hab keinen Plan, was ich da eigentlich tue. 😉

    Ich möchte einfach den Perspektivischen Eindruck verstärken. Außerdem bin ich bei meiner Suche im Netz auf interessante Ideen gestoßen, die man mit der Projektionsmatrix anstellen könne (zB Fischauge), allerdings ohne nähere Erläuterung. Deswegen meine Fragen:

    1. An welchen Parametern muss ich drehen, um den perspektivischen Eindruck zu verstärken?
    2. Wo finde ich konkrete Informationen zu Projektionsmatrix?

    Gruß,
    don_basto.



  • dich interessiert der "fov" parameter von gluPerspective



  • Hier ein Beispiel aus meinem Projekt wegen der View Matrix die evtl gemeint ist :

    (Entwickelt auf VS8 c# Direct3D)

    dev.Transform.Projection =
                    Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f),
                    (float)this.ClientSize.Width / this.ClientSize.Height,
                    0.1f, 1000.0f);
    
                /* Viewmatrix */
                dev.Transform.View =
                    Matrix.LookAtLH(
                    new Vector3(cam_pos_x, cam_pos_y, camDistance),
                    new Vector3(cam_pos_x, cam_pos_y, cam_pos_z),
                    new Vector3(0, 1, 0));
    

    Der Befehl : PerspectiveFovLH legt fest, welchen Sichtwinkel deine Kamera besitzt. 90 Grad wie im beispiel festgelegt ist ein recht normaler betrachtungswinkel. 180 Grad würde dir alles anzeigen was von 90 Grad link bis 90 Grad rechts vor dir geschieht. 360 Grad dementsprechend ein rundumblick, aber nicht empfehlenswert 🙂

    Wenn du aber die Welt ertwas verzerren möchtest kannst du mal mit Matrix.Scaling(Vector3) herumspielen. Wirst schon bemerken was er macht 🙂

    Gruss Trider



  • Genau mit dem fovy-Parameter hab ich auch rumgespielt. Wenn ich diesen Wert ständig inkrementiere, scheint sich das Spielfeld von mir wegzubewegen bis dann alles horizontal gespiegelt wird und wieder auf mich zukommt. 😮

    Wenn ich nur diesen Winkel (fovy) ändere, finde ich keine schöne Lösung, weil bei größerem Winkel auch die ganze Welt inkl. Spieler etc. sich "entfernt".

    Dass mit dem Skalieren werd ich mal ausprobieren.



  • es kommt dir nur so vor als ob es sich entfernt. in wirklichkeit musst du wenn du den fov incrementierst auf ein und dem selben raum einen grösseren sichtbereich unterbringen. dementsprechend wird ein objekt optisch kleiner. fov zwischen 75 und 125 ist noch ok, mehr ist nicht wirklich zumutbar 🙂

    Gruss Trider



  • Gut, aber wenn ich die Kamera bei Z=0 positioniere und das Spielfeld auch dort anfängt, dann steht bei 90° die Kamera noch auf dem Feld und ich sehe das Spielfeld nicht vollständig, wenn der fovy-Wert größer wird, kann ich irgendwann das komplette Spielfeld sehen, es scheint sich wegzubewegen.



  • ok du stehst dann mal an (0.10.300) und schaust mit einem fov von 90 Grad in richtung (0.0.0) . Das heist du musst auf deinem Bildschirm 45 Grad rechts von dir und 5 Grad links von dir darstellen. jetzt zeichnest du dort mal einen körper rein. Solbald du ihn betrachtest und den fov langsam steigerst, wird der körper immer kleiner.

    Erklärung warum :

    sagen wir du hast eine Bildschirmauflösung von 1024 auf 768. Also Breite von 1024 Pixeln. bevor du den fov erhöhst hast du die volle breite von 1024 pixeln für deine 90 Grad sichtfenster. Erhöhst du nun aber auf 100 Grad müssen auf den selben 1024 Pixeln die 10 Grad mehr Sichtfenster nun auch noch dargestellt werden. Dies hat zur folge das er deine aktuellen 90 Grad etwas zusammendrückt, damit er am rande je 5 Grad dazumachen kann um somit auf 100 Grad sichtfenster zu kommen. Das ist dann der effect den du meinst mit : es scheint sich wegzubewegen. Wenn etwas kleiner wird bewegt es sich weg... tut es in wirklichkeit aber nicht, du stauchst nur das Bild... Mit Matrix.Scaling kannst du deinen vol beibehalten und nur z.b. einzelne objekte verzerren...

    Ich weis das ich irgendwie im kreis red, ich hoff nur das du weist was ich versuch zu sagen hehe... oder ich versteh deine frage net...

    Viel Glück!

    Trider



  • oder einfach mal andersrum ausgedrueckt:
    je weiter du den winkel verkleinerst desto mehr zoomst du in die mitte des bildes.
    extreme winkel sind nicht praktikabel weil polygonkanten linear bleiben obwohl diese beim "fischauge" gekruemmt wuerden.




Anmelden zum Antworten