Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 探测可能的射弹与护盾碰撞_C#_Unity3d_Collision Detection_Computational Geometry - Fatal编程技术网

C# 探测可能的射弹与护盾碰撞

C# 探测可能的射弹与护盾碰撞,c#,unity3d,collision-detection,computational-geometry,C#,Unity3d,Collision Detection,Computational Geometry,我试着去探测,是否有一个炮弹会击中一个盾牌,以及在哪里会发生碰撞 在这张图上,你可以看到情况。虽然A和B射弹与护盾中心的距离大致相同S,但其中一个会与护盾碰撞,另一个不会 数学上简单的解决方案将使用圆的数学方程和射弹路径的直线方程 用一支笔和一张纸,我就能算出。然而,我在直接实现解析几何方面有一个非常糟糕的经验 此外,这将为离开防护罩的射弹返回正数。如何过滤它们 第二种方法是测量射弹路径和护盾中心之间的最小距离,如果l小于r,则发生碰撞 它似乎更容易实现,但没有让我知道碰撞将发生在哪里 我

我试着去探测,是否有一个炮弹会击中一个盾牌,以及在哪里会发生碰撞

在这张图上,你可以看到情况。虽然
A
B
射弹与护盾中心的距离大致相同
S
,但其中一个会与护盾碰撞,另一个不会

数学上简单的解决方案将使用圆的数学方程和射弹路径的直线方程

用一支笔和一张纸,我就能算出。然而,我在直接实现解析几何方面有一个非常糟糕的经验

此外,这将为离开防护罩的射弹返回正数。如何过滤它们

第二种方法是测量射弹路径和护盾中心之间的最小距离,如果
l
小于
r
,则发生碰撞

它似乎更容易实现,但没有让我知道碰撞将发生在哪里

我在二维空间工作。我正在使用C#和Unity引擎,不过欢迎使用通用解决方案


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

你的盾牌可以描述为:

(X - X1)^2 + (Y - Y1)^2 = R^2
Y - Y3 = ((Y4 - Y3) / (X4 - X3)) * (X - X3)
射弹的线可以描述为:

(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
得到可能的解(同样,这是一个二次方程)


因此,实现应该检查投射物的线是否垂直,并且您应该选择相应的解决方案。我希望这对您有所帮助。

如果您将盾牌制作为
游戏对象,您可以使用
边界来确定投射物的未来路径是否包含在盾牌区域内()。计算投射物的未来路径。然后使用
bounds.Contains
查看投射物的未来点是否在盾牌边界内。如果是,那么它将命中。

使用轨迹的参数方程:
X=X0+t.p+X0
Y=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
中的二次方程。只要有正根,护盾就会被击中


如果您的射弹具有非零半径
r
,请想象您将射弹放气至
0
,并将目标充气至
r+r

,如果您正确地进行了数学计算,并从射线的原点和t乘以directon向量开始,则实际击中圆的解将具有正t。另一种方法也很好,你只需要计算出光线的直线碰撞和穿过圆心垂直于光线的直线。您应该能够从l计算入口和出口点(提示,它类似于sqrt(1-x^2))。