Для тих, хто пам'ятає Descen Freespace, він мав приємну функцію, щоб допомогти вам націлитись на противника під час стрільби ракетами чи лазерами, які не навіюються: він показав перехрестя перед кораблем, за яким ви гналися, повідомляючи, куди стріляти, щоб потрапити на рух цільовий.
Я спробував використати відповідь з /programming/4107403/ai-algorithm-to-shoot-at-a-target-in-a-2d-game?lq=1, але це для 2D, тому я спробував адаптуючи його.
Спочатку я розклав обчислення, щоб вирішити точку перетину для площини XoZ, і зберег координати x і z, а потім вирішив точку перетину для площини XoY і додав координату y до кінцевого xyz, який потім перетворив у кліпспространство і поставив текстуру на ті координати. Але, звичайно, це не працює як слід, інакше я б не розміщував питання.
З того, що я помічаю після знаходження x у площині XoZ, а в XoY, x не є тим самим, тому щось повинно бути не так.
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 - це фактично targetVelocity.z (те саме для targetPos), а другий раз - це фактично targetVelocity.y.
Кінцева позиція після XoZ - це
crossPosition.set(minTime * finalEntityVelocity.x + finalTargetPos4D.x, 0.0f,
minTime * finalEntityVelocity.z + finalTargetPos4D.z);
і після XoY
crossPosition.y = minTime * finalEntityVelocity.y + finalTargetPos4D.y;
Чи є мій підхід до поділу на 2 площини та обчислення будь-якого блага? Або для 3D існує зовсім інший підхід?
- sqr () - це квадрат не sqrt - уникаючи плутанини.