检测可能的抛射物与盾牌碰撞

3

我试图检测抛射物是否会撞击到盾牌,以及碰撞会发生在哪里。

enter image description here

从这张图片中可以看到情况。虽然A和B两个抛射物与盾牌中心S的距离大致相同,但其中一个会与盾牌碰撞,另一个则不会。

enter image description here

数学上最直接的解决方案是使用圆的数学方程和抛射物路径的线性方程。

我可以用纸和笔计算出结果。但是,直接实现解析几何给我的经验非常糟糕。

此外,这种方法会针对离开盾牌的抛射物返回正值。如何过滤它们呢?

enter image description here

第二种方法是朋友的想法,测量抛射物路径与盾牌中心之间的最小距离-如果l小于r,则发生碰撞。

这种方法似乎更容易实现,但不能让我知道碰撞会发生在哪里。

我工作在2维空间中。我使用C#和Unity引擎,但通用解决方案也受欢迎。

当然,抛射物被视为大小为零的点。


如果您的数学计算正确,并且从光线的起点和t次方向向量开始,那么圆被击中的解将具有正的t值。另一种方法也可以,您只需要计算出光线和通过圆心的垂线之间的线线碰撞即可。您应该能够从l计算出入射点和出射点(提示:它类似于sqrt(1-x^2))。 - masterxilo
3个回答

1
使用轨迹的参数方程式:X= X0 + t.P + X0Y = t.Q + Y0(从(X0,Y0)开始,朝向(P,Q))。
将其代入圆的方程式(X - Xc)^2 + (Y - Yc)^2 = R^2,得到:
(t.P + Dx)^2 + (t.Q + Dy)^2 = (P^2+Q^2).t^2 + 2.(P.Dx+Q.Dy).t + Dx^2+Dy^2 = R^2.

这是一个关于 t 的二次方程。只要有正根,盾牌就会被击中。
如果你的抛射物半径不为零,可以想象你将抛射物缩小至 0,将目标放大至 R + r

1

你的盾可以描述为:

(X - X1)^2 + (Y - Y1)^2 = R^2

抛体的轨迹可以描述为:

Y - Y3 = ((Y4 - Y3) / (X4 - X3)) * (X - X3)

从这里开始,

Y = ((Y4 - Y3) / (X4 - X3)) * (X - X3) + Y3

使用上面的方程式扩展第一个方程式,我们得到:
(X - X1)^2 + (((Y4 - Y3) / (X4 - X3)) * (X - X3) + Y3 - Y1)^2 = R^2

这是一个二次方程,如果解决了它,就会给出交点的X值。阅读链接以获取二次方程的解法,它将帮助您用单个公式解决问题的第一个冲动。当然,如果判别式为负,则没有交点,因为方程没有实数解。如果判别式为0,则抛射物仅触及盾牌,如果判别式为正,则可以通过方程的解得到进入和退出的X值。
知道X的值,您可以使用以下公式计算Y的值:
Y = ((Y4 - Y3) / (X4 - X3)) * (X - X3) + Y3

最后,需要注意的是,这仅适用于弹道线不是垂直的情况,因为这样X4将等于X3,使得基本方程无用。对于弹道穿过垂直线的情况,该线的方程将是:

X = X1

而且您可以使用以下方程式

Y = ((Y4 - Y3) / (X4 - X3)) * (X - X3) + Y3

为了得到可能的解答(再次强调,这是一个二次方程)

因此,实现应该检查抛射物的轨迹是否垂直,并选择相应的解决方案。我希望这可以帮助你。


0
如果您将盾牌制作为一个 GameObject,您可以使用 Bounds 来确定弹丸的未来路径是否包含在盾牌区域内(Bounds链接)。计算弹丸的未来路径。然后通过使用 Bounds.Contains 检查弹丸的任何未来点是否在盾牌范围内。如果是,则会击中目标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接