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.