猿问

如何找到移动物体与障碍物的完美碰撞

我有两个精灵:一个机器人精灵和一个障碍精灵。我正在使用 mask.overlap 来确定是否存在重叠以防止机器人进入障碍物区域(它起到阻挡障碍物的作用)。下面是运动评估代码的一部分。它会测试移动是否会导致碰撞:


if pressed_keys[pygame.K_s]:

    temp_position = [robot.rect.x, robot.rect.y]

    temp_position[1] += speed

    offset_x = temp_position[0] - obstacle.rect.x

    offset_y = temp_position[1] - obstacle.rect.y


    overlap = obstacle.mask.overlap(robot.mask, (offset_x, offset_y))

    if overlap is None:

        robot.rect.y += speed

    else:

        # adjust the speed to make the objects perfectly collide

此代码有效。如果移动会导致碰撞,则它会阻止机器人移动。


问题


对于高速,代码会阻止其正常移动,但会在机器人和障碍物之间留下视觉间隙。


例如:如果速度为 30,两个障碍物相距 20 像素,则代码将阻止移动,因为会导致碰撞。但留下了 20 像素的差距。


目标


如果发生碰撞,将速度调整到剩余像素距离(如示例中的 20 像素),以便机器人和障碍物完美碰撞。机器人不能移动 30,但他可以移动 20。我如何计算剩余距离?


慕勒3428872
浏览 142回答 3
3回答

慕仙森

您可以通过二分搜索轻松获得精确(如果不是精确)解决方案:一旦在整个步骤结束时检测到碰撞,请尝试半步,然后是四分之一或四分之三,依此类推。这将碰撞测试视为移动距离的布尔值函数并寻找“零”(实际上是从未命中到命中的过渡)。请注意,这无助于解决问题剪裁通过薄壁或角(在最初的碰撞测试未能检测到障碍物时),并用复杂的障碍,会发现一个任意边缘(不一定是第一个)停止在。

侃侃尔雅

我决定采用 skrx 在他的评论中建议的方法:基本上备份 1px 直到不再发生碰撞。if pressed_keys[pygame.K_s]:    temp_position = [robot.rect.x, robot.rect.y]    temp_position[1] += speed    offset_x = temp_position[0] - obstacle.rect.x    offset_y = temp_position[1] - obstacle.rect.y    overlap = obstacle.mask.overlap(robot.mask, (offset_x, offset_y))    if overlap is None:        robot.rect.y += speed    else:        for step_speed in range(1, speed - 1):            collision[1] -= 1            offset_x = collision[0] - obstacle.rect.x            offset_y = collision[1] - obstacle.rect.y            overlap_adj = obstacle.mask.overlap(robot.mask, (offset_x, offset_y))            if overlap_adj is None:                robot.rect.y += (speed - step_speed)                break这是一个有点笨拙的方法,但它会满足我现在的需要并保持矢量数学在海湾。对于那些正在寻找使用归一化向量等解决此问题的正确方法的人,我建议使用提供的答案 skrx。我可能会回到这个问题并在将来更新它。但就目前而言,这将为用户提供关于如何进行完美碰撞的几个选项。
随时随地看视频慕课网APP

相关分类

Python
我要回答