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:
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?
Respostas:
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.
fonte