Sombra em tempo real em um jogo isométrico 2D

15

Estou escrevendo um pequeno mecanismo isométrico 2D em C ++ e estou tentando implementar a projeção de sombras em tempo real. Eu segui uma abordagem simples descrita nesta página e aqui está o resultado (a luz está localizada na mesma posição que o cubo amarelo):

insira a descrição da imagem aqui

O resultado é muito bom, mas faltam sombras nas paredes e no topo dos cubos. Aqui está um exemplo de como deve ser (desenhei as sombras esperadas em verde):

insira a descrição da imagem aqui

Todos os cubos desenhados são feitos simplesmente de 3 quadríceps 2D, localizados na posição XY e com uma profundidade Z (z = x + y). Eu uso o OpenGL com uma matriz ortográfica (glOrtho). As sombras são desenhadas usando o buffer de estêncil.

Estou procurando recursos ou soluções que me ajudem a concluir essa implementação de sombra projetada.

Muito obrigado!

XPac27
fonte
5
O seu link para "esta página" está apontando para uma imagem e não para uma página. Além disso, estou supondo aqui, mas pode ser mais fácil resolver esse problema em 3D e projetar a câmera iosmetricamente.
Tetrad
Oups, você está certo, eu consertei o link. Certamente seria mais fácil com uma projeção em 3D, mas o 2D também tem suas vantagens e tenho certeza de que existem soluções para implementá-lo em 2D.
XPac27

Respostas:

6

Para telhado e paredes, você pode tentar determinar interseções entre os segmentos da parede e as regiões de sombras geradas. Você precisa de duas passagens de renderização de suas sombras. Primeiro, você fará o que está fazendo hoje (no armazenamento de memória). O segundo passe calcula as interseções do telhado e da parede. O último estágio é a renderização real. DeadMG está errado, você pode fazer isso.

Nota: para o telhado, é necessário cruzar a área de sombra e a área do telhado.

sgc
fonte
Obrigado pelo bom conselho! Se conseguir otimizar essa segunda passagem, verifique quais paredes devem ser calculadas usando o produto escalar do seu segmento, em comparação com as sombras dos segmentos. Vou tentar isso e postar de volta, se funcionar.
XPac27
Já faz um tempo, mas finalmente consegui funcionar graças às suas sugestões! Eu precisava de apenas 2 métodos de geometria (um para saber se um ponto está dentro de um polígono e outro para obter a interseção de dois segmentos). Eu ainda preciso lidar com telhados, mas parece fácil saber. Você pode assistir ao resultado deste vídeo e ver o código- fonte aqui (trabalhei apenas um dia nele para que seja possível otimizá-lo mais).
XPac27 15/05
@ XPac27 que é incrível. Obrigado por compartilhar.
ashes999
0

Fundamentalmente, o que você está procurando não pode ser feito. Você quer pegar vários objetos 2D e fazê-los projetar sombras como se fossem objetos 3D. Se você quiser ter sombras 3D completas, precisará ter objetos 3D.

DeadMG
fonte
11
Mas isso não é a projeção de sombras em 3D como na pergunta. Qualquer parede bloqueia completamente a linha de visão nessa direção; você não pode ter objetos de altura variável.
yuriks
0

A solução descrita não é 3D completa, pois ele não precisa de uma solução 3D completa. Vai parecer, mas não é. A criação da projeção de sombra deve ser considerada como interseção entre o volume. O que ele precisa é menos complicado. Lembre-se (se você tiver) de dooms e deoms como o mecanismo de renderização. Todo o processamento foi realizado em duas dimensões.

sgc
fonte
0

Como você deseja que este jogo seja pequeno, que tal dizer que a atual implementação de sombra é boa o suficiente?

Admito que não vi isso em ação, ou seja, não vi quão perturbadoras ou não perturbadoras serão as imperfeições das sombras quando este jogo estiver sendo executado ao vivo com objetos dinâmicos e fontes de luz dinâmicas, mas julgar pelas suas imagens, eu ' Estou muito tentado a dizer "é bom o suficiente, agora concentre-se em concluir o jogo". Se a implementação atual for pequena e executar rapidamente, e corrigir o que você considera problemas tornará o código grande e lento, acho melhor você não se preocupar com essas sombras.

Eu sei, eu sei, sugerir "não tente resolver o problema", pois uma solução para um problema pode ser uma prática ruim. Ainda assim, sinceramente, quero dizer que realmente é bom se você deseja uma pequena pegada no seu código.

IllvilJa
fonte