Wie erstelle ich einen Horizont?

8

Ich habe meinem Raytracer einen Himmel hinzugefügt, der abgetastet wird, wenn ein Strahl ein Objekt vollständig verfehlt.

Hase

Was ich hier mache, ist, wenn ein Strahl etwas in der Szene komplett verfehlt, gibt er die Perlin-Rauschfunktion bei (ray.direction.x, ray.direction.y, ray.direction.z) zurück - mit anderen Worten, er "tastet ab eine Kugel um den Ursprung ".

Aber es "sieht falsch aus" (weil der Himmel so aussieht, als ob er dir zugewandt ist).

Wie kann ich den Himmel verbessern und ihn dem Horizont der Erde ähnlicher machen?

Oder sollte es mehr oder weniger so aussehen und ich sollte einfach mehr Geometrie auf den Boden legen?

Bobobobo
quelle
Ich bin damit einverstanden, dass es ausgesprochen unnatürlich aussieht. Übrigens, wie wird Ihre Kamera funktionieren? Benötigen Sie eine vollständige Skybox oder nur einen Hintergrund und möchten Sie den Himmel mit Rauschen erzeugen oder ist das Abtasten von einer Textur in Ordnung? Wenn es nur eine Kulisse ist (ua ein 2.5D-Spiel), könnten Sie aus so etwas wie images.bibliocad.com/library/image/00010000/9000/… probieren, was kachelbar wäre, es ist ein Panorama.
ClassicThunder
2
Eine Art Transformation in die Y-Koordinate (oder Z, wenn dies Ihre "Aufwärts" -Koordinate ist) könnte etwas bewirken. Zum Beispiel ist y '= 1 - (1 - y) ^ 2. Die Idee ist, die Y-Koordinate um y = 0 zu komprimieren und gleich zu halten oder sie in der Nähe von y = 1 zu erweitern.
John Calsbeek
@Calsbeek das wäre eine tolle Antwort! :)
Maik Semder

Antworten:

7

Alternativ können Sie eine Würfelkarte mit einer Himmelstextur anstelle von Perlin-Rauschen verwenden. Und ich denke auch, dass Ihre Szene dadurch besser aussieht, da die Umgebungszuordnung detaillierter und abwechslungsreicher ist. Genau das habe ich getan, als ich meinen Raytracer implementiert habe.

Ein weiterer Grund, warum ich dies empfehle, ist, dass die Umgebung nicht nur aus Wolken bestehen muss. Es kann Berge haben, es kann eine Innenszene sein, es kann eine Szene vom Mars sein. Mit einer Würfelkarte müssen Sie nur die Textur austauschen und fertig.

Der erste Schritt besteht also darin, eine Würfelkarte zu finden, die Ihren Anforderungen entspricht. Es kann als sechs separate Texturen oder als einzelne Textur wie die folgende gespeichert werden. Auch überprüfen Sie diesen Link für weitere Informationen, wie Sie Ihre eigenen erstellen:

Geben Sie hier die Bildbeschreibung ein

Dann würde ich empfehlen, für Ihren Code eine CubeMapKlasse zu erstellen , um die Stichprobenberechnungen zu kapseln. Diese Klasse sollte wissen, wie die Würfelkartentextur geladen wird, und mit einem Strahl sollte sie wissen können, in welchem Gesicht und an welcher Position sie abtasten soll. In meiner Implementierung fand ich es einfacher, jede der sechs Flächen in separaten Texturobjekten zu speichern und basierend auf der Richtung des Strahls zu verzweigen:

class CubeMap
{
    public void Load(string path);
    public Color GetSample(Ray ray);
    private Texture[6] faces;
}

Falls Sie noch keine TextureKlasse haben, erstellen Sie einfach Ihre eigene. Es kann so einfach sein wie eine zweidimensionale Anordnung von Farben. Nur als Referenz und ohne Garantie für die Effizienz oder Solidität dieser Implementierung, hier ist der Code, den ich für mein Projekt verwendet habe - CubeMap und CubeFace .

David Gouveia
quelle
Diese Antwort umgeht das Problem - ich möchte wissen, wie die von mir erzeugte Textur als Himmelskuppel der Erde erscheinen kann .
Bobobobo
2

Sie können versuchen, 2D Perlin mit (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z) zu verwenden. Das projiziert den Richtungsvektor auf die Ebene Z = 1. Es sollte Ihnen die Wirkung eines unendlichen (flachen) Himmels geben.

Boojum
quelle