Pergunta

Eu estou começando um projeto de jogo que permitirá que personagens se esconder em áreas escuras. Escondendo em um canto escuro deve tornar mais difícil para outros personagens para vê-lo.

O que eu preciso é uma maneira de calcular como as condições de iluminação são onde o personagem está localizado.

O ideal seria ter um

double getLightFactor(GameCharacter observer, GameCharacter target)

desde que eu suponho que poderia haver condições de iluminação, onde a luz incide de modo que diferentes lados do alvo é atingido por diferentes quantidades de luzes. Mas eu ficaria feliz em se contentar com

double getLightFactor(GameCharacter target)

para obter a luz para um personagem específico, independentemente de onde você está assistindo a partir ou mesmo

double getLightFactor(int x, int z)

apenas para obter a luz em um ponto mapa específico no terreno.

A necessidade método para levar em conta que as condições de iluminação pode mudar durante o jogo, mas uma vez que é baseado em turnos alguns cálculos pesados ??poderia ser permitido. Tenho a intenção de torná-lo possível usar lanternas para que eles precisam ser levados em conta, bem como (mas poderiam ser modelados e tratada separadamente).

Eu vou estar usando Ogre3D para lidar com a minha cena, mas vou aceitar alegremente soluções genéricas ou mesmo soluções para outros motores (a minha escolha de motor não está esculpida em pedra).

Ideias, papéis ou realmente qualquer coisa relevante é muito bem-vindos!

Foi útil?

Solução

Você poderia apenas renderizar a cena do ponto de vista do observador para um buffer fora da tela (mesmo em um bastante baixa resolução) tendo em conta as configurações de luz atuais. Então você pode calcular um valor de luminosidade média em torno do meio do personagem alvo.

Eu não sei sobre o motor Ogre3D, mas isso deve ser uma maneira bastante genérica para lidar com seu problema (é apenas renderizar a cena a partir de um ponto de vista diferente, afinal de contas ...)

Outras dicas

Oh menino. Isso depende muito do motor. Posso dizer-lhe agora que você quer a segunda opção.

Como a iluminação de trabalho? É dinâmico ou estático? Vamos supor que é uma combinação de ambos.

Para a iluminação estática, verifique a lightmap nas proximidades. É tanto vértice base ou uma textura, de qualquer forma, você pode provar que em alguns pontos nas proximidades e média-los. Olhada em como o motor calcula a iluminação para modelos, cavar o código gráfico e ver onde os dados realmente vem, você pode usar a mesma fonte. Alguns jogos têm informações de iluminação volumétrica, Quake 2 faz isso em uma base per-folha na árvore BSP (fácil de verificar) e Quake 3 tem texturas volumétricas (também fácil de verificar).

Em seguida, você vai precisar adicionar as luzes dinâmicas. Uma maneira que você pode fazer isso é, atirando raios do jogador (provavelmente alguns raios diferentes para ter certeza, a partir de diferentes partes do jogador) para a fonte de luz. Conte quantos são atingidos e adicionar um pouco para o seu número para cada um, dependendo de quão longe a luz é. Todos os motores de jogo decentes têm um procedimento de "ray shoot e ver o que ele bate", é como AIs fazer linha de visão e como você descobrir o que balas atingiu e o que acontece quando você correr para a parede. Não atire muitos raios muito longe, pois poderia ser lento.

Você não teria que recalcular este valor demasiado frequentemente, você poderia fazê-lo sempre que uma nova fonte de luz é criado e, em seguida, a cada segundo ou assim.

Dependendo da complexidade do ambiente, você pode enganar e usar um lightmap 2D coberta em terreno. Cada célula teria um valor de intensidade de luz a partir das fontes perto de luz. Seria rápido para calcular mesmo para objetos em movimento, e rápido acesso para determinar a "escuridão" de um local.

Você pode ter que formas "selo" para ele usando a caixa ou círculo algoritmos simples, dependendo do tipo de luzes que você tem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top