在3D

时间:2015-08-04 23:51:51

标签: math unity3d game-physics

我正试图在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;
    }
}

使用此代码,只要弹丸不受重力影响,我就能完美击中目标。但是,我希望它是。不幸的是,我甚至没有接近理解文章中发布的数学,所以我无法将其转换为工作代码。在花了几个小时试图找到包含重力的解决方案之后,我想我会问你们帮忙。

0 个答案:

没有答案