¿Cómo creo un horizonte?

8

Agregué un cielo a mi trazador de rayos que se muestrea cuando un rayo pierde por completo cualquier objeto.

Conejo

Lo que estoy haciendo aquí es que si un rayo pierde completamente algo en la escena, devuelve la función de ruido Perlin en (ray.direction.x, ray.direction.y, ray.direction.z), en otras palabras, "muestra una esfera alrededor del origen ".

Pero "se ve mal" (porque el cielo parece estar frente a usted).

¿Cómo puedo mejorar el cielo y hacer que se parezca más al horizonte de la Tierra?

¿O es más o menos así, y simplemente debería agregar más geometría en el piso?

bobobobo
fuente
Estoy de acuerdo en que se ve claramente antinatural. Por cierto, ¿cómo va a funcionar tu cámara? ¿Necesita un skybox completo o simplemente un telón de fondo y desea generar el cielo usando ruido o está tomando muestras de una textura fina? Si es solo un telón de fondo (un juego 2.5D), puede probar algo como esto images.bibliocad.com/library/image/00010000/9000/... que sería enlosable es una panorámica.
ClassicThunder
2
Algún tipo de transformación a la coordenada Y (o Z, si esa es su coordenada "hacia arriba") podría hacer algo. Por ejemplo, y '= 1 - (1 - y) ^ 2. La idea es comprimir la coordenada Y alrededor de y = 0, y mantenerla igual o expandirla cerca de y = 1.
John Calsbeek
@Calsbeek esta sería una gran respuesta! :)
Maik Semder

Respuestas:

7

Alternativamente, podría usar un mapa de cubo con una textura de cielo en lugar de usar ruido perlin. Y también creo que hará que su escena se vea mejor debido a que tiene más detalles y variaciones en el mapeo del entorno. Eso es exactamente lo que hice cuando implementé mi raytracer.

Otra razón por la que recomiendo esto es que el entorno no necesita ser solo nubes. Puede tener montañas, puede ser una escena interior, puede ser una escena de Marte. Usando un mapa de cubos, lo único que debe hacer es intercambiar la textura y listo.

Entonces, el primer paso será encontrar un mapa de cubos que se ajuste a sus necesidades. Podría almacenarse como seis texturas separadas, o como una textura única como la que se muestra a continuación. Consulte también este enlace para obtener más información sobre cómo crear el suyo propio:

ingrese la descripción de la imagen aquí

Luego, en su código, recomendaría crear una CubeMapclase para encapsular los cálculos de muestreo. Esta clase debería saber cómo cargar la textura del mapa de cubos y, dado un rayo , debería poder saber en qué cara y en qué posición tomar muestras. En mi implementación, encontré que era más fácil almacenar cada una de las seis caras en objetos de textura separados y ramificar según la dirección del rayo:

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

En caso de que aún no tenga una Textureclase, simplemente cree la suya. Puede ser tan simple como una matriz bidimensional de colores. Entonces, solo como referencia, y sin garantía sobre la eficiencia o solidez de esta implementación, aquí está el código que usé en mi proyecto: CubeMap y CubeFace .

David Gouveia
fuente
Esta respuesta evita el problema: quiero saber cómo hacer que la textura que generé aparezca como la cúpula del cielo terrestre .
bobobobo
2

Puede intentar usar Perlin 2D con (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). Proyecta el vector de dirección en el plano Z = 1. Debería darte el efecto de un cielo infinito (plano).

Boojum
fuente