如何在绘画事件之间插入碰撞

How to interpolate collisions between paint events

最近,我一直在为二维应用程序研究各种奇特的碰撞检测算法和四叉树,并让我的应用程序处于我想要开始实施这些碰撞算法的位置。我的游戏循环有能力计算我的帧的 Δt,我想在绘制的帧之间执行 'interpolation' 碰撞检查(与 'brute-force' 方法相反:尽可能快地绘制会导致性能和动画质量普遍下降)。

底衬

实现 'interpolation' 碰撞检查的最有效方法是什么,此外,是否有任何碰撞算法可以简单地采用 Δt 和速度来为我进行插值?


其他想法和信息

我在四叉树中的 AABB 之后对图像使用逐像素交集。图像本质上表示为矩形,我发现计算适合定义的 alpha 透明度阈值的图像像素周围的 convex/concave 多边形然后执行一些其他算法(例如 minkowski 门户细化或递归圆)效率太低。尽管由于图像的特定矩形约束形状(知道这一点,我通过用 AABB 碰撞检查包装检查来减少每个像素检查),尽管它在速度方面效率低下,但我还是选择了每个像素。以后我可能会尝试 re-optimize/use 不同于 AABB 的方法,因为我的图像会以不同的角度旋转。

游戏循环代码:其中 update() 处理追赶操作。

currentUpdateTime = System.nanoTime();

    while(true) {
        beginLoopTime = System.nanoTime();

        drawPanel.repaint();

        lastUpdateTime = currentUpdateTime;
        currentUpdateTime = System.nanoTime();
        update((int) ((currentUpdateTime - lastUpdateTime)/( Math.pow(10,-9) )));//1000*1000

        endLoopTime = System.nanoTime();
        deltaLoop = endLoopTime - beginLoopTime;

        if(deltaLoop <= desiredDeltaLoop) {
           try {
           /*Refer to: '
           on differences between Thread.sleep() and wait()*/
               wait((long) ((desiredDeltaLoop - deltaLoop)/( Math.pow(10,-6) )));
           } catch(InterruptedException e) {
               e.printStackTrace(System.out);
           }
        }
    }

首先我要说的是,这肯定不是最佳答案。这是我能想到的一种技术 "off the bat",但我所知道的并没有在实践中使用。话虽如此:

您可以通过将您的 space 视为 3D space 且第 3 维是时间,然后应用 3D 碰撞检查技术来完成您对窗格随时间移动的 2D 碰撞检查。同时占据相同 space 的面板将表示为相交的 3D 形状,交点会告诉您碰撞发生的时间。