如何在 3D 世界中为人工智能瞄准受风影响的射弹?
How to aim a projectile affected by wind for an Artificial Intelligence in 3D world?
我正在尝试制作一款坦克游戏,玩家必须摧毁由 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如何根据起始位置、目标位置以及风的强弱和风向进行瞄准?
我找到了解决办法:
一旦计算出完成行程的初始速率和最小倾斜角度
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);
我正在尝试制作一款坦克游戏,玩家必须摧毁由 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如何根据起始位置、目标位置以及风的强弱和风向进行瞄准?
我找到了解决办法: 一旦计算出完成行程的初始速率和最小倾斜角度
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);