如何将受风影响的射弹瞄准3D世界的人工智能?

时间:2016-02-01 20:49:32

标签: unity3d game-physics

我试图进行坦克游戏,玩家必须摧毁由AI驾驶的敌方坦克。因为AI必须能够攻击玩家的坦克。这两个镜头都受到空气的抛物线影响。到目前为止,我已经能够计算射击的力量和最小倾斜角度而不会使射弹受到风的影响。

        var Dx = target.position.x - transform.position.x;
        var Dy = target.position.y - transform.position.y;            
        var P1 = Mathf.Sqrt(9.81f * (Dy + Mathf.Sqrt(Dx * Dx + Dy * Dy)));
        var InclinationAngle = Mathf.Atan((Dy + Mathf.Sqrt(Dx * Dx + Dy * Dy)) / Dx) * Mathf.Rad2Deg;        

        transform.localRotation = Quaternion.Euler(new Vector3(-InclinationAngle,0, 0));
        var fz = transform.forward.normalized * P1;  
        rig.AddForce(fz, ForceMode.Impulse);

问题在于弹丸受到风的影响。风可以在向前,向后,向右或向左的四个方向中的一个方向上。我尝试了几种方法,但我没有得到很好的机会。 AI如何考虑起始位置,目标位置以及风的强度和方向?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案: 一旦计算出行程的初始速率和最小倾斜角度

        var Dx = target.position.x - transform.position.x;
        var Dy = target.position.y - transform.position.y;
        var Vmin = Mathf.Sqrt(9.81f * (Dy + Mathf.Sqrt(Dx * Dx + Dy * Dy)));
        var InclinationAngle = Mathf.Atan((Dy + Mathf.Sqrt(Dx * Dx + Dy * Dy)) / Dx) * Mathf.Rad2Deg;
必须在弹丸飞行时间除以风力的情况下加上

除以2,因为只需要一半的时间,因为两个力是等于的。

        var t = Dx/(Vmin * Mathf.Cos(InclinationAngle*Mathf.Deg2Rad));
        var fyx = transform.forward.normalized * P1;
        var fxz = wind.force*-t/2;

        rig.AddForce((fyx+fxz), ForceMode.Impulse);