Como posso saber se meu inimigo pode ver meu jogador?

15

Dado um jogador e um inimigo com posição, e dado o vetor de direção de cada um, como posso saber se um pode "ver" o outro?

Em outras palavras, como faço para testar se uma posição com direção está na frente ou atrás de outra posição com direção?

Para meus propósitos, "na frente de" significa diretamente na frente de, ou 90 graus para ambos os lados.

izb
fonte
11
Claramente, a solução é criar outra câmera e renderizar novamente a cena do ponto de vista do inimigo, e então executar o reconhecimento de imagem no resultado para o personagem do jogador.
Riking
prêmio resposta mais simplista vai para ...
OganM
3
Embora o comentário de Riking provavelmente fosse uma piada, esta é a maneira justa de fazer isso - dando aos NPCs o mesmo acesso ao estado do jogo que um jogador teria, em vez de permitir que eles acessassem o estado interno do jogo.
R .. GitHub Pare de ajudar o gelo
5
@R .. Sim, mas onde você desenha a linha? Levando esse raciocínio ao seu desfecho lógico, NPC está eventualmente tornar-se sensível com a capacidade de jogar e pensar como um ser humano ... em que ponto eles provavelmente racionalmente decidir começar wallhacking novamente de qualquer maneira: p
Thomas
@ Thomas: Na prática, acho que você pode fazer algum tipo de compromisso, aproximando o nível de informação que eles teriam como jogador sem se dar ao trabalho de implementá-lo dessa maneira. Medidas simples, como testes corretos para a linha de visão, limitando a capacidade de identificar um objeto além de uma certa distância, etc. podem percorrer um longo caminho.
R .. GitHub Pare de ajudar o gelo

Respostas:

17

O produto escalar de dois vetores pode dizer se eles se enfrentam ou não. O primeiro vetor provavelmente pode ser a direção da visão do inimigo; o segundo deve ser um vetor apontando da posição do jogador para a posição do inimigo.

https://www.youtube.com/watch?v=Q9FZllr6-wY

Shittypeete
fonte
Ah, sim, eu estava pensando demais. Eu estava manipulando 4 vetores, mas realmente quero o vetor de um jogador para o outro. O vídeo foi muito útil, obrigado.
izb
Um detalhe crucial que acha que deve ser adicionado a esta resposta é o jogo também deve fazer uma raycast ou algo para garantir que eles podem de fato ver o jogador (não está bloqueado por paredes etc.)
T. Kiley
1
@ T.Kiley: isso foi realmente sugerido por Riking no comentário à pergunta. Não, não acho que seja uma piada. Se o seu jogo for 3D, o raycasting é realmente uma maneira justa de fazê-lo. Apenas renderize novamente a cena com todos os objetos em textura preta, do ponto de vista do inimigo, exceto que os jogadores e outros objetos importantes devem ser renderizados em outras cores. Certifique-se de desativar a iluminação e o sombreamento. Se o buffer resultante não for totalmente preto, você saberá que alguém está na linha de visão do inimigo e poderá usar a cor para identificar quais objetos eles são.
Lie Ryan