Math 考虑到3D中的重力,找到击中移动目标的线索

Math 考虑到3D中的重力,找到击中移动目标的线索,math,unity3d,game-physics,Math,Unity3d,Game Physics,我试图在3D空间中找到一个我必须瞄准的点,以便用受重力影响的射弹击中移动的目标 给你一个更好的画面:想象一支高射炮试图击中一架在上空飞行的飞机 我们可以假设目标和射弹以恒定速率移动,而不是在射弹的情况下以重力移动。我们也可以假设射手是静止的,因为如果他不是静止的,我们可以使用相对速度 经过研究我发现 我能够实现他的第一个解决方案,因为他非常乐于给出一个代码示例。看起来是这样的: public static Vector3 CalculateLead(Vector3 targetVelocity,

我试图在3D空间中找到一个我必须瞄准的点,以便用受重力影响的射弹击中移动的目标

给你一个更好的画面:想象一支高射炮试图击中一架在上空飞行的飞机

我们可以假设目标和射弹以恒定速率移动,而不是在射弹的情况下以重力移动。我们也可以假设射手是静止的,因为如果他不是静止的,我们可以使用相对速度

经过研究我发现

我能够实现他的第一个解决方案,因为他非常乐于给出一个代码示例。看起来是这样的:

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;
    }
}

有了这段代码,只要弹丸不受重力影响,我就能完美地击中目标。不过,我希望是这样。不幸的是,我还没有完全理解文章中的数学知识,所以我无法将其翻译成工作代码。在花了几个小时试图找到一个包括重力在内的解决方案后,我想我应该向你们寻求帮助。

如果弹丸每次都应该击中目标,我会建议一种不同的方法。我在我的塔防游戏中使用这种方法。因此,您知道目标在任何给定时间的位置。因此,与其尝试计算初始速度向量,不如使用sin函数在预设路径上从点a到点B设置投射物的动画。基本上是一个线性插值结合了一个Sin函数,它沿着线性路径偏移了弹丸的y位置。但我真的不想让它动起来。我真的很喜欢这样的想法:发射一枚真正的炮弹,然后忘掉它。必须动画它介绍了一些角落的情况下,我可能需要检查,这可能会导致错误。而且,让它对物理产生反应只允许你通过操纵物理变量(如重力)轻松改变它的行为,而无需改变射弹本身。我可以看到它在TD中工作得很好,但就我而言,基于物理的解决方案似乎更有用。如果投射物每次都应该击中目标,我会建议一种不同的方法。我在我的塔防游戏中使用这种方法。因此,您知道目标在任何给定时间的位置。因此,与其尝试计算初始速度向量,不如使用sin函数在预设路径上从点a到点B设置投射物的动画。基本上是一个线性插值结合了一个Sin函数,它沿着线性路径偏移了弹丸的y位置。但我真的不想让它动起来。我真的很喜欢这样的想法:发射一枚真正的炮弹,然后忘掉它。必须动画它介绍了一些角落的情况下,我可能需要检查,这可能会导致错误。而且,让它对物理产生反应只允许你通过操纵物理变量(如重力)轻松改变它的行为,而无需改变射弹本身。我可以看到它在TD中运行良好,但就我而言,基于物理的解决方案似乎更有用。