我正试图在3D空间中找到一个点,我必须瞄准它以击中受重力影响的弹丸的移动目标。
为了给你一个更好的画面:想象一架高射炮试图击中一架飞过的飞机。
我们可以假设目标和射弹以恒定速率移动,而不是弹丸的重力。我们也可以假设射手是静止的,因为如果他不是,我们可以只使用相对速度。
经过一番研究后,我找到了this article。
我能够实现他的第一个解决方案,因为他非常善于提供代码示例。看起来像这样:
public static Vector3 CalculateLead(Vector3 targetVelocity, Vector3 targetPosition, Vector3 gunPosition, float projectileSpeed)
{
Vector3 direction = targetPosition - gunPosition;
float a = targetVelocity.sqrMagnitude - projectileSpeed * projectileSpeed;
float b = 2 * Vector3.Dot(direction, targetVelocity);
float c = direction.sqrMagnitude;
if (a >= 0)
return targetPosition;
else
{
float rt = Mathf.Sqrt(b * b - 4 * a * c);
float dt1 = (-b + rt) / (2 * a);
float dt2 = (-b - rt) / (2 * a);
float dt = (dt1 > 0 ? dt1 : dt2);
return targetPosition + targetVelocity * dt;
}
}
使用此代码,只要弹丸不受重力影响,我就能完美击中目标。但是,我希望它是。不幸的是,我甚至没有接近理解文章中发布的数学,所以我无法将其转换为工作代码。在花了几个小时试图找到包含重力的解决方案之后,我想我会问你们帮忙。