You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pymunk添加Segment多边形时报body需提前加入空间错误如何解决

问题根因

Pymunk要求绑定了刚体的形状,必须在添加形状前将对应刚体加入物理空间,或者两者同时添加到空间。你的代码只将Segment形状加入了空间,对应的Static Body没有被添加,因此触发断言报错。

修复方案

方案1:直接修复原有逻辑

如果需要每个Segment对应单独的刚体,在调用space.add时同时传入刚体和形状即可:

class StaticPoly:
    def __init__(self, space, pos, elasticity=1, collision_type=None):
        self.bodies = []
        self.shapes = []
        self.pos = pos
        for i in list(range(0, len(self.pos) - 1))+[-1]:
            print(i)
            self.bodies.append(pymunk.Body(body_type=pymunk.Body.STATIC))
            self.shapes.append(pymunk.Segment(self.bodies[i], self.pos[i], self.pos[i + 1], 1))
            self.shapes[i].elasticity = elasticity
            # 同时添加刚体和形状
            space.add(self.bodies[i], self.shapes[i])
            if collision_type:
                self.shapes[i].collision_type = collision_type

方案2:优化(推荐)

所有静态Segment不需要单独绑定刚体,共用同一个静态刚体即可,大幅减少不必要的资源占用:

class StaticPoly:
    def __init__(self, space, pos, elasticity=1, collision_type=None):
        self.shapes = []
        self.pos = pos
        # 全局共用一个静态刚体
        self.body = pymunk.Body(body_type=pymunk.Body.STATIC)
        for i in list(range(0, len(self.pos) - 1))+[-1]:
            seg_shape = pymunk.Segment(self.body, self.pos[i], self.pos[i + 1], 1)
            seg_shape.elasticity = elasticity
            if collision_type:
                seg_shape.collision_type = collision_type
            self.shapes.append(seg_shape)
        # 一次性添加刚体和所有形状
        space.add(self.body, *self.shapes)

额外提示:如果你需要的是实心多边形碰撞体,不需要自己拼接Segment,可以直接使用pymunk.Poly接口生成实心多边形,代码更简洁,碰撞检测效率也更高。

内容的提问来源于stack exchange,提问作者Sha7r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:45:00