如何计算导弹的转弯航向?


14

我有一枚从船上射出的导弹,它以一定角度射出,然后导弹以给定的转弯半径以弧线朝向目标转向。当我需要开始转弯以使导弹直奔目标时,如何确定弧上的点?

编辑

在发射导弹之前,我需要做的是计算并绘制飞行路径。因此,在所附示例中,运载火箭的航向为90度,目标在其后面。两种导弹均以相对于运载工具航向-45度或+ 45度的相对航向进行发射。导弹最初以已知的转弯半径转向目标。我必须计算转弯将导弹带到要直接攻击目标的转弯点。显然,如果目标处于或接近45度,则没有初始转弯,导弹只会直奔目标。

发射导弹后,地图还将在该线上显示导弹跟踪,以指示其飞行路线。

我正在做的是在模仿可运行软件的模拟器上工作。因此,在允许导弹发射之前,我需要绘制计算出的飞行路径。

两枚导弹瞄准两个目标

在此示例中,目标位于运载火箭后面,但绘制了预先计算的路径。


1
航向是预先计算的还是在轨迹变化?(像是寻的导弹?)
乔纳森·康奈尔

1
(x2-x1)^ 2 +(y2-y1)^ 2 = r ^ 2,其中(x1,y1)是导弹的当前位置,而(x2,y2)是目标吗?
共产党鸭子

也许您应该绘制所需的图形。
aaaaaaaaaaaaaa

3
这是2D还是3D问题?
史蒂夫·H

如果您正在寻找诸如归巢导弹之类的东西,则可以不使用任何三角函数就可以做到。看到这个问题
BlueRaja-Danny Pflughoeft 2011年

Answers:


9

我的数学可能有点错误,所以我用维基百科了答案。

我假设您想做一个持续的归巢场景,即以速度V1行驶的导弹P1不断试图向玩家P2转向;但转弯速度有限。

  1. 确定玩家和导弹之间的向量。

    V2 = P2 - P1
  2. 将它们转换为单位向量。

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. 确定向量之间的角度。

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. 限制它们之间的角度值(请记住,您的三角函数可能适用于弧度,因此尝试将0.1作为转弯速率)。

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. 创建新的运动向量。

    V1 = UNIT(V3.x + SIN(a), V4.y + COS(a)) * MissileSpeed

编辑:这没有“起点”,因为它对于持续归位的场景更加健壮(并且更容易实现)。您无需找到圆的起点-只需限制导弹可改变方向的速度,而其余的由于机器中的鬼影而发生。


1
嗯...如果有记忆,我认为您需要做一个交叉乘积来获取角度的方向。如果仅做点积,您将知道角度的大小,但不知道方向(因为点积可以具有V3 * V4 = V4 * V3,因此似乎没有办法记录方向差异)。因此,先进行点积运算,再进行叉积运算(检查Z坐标的符号)以找到方向。
克里斯(ChrisE)2011年

@ChrisE该示例为2D(参见5),因此原始方向和角度大小应足够。
Keeblebrox 2011年

计算两者之间的角度是正确的,但是我不确定您在第5步中陈述的意图是什么,或者它产生了什么。步骤5是因为我不懂数学,所以假设将角度a添加到v3。
13年

@dlots步骤5应该将新的“受限转弯角”添加到当前运动矢量中-基本上,它会改变导弹的方向。
乔纳森·迪金森

什么是SIGN在第4步?
Daniel Kaplan 2013年

2

我假设您想通过将发射航向更改为目标航向,然后继续直接转向目标来改变方向(更有趣的问题应该是在转弯时击中目标!)。

我必须假设您能够在所有方向上以相同的转弯半径转弯(这是一种简化操作,在真正的导弹中很难看到)。

最简单的解决方案是使用90°弯曲:导弹将其锉至其轨迹与目标成直角。如果您正好在90°点处转弯,则您将精确地错过转弯半径,因为您必须考虑转弯本身。解决方案是在到达90°点之前开始精确地旋转“转弯半径”米(?),然后旋转以形成(尝试猜测)90°弧以直接到达目标。

这种解决方案并不总是可行的,例如当您在90°路径(建筑物或其他障碍物)上没有可见度时。

好消息是,该解决方案适用于每个角度(不仅是神话中的90°),诀窍是要考虑到开始旋转之前所需的旋转空间。

多少钱?这就是为什么90°填充物是最简单的解决方案的原因...

假设当发射路径形成θ°角时达到可见性或最佳目标航向,那么您应该通过以下方式预测转弯:

(sec(90° - θ°) + tan(90° - θ°)) * turning_radius

...割线是余弦的倒数。证明是微不足道的,留给读者看。

认真地说,该公式来自简单的几何构造。

转折点图

黑线是发射路径,细黑线是通过turning_radius单位移向目标的相同路径;与作为目标路径的红色相同。

绿色部分的长度为turning_radius,因此您应该看到:

AB是90°-θ°的切线

BC是割线。

来自转折点的两条绿线的长度均为turning_radius,并且垂直于两条路径。表示转弯半径正确,圆弧与两条路径均相切(在物理约束下转弯时应该如此)。

如果您发现错误,请告诉我。

编辑:

您发布的图形显示,即使使用固定的射手和目标,路径也有多种选择,如下所示:

在此处输入图片说明

一旦选择了目标,您就可以以适当的角度应用我上面所说的内容。


请注意,这不是一个持续更新的系统。由于归巢需要更多的cpu(很多),因此对于固定目标,或者如果有人想实施“半哑”导弹,这应该是正确的方法。可以简单地在t上对轨迹进行参数化,将路径分为3个子路径,并且可以通过Bezier曲线近似圆弧。
FxIII 2011年

1

我会为导弹实施一种“转向行为”。导弹具有:速度(数字),位置(向量)和(当前)旋转。在游戏中的每次更新/每帧中,导弹的旋转角度都发生了一点变化(朝目标方向)。然后,导弹根据其当前旋转和当前速度向前移动。

显然,它适用于2D和3D,因为唯一的区别是附加尺寸。

另一种可能性是在发射导弹之前计算导弹的路径。查找贝塞尔曲线样条曲线


此处使用样条曲线的问题是,如果目标移动,则需要不断更新控制点。一个简单的转向算法在计算上可能会更便宜。
ChrisE 2011年

实际上,我正在尝试预先计算到目标的路径。我正在工作的是一些真实设备的模拟器,我正在尝试模仿真实设备的行为。
托尼

0

我觉得您在这里解决了错误的问题。现实世界中的导弹无需担心要转向何方,而只需将其指向目标就可以进行转向。唯一涉及的计算是何时开始将控制权恢复到空档,因为现实世界中的导弹无法立即改变其转弯速率。该计算将仅将导弹的指示空速作为输入值,我认为将进行预先计算。


2
现实世界中的导弹,尤其是后来的武器,在其中装有惯性制导系统或GPS或两者兼有,因此它们被编程为可进入搜索区域并开始寻找目标。如果附近有朋友,那将是灾难。该程序应该可以使您在避免友善和其他障碍物(例如陆地和无辜旁观者)的路径上发送导弹。
托尼

0

我认为最简单的算法只会遵循两个规则:

  1. 如果当前目标比转弯直径更靠近导弹,则保持直行。这避免了导弹绕近目标飞行而不是实际到达目标。

  2. 否则,转向目标,直到您指向目标为止。

要计算转弯以2D结束的点,请执行以下操作:

  1. 在您要开始转弯的点处,转弯圆的中心位于与当前航向垂直的方向上,距您的转弯半径一定距离。请注意,其中有两个要点-您可能希望其中一个最接近目标。计算该位置并将其称为P。

  2. 现在,您可以在切线处以直角构造直角三角形,并创建两个已知点-P和目标。这使您可以使用毕达哥拉斯计算从切线到目标点的距离。称其为D。

  3. 现在,您需要计算目的地处半径为D的圆与转弯圆的交点。您将获得两个解决方案,它们是该圆上导弹将停止旋转的两个切点(绕圆的每个行进方向一个)。选择导弹前面的点-这就是您的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.