Estou fazendo uma IA rudimentar para o meu side-scroller e preciso saber se uma unidade de IA pode alcançar o ponto B a partir do ponto A simplesmente dando um pulo.
A trajetória de vôo dos meus personagens é um pouco incomum, pois eles podem aplicar força no ar (como no Jazz Jackrabbit 2, por exemplo), tão diferente da trajetória clássica de um projétil que é sobre ...
caminho que um projétil lançado ou lançado seguirá (...) sem propulsão.
... Suponho que meu problema seja mais sobre um projétil com propulsão (por exemplo, foguete).
Para ilustrar isso, é assim que a curva de vôo se parece com o meu personagem se eu pular e pressionar continuamente o "botão esquerdo" (parece diferente no lado esquerdo, é aqui que eu estava fazendo algumas manobras no ar):
A força aplicada durante o vôo é sempre paralela ao eixo X, então é F = (-f, 0) se eu segurar "esquerda" e é F = (f, 0) se eu segurar "direita".
Ele pode se mover muito como um saltador de esqui:
Por isso, difere muito da trajetória clássica que é simplesmente uma parábola (fonte: wikipedia ):
Para tornar mais difícil, estou simulando uma resistência simples ao ar para que meus personagens possam acelerar apenas até algum valor de velocidade máxima.
Isso é feito aplicando uma pequena força na direção oposta da viagem :
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize(); //normalizes vector and returns length
body->ApplyForce( AIR_RESISTANCE_MULT * speed * speed * -vel, body->GetWorldCenter() );
O AIR_RESISTANCE_MULT é uma constante que, no meu caso, é igual a 0,1.
Vamos supor que meu personagem seja um ponto infinitamente pequeno.
E NÃO estou levando em consideração os obstáculos, então minha pergunta é assim ...
Como determinar (pelo menos adivinhar com confiabilidade), dada a velocidade inicial V, um impulso J = (0, -j) que aplico ao personagem ao pular, gravidade G = (0, g) , força F = (+ -f , 0) é aplicado continuamente durante o vôo e AIR_RESISTANCE_MULT se realmente decidirmos levar em consideração a resistência do ar (isso é opcional) , se um ponto está abaixo da curva traçada pelo caminho que meu personagem seguirá?
Não tenho literalmente idéia de por onde começar com os cálculos e, de fato, não estou necessariamente interessado em uma resposta exata; um hack / aproximação que funcione bem seria ótimo, pois a IA nunca precisa funcionar perfeitamente.
edit: Eu decidi resolver isso usando simulação, como Jason sugere, mas como lidar com esse caso?
Devo desenhar um segmento de C a D e verificar se o ponto desejado está abaixo desse segmento?
Ou devo procurar binário os timestados entre C e D para procurar o ponto que está suficientemente próximo na distância horizontal do ponto desejado e só então verificar a diferença vertical? (parece um pouco exagerado para mim)