Como crio um horizonte?

8

Adicionei um céu ao meu raytracer que é amostrado quando um raio erra completamente qualquer objeto.

Coelho

O que estou fazendo aqui é que, se um raio perde completamente qualquer coisa na cena, ele retorna a função de ruído Perlin em (ray.direction.x, ray.direction.y, ray.direction.z) - em outras palavras, "amostras" uma esfera em torno da origem ".

Mas "parece errado" (porque o céu parece estar voltado para você).

Como posso melhorar o céu e torná-lo mais parecido com o horizonte da Terra?

Ou isso é mais ou menos como deveria ser, e eu deveria simplesmente adicionar mais geometria no chão?

bobobobo
fonte
Concordo que parece nitidamente antinatural. BTW, como sua câmera vai funcionar? Você precisa de um skybox completo ou apenas de um pano de fundo e deseja gerar o céu usando ruído ou a amostragem de uma textura é boa? Se for apenas um pano de fundo (como um jogo 2.5D), você pode experimentar algo como images.bibliocad.com/library/image/00010000/9000/… que seria inclinável é uma panorâmica.
ClassicThunder
2
Algum tipo de transformação na coordenada Y (ou Z, se essa é sua coordenada "ascendente") pode fazer alguma coisa. Por exemplo, y '= 1 - (1 - y) ^ 2. A idéia é para comprimir a coordenada Y em torno y = 0, e mantê-lo o mesmo ou expandi-lo perto y = 1.
John Calsbeek
@Calsbeek, essa seria uma ótima resposta! :)
Maik Semder

Respostas:

7

Como alternativa, você pode usar um mapa de cubo com uma textura do céu em vez de usar ruído perlin. E também acho que isso fará com que sua cena pareça melhor devido a mais detalhes e variações no mapeamento do ambiente. Foi exatamente o que fiz quando implementei meu raytracer.

Outro motivo pelo qual recomendo isso é que o ambiente não precisa ser apenas nuvens. Pode ter montanhas, pode ser uma cena interna, pode ser uma cena de Marte. Usando um mapa de cubo, a única coisa que você precisa fazer é trocar a textura e pronto.

Portanto, o primeiro passo será encontrar um mapa de cubo que atenda às suas necessidades. Ele pode ser armazenado como seis texturas separadas ou como uma única textura como a abaixo. Verifique também este link para obter mais informações sobre como criar seu próprio:

insira a descrição da imagem aqui

Em seguida, no seu código, recomendo criar uma CubeMapclasse para encapsular os cálculos de amostragem. Essa classe deve saber como carregar a textura do mapa do cubo e, com um raio , deve saber em qual face e em qual posição a amostra. Na minha implementação, achei mais fácil armazenar cada uma das seis faces em objetos de textura separados e ramificar com base na direção do raio:

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

Caso você ainda não tenha uma Textureaula, crie sua própria. Pode ser tão simples quanto uma matriz bidimensional de cores. Portanto, apenas como referência, e sem garantia da eficiência ou solidez dessa implementação, eis o código que usei no meu projeto - CubeMap e CubeFace .

David Gouveia
fonte
Esta resposta contorna o problema - quero saber como fazer com que a textura que gerou apareça como a cúpula do céu da Terra .
bobobobo
2

Você pode tentar usar o Perlin 2D com (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). O projeto projeta o vetor de direção no plano Z = 1. Dá a você o efeito de um céu infinito (plano).

Boojum
fonte