Come faccio a creare un orizzonte?


8

Ho aggiunto un cielo al mio raytracer che viene campionato quando un raggio manca completamente qualsiasi oggetto.

coniglio

Quello che sto facendo qui è se un raggio manca completamente qualcosa nella scena, restituisce la funzione di rumore Perlin su (ray.direction.x, ray.direction.y, ray.direction.z) - in altre parole "campioni una sfera attorno all'origine ".

Ma "sembra sbagliato" (perché il cielo sembra rivolto verso di te).

Come posso migliorare il cielo e renderlo più simile all'orizzonte della terra?

O è più o meno come dovrebbe essere, e dovrei semplicemente aggiungere più geometria sul pavimento?


Sono d'accordo che sembra nettamente innaturale. A proposito, come funzionerà la tua fotocamera? Hai bisogno di uno skybox completo o solo di uno sfondo e vuoi generare il cielo usando il rumore o il campionamento da una trama va bene? Se è solo uno sfondo (ala di un gioco 2.5D) potresti provare qualcosa di simile a images images.bibliocad.com/library/image/00010000/9000/… che sarebbe piastrellabile è una panoramica.
ClassicThunder

2
Una sorta di trasformazione nella coordinata Y (o Z, se questa è la tua coordinata "verso l'alto") potrebbe fare qualcosa. Ad esempio, y '= 1 - (1 - y) ^ 2. L'idea è di comprimere la coordinata Y attorno a y = 0 e mantenerla uguale o espanderla vicino a y = 1.
John Calsbeek,

@Calsbeek questa sarebbe un'ottima risposta! :)
Maik Semder,

Risposte:


7

In alternativa, è possibile utilizzare una mappa cubica con una trama di cielo invece di utilizzare il rumore perlin. E penso anche che renderà la tua scena migliore grazie alla maggiore dettaglio e variazione nella mappatura ambientale. Questo è esattamente quello che ho fatto quando ho implementato il mio raytracer.

Un altro motivo per cui lo consiglio è che l'ambiente non deve necessariamente essere solo nuvole. Può avere montagne, può essere una scena al coperto, può essere una scena di Marte. Utilizzando una mappa cubica l'unica cosa che devi fare è scambiare la trama e il gioco è fatto.

Quindi il primo passo sarà trovare una mappa cubica adatta alle tue esigenze. Potrebbe essere memorizzato come sei trame separate o come una singola trama come quella qui sotto. Controlla anche questo link per maggiori informazioni su come crearne uno tuo:

inserisci qui la descrizione dell'immagine

Quindi sul tuo codice, consiglierei di creare una CubeMapclasse per incapsulare i calcoli di campionamento. Questa classe dovrebbe sapere come caricare la trama della mappa del cubo e, dato un raggio , dovrebbe essere in grado di sapere in quale faccia e in quale posizione campionare. Nella mia implementazione ho trovato più facile memorizzare ciascuna delle sei facce in oggetti texture separati e ramo in base alla direzione del raggio:

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

Se non hai Textureancora un corso, creane uno tuo. Può essere semplice come una matrice di colori bidimensionale. Quindi, solo come riferimento e senza alcuna garanzia sull'efficienza o la solidità di questa implementazione, ecco il codice che ho usato nel mio progetto: CubeMap e CubeFace .


Questa risposta evita il problema: voglio sapere come far apparire la trama che ho generato come la cupola del cielo terrestre .
bobobobo,

2

Potresti provare a usare 2D Perlin con (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). Proietta il vettore di direzione sul piano Z = 1. Dovrebbe darti l'effetto di un cielo infinito (piatto).


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.