Prever a posição do inimigo para que um objeto conduza seu alvo

13

No meu jogo 2D, eu tenho torres de IA que devem ajudar o jogador disparando automaticamente contra os inimigos. Eu gostaria de fazê-los disparar de forma inteligente e liderar seu alvo, em vez de apenas mirar na posição atual de um inimigo. Portanto, dado o vetor de velocidade e posição (sempre constante) do projétil do inimigo e da torre, como posso encontrar um vetor que represente a posição real que a torre deve atingir para que o projétil cruze (e bata) no inimigo?

Quaisquer links para artigos que descrevam matemática, algoritmos etc. serão apreciados!

Kryptic
fonte
Obrigado pelos links! No entanto, acho que as soluções são um pouco difíceis de ler, talvez eu possa encontrar uma resposta visual clara para essa pergunta usando os links que você forneceu, para ajudar outras pessoas que estão presas com o mesmo problema.
Larolaro 19/10
@ Larolaro Adicionei uma demonstração gráfica à minha resposta para que você possa entender um pouco melhor.
jmacedo
I descrever a abordagem que tomar esta resposta gamedev.stackexchange.com/a/28582/6588
jhocking

Respostas:

3

Não vou lhe dar uma resposta, tenho certeza de que é útil ou até correta, mas aqui está:
Depois de jogar um pouco mais com o mathematica (verifique o final da resposta para os notebooks / notebooks publicados), esta solução parece estar correta, mesmo que não seja a melhor em termos de eficiência.

Eu escrevi isso no mathematica que corresponde ao seu problema. Basicamente, resolve as equações / desigualdades para a variável OA, que é o que precisamos descobrir. A saída nos fornecerá as possíveis soluções que o OA pode ter e as condições que precisam ser verificadas para que cada solução seja válida:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx, BPy} é a posição atual do azul

  • {BVx, BVy} é o vetor de velocidade do azul

  • {OPx, OPy} é a posição de marcador de laranja

  • OV é a norma do vetor de velocidade da bala de laranja (velocidade total)

  • OA é o ângulo da bala da laranja (vetor do ângulo de velocidade)

  • é o tempo necessário para que a bala atinja o azul

Tentei colocar t> 0 && OV> 0 nas condições, mas o mathematica levaria uma eternidade, então usei t! = 0 && OV! = 0. Portanto, as soluções que vou dar aqui funcionam apenas quando o azul não está exatamente mesma posição da laranja e quando a bala da laranja realmente se move (em vez de ficar parada)

A saída é gigantesca: http://freetexthost.com/xzhhpr5e2w

No entanto, se extrairmos as partes OA == _, obtemos o seguinte:

http://freetexthost.com/iyrhqoymfo

Esses são os valores que o OA pode ter (cada um exigindo condições diferentes para serem válidas).

Com uma análise mais aprofundada, retirando as soluções que exigem que o OV seja negativo, o que não queremos, obtive o seguinte:

http://freetexthost.com/iy4wxepeb6

Portanto, essas são as possíveis soluções para o problema, cada uma exigindo condições diferentes para serem válidas. Para que um determinado ângulo OA seja uma solução válida, as seguintes condições devem atender:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

Resultado:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

Portanto, considere apenas as soluções em que isso verifica (você não precisa verificar as partes t == _. São elas que fornecem o tempo necessário para a bala atingir o veículo, se as outras condições forem válidas. Observe que, se t resulta em um valor negativo, você não pode considerar um determinado OA como uma solução válida, mesmo que verifique as outras condições (isso ocorre porque usamos t! = 0 em vez de t> 0 na redução).

Também pode ser uma boa ideia perguntar em /math// sobre isso.

Editar

Eu cresci um pouco de interesse por essa pergunta, então criei um caderno comentado com uma demonstração gráfica de tudo o que expliquei. Faça o download aqui:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Ou aqui: http://www.2shared.com/file/W01g4sST/towerBullets.html

(esta é a versão publicada e você só precisa do mathematica player, que é gratuito) para vê-lo. Se você não possui o mathematica, este é o caminho a seguir.

Captura de tela:

jmacedo
fonte
Posso fornecer as condições e soluções com o sinal de multiplicação (*), para que seja mais fácil portá-las para sua linguagem de programação (então você só precisará substituir o ArcTan, Sin [...], Cos [...], Sqrt [...] e, eventualmente, o sinal de potência (^).
jmacedo
Hah, esqueça esta solução. Agora que essa pergunta foi mesclada, os links da primeira resposta são costurados para conter respostas melhores.
jmacedo