Para aqueles que se lembram do Descent Freespace, ele tinha um recurso interessante para ajudá-lo a mirar no inimigo ao disparar mísseis ou lasers que não sejam do local: mostrava uma mira na frente do navio que você perseguia, dizendo onde atirar para acertar o movimento alvo.
Eu tentei usar a resposta de /programming/4107403/ai-algorithm-to-shoot-at-a-target-in-a-2d-game?lq=1, mas é para 2D, então tentei adaptando-o.
Decompii primeiro o cálculo para resolver o ponto de interseção para o plano XoZ e salvei as coordenadas x e z e resolvi o ponto de interseção para o plano XoY e adicionei a coordenada y a um xyz final que depois transformei no espaço de clipe e coloquei uma textura naqueles coordenadas. Mas é claro que não funciona como deveria, ou então eu não teria postado a pergunta.
Pelo que notei, depois de encontrar x no plano XoZ e no XoY o x não é o mesmo, então algo deve estar errado.
float a = ENG_Math.sqr(targetVelocity.x) + ENG_Math.sqr(targetVelocity.y) -
ENG_Math.sqr(projectileSpeed);
float b = 2.0f * (targetVelocity.x * targetPos.x +
targetVelocity.y * targetPos.y);
float c = ENG_Math.sqr(targetPos.x) + ENG_Math.sqr(targetPos.y);
ENG_Math.solveQuadraticEquation(a, b, c, collisionTime);
A primeira vez que targetVelocity.y é realmente targetVelocity.z (o mesmo para targetPos) e na segunda vez é realmente targetVelocity.y.
A posição final após XoZ é
crossPosition.set(minTime * finalEntityVelocity.x + finalTargetPos4D.x, 0.0f,
minTime * finalEntityVelocity.z + finalTargetPos4D.z);
e depois de XoY
crossPosition.y = minTime * finalEntityVelocity.y + finalTargetPos4D.y;
Minha abordagem de separar em dois planos e calcular algum bem? Ou para 3D, existe uma abordagem totalmente diferente?
- sqr () é quadrado, não sqrt - evitando confusão.
fonte
Respostas:
Não há necessidade de dividi-lo em 2 funções 2d. Essa equação quadrática com a qual você está trabalhando também funciona bem em 3d. Aqui está o pseudo-código para 2D ou 3D. Isso implica que uma torre (defesa) está atirando no projétil:
'aimSpot' pode ser o vetor que você está perguntando.
fonte
timeToImpact
contagem for zero.Há também uma boa publicação no blog sobre o mesmo assunto: http://playtechs.blogspot.kr/2007/04/aiming-at-moving-target.html . Ele também contém amostras mais complexas que incluem gravidade.
O autor fez mais simplificação, o que resulta em um código mais compacto:
Atualização: o autor original levou em conta apenas uma raiz maior. Porém, no caso de uma raiz menor não ser negativa, resulta em melhor solução, pois o tempo de impacto é menor. Eu atualizei o código correspondentemente.
fonte