Como implementar luzes e sombras em um mapa em mosaico 2D de várias camadas?

11

Estou escrevendo um jogo isométrico do zero e gostaria de saber como posso adicionar luzes e sombras.

O código que eu tenho até agora pode ser encontrado aqui , mas deve ser suficiente saber que, no momento , os mapas são simples matrizes 3D de valores verdadeiros / falsos . Aqui está uma foto do ambiente:Captura de tela do mapa de mosaico de várias camadas

Se fosse um mapa de mosaico de camada única, seria direto. Eu posso entender o raycasting simples em 2d que é necessário.

No entanto, como meus mapas têm vários níveis de altura e áreas parecidas com cavernas, eu realmente não sei como fazer sombras convincentes para isso. Talvez uma solução por bloco seja a única maneira realista?

Danie Clawson
fonte
Você procura iluminação pré-cozida ou gerada dinamicamente? As “áreas tipo caverna” são mostradas em recorte se o jogador entra ou a luz precisa considerar o teto também? Você espera que cada bloco seja binário aceso / escuro ou que tenha algum tipo de valor fracionário?
Anko
1
@Anko Eu preferiria algo fracionário, como 0-1,11 (para áreas super iluminadas, como explosões, etc.), mas poderia ser simplesmente baseado em blocos, sem interpolação real ou algo assim. Eu realmente quero que seja dinâmico e suporte várias luzes. E enquanto as áreas "em forma de caverna" / cobertas serão mostradas cortadas, o algo precisaria considerar os blocos não mostrados no cálculo da luz. Por exemplo, se você entrar em uma casa, os blocos de telhado desaparecerão, mas ainda devem estar sombreados por dentro.
Danie Clawson
Se você procura uma solução como essa com cavernas e altura, parece que não tem nada em 2D. Você provavelmente está procurando uma solução 3D completa, mesmo que a câmera esteja sempre olhando na direção norte-45º para baixo. Você deve olhar para técnicas como stencil-shadow ou similar.
Adrian Maire
Segundo @AdrianMaire, você precisará fazer cálculos 3D adequados, mas faça alguns atalhos se não houver interpolação nas faces de um "bloco". Se você não estiver fazendo interpolação, provavelmente poderá usar raios.
NeomerArcana
No momento, não tenho o espaço da mente para digerir uma resposta, mas apenas tropecei neste post sobre a determinação da linha de visão para terrenos com mapas de altura . Parece exatamente o que você está procurando.
Anko

Respostas:

1

Posso recomendar que as sombras 2D funcionem primeiro, mesmo que seja apenas para o nível em que seu avatar está atualmente. Será mais fácil começar a olhar o código dessa maneira e fazê-lo funcionar.

Eu implementei sombras em mapas de blocos 2D de duas maneiras. Um método de transmissão de sombras que eu encontrei descrito por Eric Lippert na Microsoft funciona muito bem.

E, por outro lado, o que fiz pela primeira vez em que olhei para esse tipo de coisa, foi varrer ortogonalmente os ladrilhos e bordas visíveis e gerar bordas (e talvez cantos iirc) descrevendo a cena com o menor número de arestas. Em seguida, você pode selecionar as arestas ocultas e formar qualquer recurso de sombreamento personalizado, como sombras embutidas, se quiser mostrar um pouco de parede. Em seguida, crie sua geometria de sombra (projeção de sombra projetada?) E renderize-a por cima.

Mas se eu tentar levar essa ideia para 3d, fica mais fácil fazê-lo em 3d. Embora o método descrito por Eric Lippert possa presumivelmente ser convertido para 3d. Mas acho que você verá que fazê-lo em 3D é caro. Talvez dê uma olhada no código fonte do Brogue também. Pode ter uma implementação mais eficiente para visibilidade em 2D / projeção de sombra.

Boa sorte.

Gavin Williams
fonte