Per quelli di voi che ricordano Descent Freespace aveva una bella caratteristica che ti aiutava a mirare al nemico quando sparavi missili o laser non-homing: mostrava un mirino di fronte alla nave che hai inseguito dicendoti dove sparare per colpire il movimento bersaglio.
Ho provato a utilizzare la risposta da /programming/4107403/ai-algorithm-to-shoot-at-a-target-in-a-2d-game?lq=1 ma è per il 2D, quindi ho provato adattandolo.
Per prima cosa ho decomposto il calcolo per risolvere il punto di intersezione per il piano XoZ e salvato le coordinate x e z, quindi ho risolto il punto di intersezione per il piano XoY e ho aggiunto la coordinata y a uno xyz finale che ho poi trasformato in spazio clip e ho messo una trama in quelle coordinate. Ma ovviamente non funziona come dovrebbe altrimenti non avrei pubblicato la domanda.
Da quello che noto dopo aver trovato x nel piano XoZ e in XoY la x non è la stessa, quindi qualcosa deve essere sbagliato.
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);
TargetVelocity.y per la prima volta è targetVelocity.z (lo stesso per targetPos) e la seconda volta è targetVelocity.y.
La posizione finale dopo XoZ è
crossPosition.set(minTime * finalEntityVelocity.x + finalTargetPos4D.x, 0.0f,
minTime * finalEntityVelocity.z + finalTargetPos4D.z);
e dopo XoY
crossPosition.y = minTime * finalEntityVelocity.y + finalTargetPos4D.y;
Il mio approccio è quello di separare in 2 piani e calcolare qualcosa di buono? O per il 3D esiste un approccio completamente diverso?
- sqr () è quadrato non sqrt - evitando confusione.