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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:24:20