Algoritmo para calcular um caminho de marcador para um destino com no máximo 2 ricochetes


21

Desculpe pelo título ruim, mas eu não tinha uma maneira melhor de expressá-lo ...

Portanto, existe um jogo incrível da Nintendo (sim!) No Wii chamado WiiPlay . Existem 9 minijogos e o meu favorito é chamado Tanks! . Trata-se de destruir tanques inimigos COM sem se destruir. Aqui está uma captura de tela de um nível:

insira a descrição da imagem aqui

Uma maneira de destruir tanques é disparando balas. Há um tanque inimigo verde-limão que dispara balas de alta velocidade que ricocheteiam (contra as paredes e os blocos) duas vezes. Você pode ver como o tanque do jogador pode ser destruído instantaneamente se permanecer onde está agora, pois o tanque de cal no centro pode disparar uma bala que segue o caminho verde que desenhei na imagem.

Como programador amador, tenho me perguntado como o tanque de cal pode determinar em qual direção ele deve disparar para ferir o tanque do jogador.

Eu mesmo pensei nisso, mas não criei nenhum algoritmo possível. Vou explicar minhas conclusões caso elas inspirem alguém. Por uma questão de simplicidade durante a minha explicação, presumo que uma parede seja qualquer superfície contra a qual uma bala possa ricochetear . Um retângulo isolado de blocos forma quatro paredes.

Concluí que os 2 pontos nos quais os marcadores de bala sempre se situam em um lado de um paralelogramo ou se tornam vértices opostos de um paralelogramo. O tanque inimigo de tiro e o tanque do jogador que ele visa não são necessariamente os outros 2 vértices, mas definitivamente estão nas linhas colineares dos dois lados do paralelogramo. Aqui está uma ilustração das 4 maneiras possíveis de formar um paralelogramo:

insira a descrição da imagem aqui

HOR-VER significa que a bala primeiro atinge uma parede horizontal, depois atinge uma parede vertical.

E então eu estou preso. Pensei em mover em torno de uma linha que conecta o tanque inimigo e o tanque do jogador ao redor do mapa para ver se ele forma um paralelogramo com dois golpes em qualquer parede, mas isso nem sempre funciona porque o tanque inimigo e o tanque do jogador não são necessariamente coincide com os vértices do paralelogramo.

Além disso, não tenho certeza do fluxo geral do algoritmo. O algoritmo usa alguma das 2 estruturas a seguir, ou talvez eu esteja errado com ambas?

  • Continue descobrindo os caminhos possíveis e sempre marque um como o melhor (pode ser o mais curto, o mais obscuro, o mais inevitável ou uma avaliação combinada e ponderada com base em vários critérios) e esqueça o resto. O que resta depois de todo o cálculo é o melhor a tomar.
  • Primeiro, determine todas as paredes primeiro alcançáveis ​​com a bala (a bala não precisa ricochetear em nenhuma outra parede para alcançar cada uma dessas paredes) e, em seguida, determine todos os intervalos alcançáveis ​​em cada uma dessas paredes (às vezes é impossível alcançar um ponto distante na parede). uma parede sem ricochete se outra parede estiver perto de você), em seguida, determine novamente todas as paredes alcançáveis ​​com um ricochete e todos os intervalos alcançáveis ​​nessas paredes. Esses 4 processos podem ser realizados de maneira semelhante ao traçado de raios. Durante cada processo, se o tanque do jogador for atingido por qualquer raio, descubra o caminho da bala de acordo com esse raio.

Na minha opinião, esse algoritmo é difícil de descobrir porque:

  • uma bala pode ser disparada em qualquer direção; e
  • existem infinitos pontos em qualquer parede, como na matemática, onde existem infinitos pontos em uma linha.

Mas o pessoal da Nintendo fez assim mesmo, então ... alguém com uma ideia?


Só para verificar, você está perguntando como isso pode ser feito, e não como a Nintendo escolheu fazê-lo, certo?
Ixrec 23/07

@lxrec você está certo, apenas interessado em uma maneira possível de fazê-lo, não da maneira que eles fizeram isso .
Olá a todos

O jogo não precisa encontrar uma solução. Quando você pressiona o botão para disparar, o jogo já sabe sua posição e direção que você está enfrentando, e somente usa essas informações. Ele traçará a trajetória e, se encontrar o tanque inimigo no caminho, você o atingirá, caso contrário não.
Mandrill

2
Embora existam muitos ângulos "infinitamente", você pode reduzi-los facilmente a algumas classes de equivalência. Sight and Light, de Nicky Case, é uma demonstração legal de renderizar sombras entre polígonos - o que é exatamente o seu problema, exceto pelo fato de você estar usando caminhos de bala em vez de raios de luz e seus raios podem ser refletidos duas vezes. Observe que a reflexão não importa para a IA - a reflexão apenas estende a linha de visão, embora isso signifique que o mesmo objeto pode ser visível de vários ângulos.
amon

@ Mandrill, receio que você não tenha entendido minha pergunta. Eu estava perguntando como o tanque inimigo pode criar um caminho de bala que atinja o tanque do jogador.
Olá a todos

Respostas:


9

Dada uma linha direta de visão, o problema é obviamente trivial. No entanto, estamos lidando com reflexão. Descobrir corretamente quais partes da cena pode ser vista é um desafio ao implementar a reflexão como parte de um traçador de raios, pois isso pode perder algumas aberturas. Uma “busca binária” entre dois ângulos promissores também não é viável: devido às reflexões, o espaço realmente visível não é contínuo; portanto, a heurística “se estiver à direita de A e à esquerda de B, deve haver um alvo. solução entre A e B ” não é permitida e perderá soluções“ criativas ”. Em vez disso, eu recomendaria implementar a reflexão executando novamente o rastreador a partir de uma posição virtual - a posição em que nosso tanque de tiro parece estar quando visto no espelho:

target |obstacle
   X   |
    \  |  X real position
     \   /
      \ /
   ----------- mirror surface
        \
         \
          X virtual position

A vantagem é que o raio espelhado agora é uma linha reta originária da posição virtual. Tentei ilustrar a técnica no seguinte esboço:

atirando nos cantos

X marca a posição de tiro, (X) o alvo. As áreas coloridas são visíveis.

  1. Linha de visão direta: o alvo não é visível. No entanto, podemos atingir as superfícies (1) e (2).

  2. Uma reflexão. Existem duas posições de tiro virtuais dentro dos obstáculos. A posição inferior tem LOS direto para o alvo, por isso temos a nossa primeira solução de disparo: o caminho da bala é a parte do raio entre o alvo e a superfície inferior do espelho, e entre o ponto de colisão entre o espelho e a posição real de disparo.

  3. Duas reflexões: A posição virtual superior da primeira reflexão pode ver parte do obstáculo inferior através da superfície do espelho. Como duas reflexões são permitidas, podemos refletir essa posição no obstáculo mais baixo. As posições são marcadas como (I) a posição real, (II) a posição virtual desde a primeira reflexão e (III) a posição virtual a partir da segunda reflexão.

    De (III), temos o LOS direto para o alvo (X), por isso encontramos outra solução de disparo. O caminho do marcador é ao longo da linha X-III até o segundo ponto de colisão do espelho, depois ao longo da linha III-II entre os pontos de colisão do espelho e, finalmente, ao longo da linha II-I do primeiro ponto de colisão do espelho à posição real I.

    Na verdade, a posição virtual mais baixa da primeira reflexão também pode ser refletida no obstáculo superior, mas isso não levará a nenhuma solução direta.

Depois que você descobrir quais partes dos obstáculos são visíveis (e, portanto, podem ser usadas para refletir o marcador), a implementação do espelhamento por meio de uma pesquisa aprofundada pareceria direta. Para encontrar superfícies de espelho adequadas, as técnicas descritas em Sight & Light , da Nicky Case, podem ser usadas: em vez de experimentar 360 vetores - que podem faltar nas aberturas e também é um desperdício -, lançamos raios apenas para as bordas dos obstáculos.


Não entendo como "lançar raios apenas para os limites dos obstáculos" funciona. Você pretende começar a lançar raios no final das paredes e gradualmente para dentro até encontrarmos uma solução? Nesse caso, entendo que, com essa regra, a solução pode ser encontrada mais rapidamente.
Olá a todos

Após algumas considerações, acho que essa é a melhor resposta porque, obviamente, com a resposta matemática que marquei como a melhor antes, não é possível lidar diretamente com soluções de salto único e sem salto.
Olá a todos

Isto é brilhante! Algum conselho sobre como criar uma representação espelhada do seu nível sem ser muito exigente no seu jogo?
retrovius

7

Apenas estendendo a idéia de Karl Bielefeldt para reflexões de 2 paredes:insira a descrição da imagem aqui

A e B são dados (os tanques). Primeiro, você deve listar todas as paredes que A pode ver e uma lista de todas as paredes que B pode ver. Então você faz pares onde a primeira parede está na lista de punhos e a segunda parede é diferente da primeira parede e está na segunda lista. Você precisa fazer este teste para todos os pares possíveis de paredes (a menos que encontre uma maneira de eliminar candidatos). Depois de encontrar R e S para um determinado par de paredes, você verifica

1) se A tem visão direta de R

2) se R pertence à parede1 (a parede é apenas um segmento, não a linha inteira)

3) se R tiver acesso direto a S

4) se S pertence a wall2 (a parede é apenas um segmento, não a linha inteira)

5) se S tiver acesso direto a B.

Para encontrar R e S : Como você conhece a parede1, pode determinar a equação da linha tangente à parede1, já que R pertence à linha tangente à parede 1, você tem uma relação entre as 2 coordenadas de R (terminando com um grau de liberdade para R) Da mesma forma que S (você tem uma relação entre as coordenadas S, pois esse ponto pertence à linha tangente à parede2). Então agora você tem 2 graus de liberdade e deve ter 2 equações independentes adicionais para determinar uma solução. Uma equação é:

(AA')/(RA')=(SS')/(RS')

a outra equação é:

(BB')/(SB')=(RR')/(SR')

observe que nas equações acima A, A ', B, B' são conhecidas ou podem ser calculadas diretamente. R 'e S' são funções das coordenadas de R e S e das equações da parede. Eu não terminei a matemática, então não sei como serão as equações.


Essa é uma ótima abordagem matemática. Mas o algoritmo requer muito tempo de computação para resolver as equações simultâneas, eu acho? Existem muitas raízes quadradas e exponenciação envolvidas com distâncias.
Olá a todos

3

Você pode aproveitar o fato de que o ângulo que sai do ricochete deve ser o mesmo que o ângulo que entra nele. Para uma determinada parede horizontal com coordenada y ce dois tanques fixos com coordenadas (a,b)e (d,e), existe apenas um ângulo que satisfaz a equação abaixo.

diagrama da equação

Basta resolver para xobter a distância ao longo da parede em que você deve apontar. Duas paredes funcionam da mesma maneira. Você apenas tem duas equações e duas incógnitas.


1

Você tem diagramas organizados que mostram como direcionar raios, então deixarei os detalhes de como determinar um par de superfícies refletidas.

Vamos chamar a superfície que deve ser atingido primeira superfície A , eo segundo, B .

Tente acertar as bordas (visíveis) de B , disparando contra um . Em outras palavras, determinar os pontos onde se poderia ver reflexos das extremidades do B se olhando para o espelho-acabados A . Isso deve ser fácil, você tem apenas um ponto de reflexão para lidar.

Agora você sabe dois raios que atingiram as bordas (visíveis) de B . Vamos chamá-los de raios de ponta. Calcule seus reflexos em B; eles devem ir além do seu objetivo. Você pode determinar se o alvo está entre eles, ou seja, à esquerda de um raio, mas à direita do outro, ou vice-versa. Isso é trivial usando a equação geral da linha reta .

Se o alvo não estiver entre os raios extremos, você obviamente não poderá atingi-lo com nenhum raio intermediário; escolha outro par de superfícies.

Se o alvo estiver entre os raios, procure o raio de impacto intermediário usando a pesquisa binária. Você tem dois ângulos de disparo correspondentes aos raios das bordas; seu ângulo de ataque fica entre eles. Desde que o diâmetro angular do seu alvo, como visto do ponto de disparo, não seja excessivamente pequeno, você precisará de poucas iterações até encontrar a direção de um raio atingido.

Aqui está uma foto:

raios

Aqui os dois raios de borda são mostrados em vermelho e azul. Aparentemente, você pode encontrar um raio emitido em um ângulo menor que o vermelho, mas maior que o vermelho, para que o raio atinja o alvo verde.


Não, não necessariamente! Pense no seu diagrama se houvesse um obstáculo extra em algum lugar entre os caminhos das balas vermelha e azul. Se você disparar uma bala em um ângulo certo entre os ângulos vermelho e azul, poderá acertar com mais força o tanque do jogador, mas também poderá errar completamente porque algumas delas podem ricochetear em algum obstáculo aleatório no meio. Por favor, veja a resposta da @ amon, onde ele discute sobre essa possibilidade.
Olá a todos

Resposta votada @ amon; Eu gosto da idéia de espelhamento em linha reta. Suponho também que o algoritmo verifique se o caminho de acesso é realmente aceitável após encontrá-lo dessa maneira simplificada. Ainda mais interessante é uma possibilidade em que o alvo está apenas parcialmente ocluído (possivelmente até separado em duas regiões visíveis). O método de Amon é mais fácil de lidar com isso.
9000

-3

Primeiro, lembra-se da aula de física quando você falou sobre refração da luz? Bem, seu problema pode ser resolvido usando esses princípios. O ângulo de incidência é igual ao ângulo de reflexão. então o tanque inimigo precisa percorrer todos os ângulos possíveis para o primeiro salto, para que o segundo salto possa atingir o jogador. Continue com a idéia de traçar raios também. Agora, isso fica complicado quando o player está se movendo, mas deve ser uma idéia boa o suficiente para você começar um algoritmo


1
Eu entendo os princípios da reflexão. Você pode ver minha resposta ao comentário de @ amon. Você está certo de que o movimento do jogador deve ser levado em consideração, mas acho que pode ser deixado como um critério para escolher um ótimo entre os vários caminhos possíveis com base na avaliação. No entanto, isso pode ser ignorado porque isso é correlativo à distância do caminho do marcador, ou seja , quanto maior o caminho, mais o jogador pode se mover antes que o marcador atinja o destino.
Olá a todos
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.