检测可能的射弹与盾牌碰撞

时间:2014-03-24 23:14:28

标签: c# unity3d collision-detection computational-geometry

我试图发现一个射弹是否会撞到一个盾牌 - 碰撞发生在哪里。

enter image description here

在此图片上,您可以看到情况。虽然AB射弹与盾牌中心S的距离大致相同,但其中一个会与盾牌发生碰撞而另一个则不会。“

enter image description here

数学上直截了当的解决方案将使用圆的数学方程和抛射路径线的方程。

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

此外,这将使弹丸离开盾牌返回正数。我该如何过滤它们?

enter image description here

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

实施起来似乎更容易,但不让我知道碰撞发生在哪里。

我从事二维工作。我正在使用C#和Unity引擎,但欢迎使用通用解决方案。

当然,射弹被认为是零尺寸的点。

3 个答案:

答案 0 :(得分: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

这是一个quadratic equation,如果求解,它将为您提供交叉点的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

获得可能的解决方案(再次,这是二次方程式)

因此,实施应该检查弹丸的线是否是垂直的,你应该选择相应的解决方案。我希望这能帮助你。

答案 1 :(得分:1)

使用轨迹的参数方程:X= X0 + t.P + X0Y = t.Q + Y0(从方向(X0, Y0)的{​​{1}}开始)。

将其插入圆圈等式(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,请想象您将射弹放气至r并将目标膨胀至0

答案 2 :(得分:0)

如果您将盾牌设为GameObject,则可以使用Bounds来确定投射物的未来路径是否包含在盾牌区域内(Link to bounds)。计算射弹的未来路径。然后使用Bounds.Contains查看射弹的任何未来点是否在盾牌范围内。如果是,那就会命中。