Raytracer Kamera

Bisher sieht ihre Raytracer Kamera vermutlich so aus, dass für jedes Pixel ihres Bildes ein Strahl erzeugt wird. Die Strahle werden aus der Kamera jedoch so herausgeworfen, dass sie nur einen geringen Ausschnitt der kompletten Umgebung der Kamera treffen. Ihre Funktion innerhalb der Kamera Klasse sieht aktuell diesem Beispiel hier ähnlich.

    //x und y - Koordinaten des Pixels
    public Ray generateRay(double x, double y) {

        //Richtungsvektor berechnen
        Vec3 direction = new Vec3(x - (width / 2),
                (height / 2) - y, -(height / 2) / (Math.tan(phi / 2)));

	return Ray(camPosition, direction);

    }

360 Grad Panorama Kamera implementieren

Das Ziel ist es nun, die Berechnung des Richtungsvektors so zu verändern, dass im Nachhinein eine Bild, ähnlich einer quadratischen Plattkarte, entsteht. Mit GPano könnte man das entstandene Bild wie die 360 Grad Aufnahmen von Google Street View betrachten.

Zur Vereinfachung: Stellen Sie sich aufrecht hin. Verlauf des X-Wertes: Drehen Sie sich einmal um 360 Grad. Verlauf des Y-Wertes: Schauen Sie von ganz oben nach ganz unten. Verlauf des Z-Wertes: Sobald Sie sich um 180 Grad gedreht haben schauen Sie nun in die exakt entgegengesetzte Richtung (Vorzeichenwechsel).

Nun, betrachten wir zuerst den X-Wert (erster Parameter des Vec3-Konstruktors) unseres Richtungsvektor. Hier möchten wir, dass der X-Wert von -1 über 0 zu 1 ansteigt bis die X-Pixelkoordinate die Hälfte der Breite des Bildes hat, dannach soll der X-Wert des Richtungsvektors wieder von 1 über 0 auf -1 absteigen.

Bei der Betrachtung des Y-Wertes des Richtungsvektors, wollen wir nur eine Öffnung von 180 Grad realisieren. Oben beginnend, sollte der Y-Wert des Richtungsvektors also von 1 über 0 (bei der Mitte) auf -1 absteigen.

Der Z-Wert richtet sich nach dem aktuellen Wert der X-Pixelkoordinate. Zu Beginn, wenn die X-Pixelkoordinate 0 ist, soll auch der Z-Wert des Richtungsvektors 0 sein. Ist die X-Pixelkoordinate gleich ein Viertel der Bildbreite, so soll dieser -1 betragen. Bei zwei Vierteln = 0 und bei drei Vierteln +1.

Schlussendlich sollte folgende Berechnung verwendet werden, um eine 360 Grad Kamera zu implementieren.

Vec3 direction = new Vec3( - Math.cos(2*Math.PI*(x/width)),
                             Math.cos(Math.PI*(y/(height))),
                           - Math.sin(2*Math.PI*(x/width)) 
                         );