Quero ter iluminação 2D que possa ser bloqueada por objetos do jogo. Meu jogo tem uma visão de cima para baixo e todos os objetos do jogo são descritos por retângulos.
Digamos que eu tenho um mundo 10x10 e coloco uma luz em 1x1 e paredes ao redor dessa luz. Quero poder ver a fonte de luz em 1x1, mas não em nenhum outro lugar, porque está bloqueada pelas paredes.
Já ouvi falar em lançar raios de luz, mas como isso realmente funciona?
opengl
2d
lighting
raycasting
LiquidFeline
fonte
fonte
Respostas:
Amit Patel escreveu um artigo muito bom sobre fundição de raios 2D.
Isso envolve lançar raios para cada um dos vértices dentro do alcance da fonte de luz para construir uma malha de luz.
Todos os exemplos visuais são interativos no post e muito fáceis de entender.
Você também não precisa se limitar a uma caixa, pois o perímetro que você traça pode ter a forma que desejar.
fonte
Você deve usar o algoritmo de radiodifusão , ou seja, deve poder calcular a interseção de raios (meia linha) com qualquer objeto em sua cena (linhas, quadrados, círculos, triângulos ...) e escolher a interseção mais próxima. Você lança o raio em todas as direções e depois "atrai a luz" apenas para o objeto mais próximo.
Aqui está como isso pode parecer .
fonte
Se você sabe o que é a conversão de raios, tudo o que você precisa fazer é realmente codificá-lo. Não é muito complexo, desde que você tenha coordenadas para cada vértice.
Primeiro, crie um objeto emanador de luz. Coloque sua luz nas coordenadas x, y.
Não é garantido que funcione para um polígono côncavo, mas deve funcionar bem para todos os polígonos convexos.
Isso funcionará se seus objetos oclusivos (paredes, personagem, comedor de pessoas roxas voadoras) forem pintados na tela após a aplicação de iluminação. Caso contrário, metade de uma parede parecerá significativamente mais brilhante que a outra metade. Se sua luz pontual for equidistante de dois pares de vértices da mesma parede (exatamente a metade da altura da parede), aplique o triângulo nos dois vértices mais próximos, em vez dos dois mais distantes.
Também devo mencionar que esse método requer um ponto de vértice criado dinamicamente, em que a borda do raio da luz encontra a superfície do objeto oclusivo. Isso cria no mínimo 3 vértices para qualquer objeto oclusivo e permitirá que paredes que ultrapassam o raio da luz (ou fora da tela) também bloqueiem qualquer luz.
Mais informações sobre polígonos côncavos e convexos
fonte