Pymunk Body对象位置异常:赋值后显示Vec2d(nan, nan)问题求助
Pymunk中Body位置变为Vec2d(nan, nan)的解决方法
在使用Pymunk结合Pygame创建静止小球时,设置body.position后输出始终是Vec2d(nan, nan),运行代码后绘图报错。测试发现即使手动重新赋值位置,结果依然是NaN。
问题根源
默认创建的pymunk.Body()是动态体(Dynamic Body),这类物体需要设置有效的质量和转动惯量才能正常参与物理模拟。如果不指定参数,Pymunk会默认给动态体设置质量为0,这会导致物理计算中出现除以0的情况,进而让位置、速度等属性变成NaN,甚至手动赋值位置也会因为内部状态异常而失效。
解决方案
根据你的需求(创建静止小球,后续再添加移动逻辑),有两种可行方案:
方案1:创建静态体(推荐,适合静止物体)
静态体的质量为无穷大,不会受到物理力的影响,位置可以稳定设置,适合不需要移动的物体:
# 替换原有的body创建代码 body = pymunk.Body(body_type=pymunk.Body.STATIC) body.position = 400, 400
方案2:创建带有效质量的动态体(适合后续需要移动的物体)
如果之后要让小球具备物理运动能力,需要给动态体设置非0的质量和转动惯量:
# 参数分别为质量和转动惯量,这里设置质量为1,转动惯量为10(适合小球) body = pymunk.Body(1, 10) body.position = 400, 400
修改后的完整代码
import pymunk import pygame pygame.init() space = pymunk.Space() FPS = 60 clock = pygame.time.Clock() # 使用静态体创建静止小球 body = pymunk.Body(body_type=pymunk.Body.STATIC) body.position = 400, 400 shape = pymunk.Circle(body, 10) space.add(body, shape) (width, height) = (600, 400) display = pygame.display.set_mode((width, height)) def main(): while True: for event in pygame.event.get(): if event.type == pygame.QUIT: return display.fill((255,255,255)) x, y = body.position pygame.draw.circle(display, (255,0,0), (int(x), int(y)), 10) clock.tick(FPS) space.step(1/FPS) main() pygame.display.quit() pygame.quit()
补充说明
- 静态体不需要设置质量,Pymunk会自动处理其物理属性,确保位置不会因为模拟错误变成NaN。
- 如果后续需要将静态体改为动态体,可以通过
body.body_type = pymunk.Body.DYNAMIC修改,同时记得设置质量和转动惯量。
内容的提问来源于stack exchange,提问作者Ishwari Katariya
相关产品推荐
相关产品推荐

