当一个向量的方向未知时,两个向量之间的交点

时间:2018-02-08 13:00:27

标签: unity3d math artificial-intelligence game-physics vectormath

问题:我有两个向量。我知道一个向量的起点,它的方向,它的大小。我知道另一个向量的起点及其大小。我需要找到第二个向量的方向以及交叉点的位置。

   Vector A:                        Vector B:

Position = Known                   Position = Known  
Direction= Known                   Direction= UNKNOWN
Magnitude= Known                   Magnitude= Known

To Find: Point of intersection.

是否有可能找到具有给定参数的交点?如果是,那怎么样?

应用程序:我想根据他移动的速度找到一个玩家被找到的位置,并在他被找到的那一刻向他射击子弹,考虑到他所花费的时间。子弹到达虚拟目标位置。

2 个答案:

答案 0 :(得分:4)

继续发表评论之后,我将在这里进行一次飞跃并直接回答您的终极问题。

假设玩家在初始时间点p并以速度v行进;你的枪位于q位置并以任何方向以s的速度射击子弹:

enter image description here

OP的长度为vΔt,Q sΔt的长度为a。角度Δt由点积:

给出

enter image description here

然后我们可以使用余弦规则来解决Δt

enter image description here

以这种形式写的,我们可以很容易地看到它是一个二次方程,因此使用Quadratic formula直接求解v < s

enter image description here

我们需要在这里考虑一些案例:

  • v > s:只需要采取正根,否则我们会得到负面时间。
  • dot(PQ, s) < 0v > s:子弹永远不会抓住玩家。
  • dot(PQ, s) > 0Δt:这次采取负根,因为正根用于向后旅行的玩家(更长的时间;这也是上图中显示的情况)。

从上方获得o的正确值将使我们能够找到交叉点d,从而找到预期的方向d

enter image description here

请注意,var results = JObject.Parse(json) ["data"]["cart"]["seats"] .Children<JProperty>().First().Value .Children<JProperty>().First().Value .Children<JProperty>().First().Value .ToObject<int[]>(); 未正常化。此外,此解决方案也适用于3D ,与角度方法不同。

答案 1 :(得分:1)

让下标1标记玩家,下标2标记AI:

  • initial:position(x_i,y_i)
  • angle:alpha_i
  • 速度:u_i

作为时间t的函数的位置是:

  • 玩家:(x_1 + u_1 * t * cos(alpha_1),y_1 + u_1 * t * sin(alpha_1))
  • AI的子弹:( x_2 + u_2 * t * cos(alpha_2),y_2 + u_2 * t * sin(alpha_2))

你有2个未知数:

  • t - 碰撞时间
  • alpha_2 - AI应拍摄的角度

当X和Y匹配时发生碰撞。即:

  • x_1 + u_1 * t * cos(alpha_1)= x_2 + u_2 * t * cos(alpha_2)
  • y_1 + u_1 * t * sin(alpha_1)= y_2 + u_2 * t * sin(alpha_2)

所以,

  • alpha_2 = arcos((x_1 + u_1 * t * cos(alpha_1) - x_2)/ u_2 * t)

以及

  • alpha_2 = arcsin((y_1 + u_1 * t * sin(alpha_1) - y_2)/ u_1 * t)

替换你的值并将它们等同于alpha_2的表达式以获得t,然后你可以在任一表达式中替换t来获得角度alpha_2。