Para aquellos de ustedes que recuerdan Descent Freespace, tenía una buena característica que los ayudaba a apuntar al enemigo cuando disparaban misiles o láseres no orientados: mostraba un punto de mira frente al barco que perseguían diciéndoles dónde disparar para golpear el movimiento objetivo.
Intenté usar la respuesta de /programming/4107403/ai-algorithm-to-shoot-at-a-target-in-a-2d-game?lq=1 pero es para 2D, así que intenté adaptándolo
Primero descompuse el cálculo para resolver el punto de intersección para el plano XoZ y guardé las coordenadas xyz y luego resolví el punto de intersección para el plano XoY y agregué la coordenada y a un xyz final que luego transformé en el espacio de clips y puse una textura en esos coordenadas Pero, por supuesto, no funciona como debería o de lo contrario no habría publicado la pregunta.
Por lo que noté después de encontrar x en el plano XoZ y en XoY, la x no es la misma, por lo que algo debe estar mal.
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);
La primera vez que targetVelocity.y es en realidad targetVelocity.z (lo mismo para targetPos) y la segunda vez es en realidad targetVelocity.y.
La posición final después de XoZ es
crossPosition.set(minTime * finalEntityVelocity.x + finalTargetPos4D.x, 0.0f,
minTime * finalEntityVelocity.z + finalTargetPos4D.z);
y después de XoY
crossPosition.y = minTime * finalEntityVelocity.y + finalTargetPos4D.y;
¿Mi enfoque de separar en 2 planos y calcular es bueno? ¿O para 3D hay un enfoque completamente diferente?
- sqr () es cuadrado, no sqrt, evitando confusiones.