Pymunk仿真中center_of_gravity不变化的问题咨询
问题原因解析
核心区别:局部坐标系 vs 世界坐标系
body.position是刚体在世界坐标系中的原点坐标,会随着物理仿真(比如受重力下落)不断更新,反映刚体在整个物理空间中的位置变化。body.center_of_gravity是刚体自身局部坐标系下的重心位置,默认就是局部坐标系的原点Vec2d(0.0, 0.0)——除非你手动给刚体设置了重心偏移,否则这个值永远不会随刚体的世界位置改变。
你的代码情况
你创建的动态刚体和对应的矩形形状,都是以刚体自身原点为中心生成的,所以刚体的重心在局部坐标系里就是(0,0)。不管刚体在世界里怎么移动,这个局部坐标下的重心值都不会变。
如何获取世界坐标系下的重心
如果想看到重心在世界中的实际位置,需要把局部坐标转换为世界坐标,用body.local_to_world(body.center_of_gravity)计算,这个结果会和body.position同步变化。
修正后的代码(顺便补全了循环缩进):
import pymunk space = pymunk.Space() space.gravity = (0, -100) body = pymunk.Body(body_type=pymunk.Body.DYNAMIC) body.mass = 1 body.moment = pymunk.moment_for_box(body.mass, (100, 100)) shape = pymunk.Poly.create_box(body, (100, 100), 0) space.add(body, shape) for i in range(100): world_cog = body.local_to_world(body.center_of_gravity) print("局部重心={0}\n世界重心={1}\n刚体位置={2}\n".format( body.center_of_gravity, world_cog, body.position)) space.step(0.5)
内容的提问来源于stack exchange,提问作者Dooly
相关产品推荐
相关产品推荐

