Pymunk物理体位置形状设置正确却未接触就碰撞是什么原因?
Pymunk未接触即触发碰撞的问题原因及修复方案
核心问题点
- 碰撞体尺寸与显示尺寸不匹配
你创建球的碰撞形状时设置的半径为60,对应碰撞箱直径为120像素,但实际球的显示图片仅缩放为60*60像素,碰撞箱比视觉显示大了一倍,会提前触发碰撞。 - 物理坐标与显示坐标不匹配
Pymunk中body.position返回的是物理体的中心坐标,但Pygame的blit方法传入的是图片的左上角坐标,你直接将物理中心坐标作为blit参数,会导致显示的图片比实际碰撞箱整体偏右下,视觉上两个物体还没接触时,实际碰撞箱已经重叠。
修复代码改动点
- 修改球的碰撞半径,和显示尺寸匹配:
# 原代码:shape = pymunk.Circle(body, 60) shape = pymunk.Circle(body, 30) # 60*60图片的半径为30
- 调整blit绘制坐标,将图片中心对齐物理体中心:
# 原绘制代码 # win.blit(ball_img, (b_body.body.position.x, b_body.body.position.y)) # win.blit(fb_img, (fb_body.body.position.x, fb_body.body.position.y)) # 修改后 win.blit(ball_img, (b_body.body.position.x - 30, b_body.body.position.y - 30)) # 减去图片宽高的一半 win.blit(fb_img, (fb_body.body.position.x - 15, fb_body.body.position.y - 10)) # 小鸟图片30*20,各减一半对齐中心
可选优化点
如果修改后仍有细微的提前碰撞,可以调整形状的collision_bias关闭默认的碰撞偏移(默认有少量偏移用于防止物体卡住):
shape.collision_bias = 0
内容的提问来源于stack exchange,提问作者EarthIsFlat
相关产品推荐
相关产品推荐

