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!
Respostas:
Esta pergunta no GameDev e no StackOverflow deve fornecer a resposta que você está procurando. :)
fonte
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:
{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:
Resultado:
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:
fonte