小编ARu*_*ord的帖子

点-多边形滑动碰撞检测中如何防止浮点误差

我正在尝试编写一个函数来处理我正在编程的游戏中的运动。我几乎拥有的作品,但是在某些情况下它崩溃了。

我已经编写了一个最小的说明性示例,如下所示。在此示例中,我试图计算由点表示的对象的移动和运动矢量。根据一组多边形检查该对象的移动路径,这些多边形被细分为线段以进行测试。当此对象与线段碰撞时,我希望它沿该线段滑动(而不是停下来或反弹)。

为此,我沿着预期的碰撞路径进行检查,如果找到了相交点,则沿着相交的线段的路径从该相交点进行新的测试,并计算其余运动的幅度。

在此处输入图片说明

当我们沿着线段滑入“口袋”时,就会出现问题。通常,碰撞检查会通过形成凹穴的两个线段,并且物体会滑过。因为我平行于一个线段行进,并且在端点处与两个线段相交,所以我认为此问题是由浮点错误引起的。它是否通过,被捕获或被捕获一次,然后在第二次检查中通过都似乎完全是随机的。

我正在使用在这里找到的简单算法来计算交集:https : //stackoverflow.com/a/20679579/4208739,但是我也尝试了许多其他算法。都表现出相同的问题。

(Vector2是Unity库提供的类,它仅将x和y坐标保存为浮点数。Vector2.Dot函数仅计算点积)。

//returns the final destination of the intended movement, given the starting position, intended direction of movement, and provided collection of line segments
//slideMax provides a hard cap on number of slides allowed before we give up
Vector2 Move(Vector2 pos, Vector2[] lineStarts, Vector2[] lineEnds, Vector2 moveDir, int slideMax)
{
    int slideCount = 0;
    while (moveDir != Vector2.zero && slideCount < slideMax)
    {
        pos = DynamicMove(pos, lineStarts, lineEnds, moveDir, out moveDir);
        slideCount++; …
Run Code Online (Sandbox Code Playgroud)

c# collision-detection floating-accuracy game-physics

7
推荐指数
1
解决办法
172
查看次数