【问题标题】:Simulating a simple physics related scenario模拟一个简单的物理相关场景
【发布时间】:2011-08-08 20:46:48
【问题描述】:

我在这两种模拟中都是初学者,所以这个问题可能很愚蠢。如果是这样,请随时编辑它。我正在尝试在 Python 中模拟以下场景。我将一些小粒子随机放置在具有固定尺寸的 2D 场中。每个粒子都有一个作用半径r。如果第一个粒子在其作用半径内有第二个粒子,则必须对两个粒子施加一个力(第一个粒子对第二个粒子的影响,反之亦然),我的力函数定义为:

f(i,j)_n = (r - |pi_n - pj_n|)((pj_n - pi_n)/|pi_n - pj_n|)

其中n是当前时间步,pi_n代表i在时间步n的位置,||代表幅度计算,(pj_n - pi_n)代表向量减法。

我想知道是否有任何库可以为我简化这些内容。我所需要的基本上如下:

time-step particle position(x,y)

请问有人给我一些建议吗?

【问题讨论】:

  • 如果您完全是模拟初学者,我建议您尝试自己编写。这些库可能会让初学者感到困惑。此外,您将学习这些东西。

标签: python physics


【解决方案1】:

谷歌搜索python library vector 2d 返回http://www.supereffective.org/pages/Vector-2d-Vector-Library 作为热门搜索,这似乎是一个称职的库(包含投影和垂直化、标准化、旋转、缩放等)

只要粒子的数量不太大,这应该可以与集成方案结合使用。例如你跟踪每个粒子的(pos,vel),也许还有加速度向量,并使用:

F = m a

->F = m dv/dt

->dv/dt = F/m

因此

dv ~= dt*F/m

->v' - v ~= dt*F/m

->ball.vel += timeStep*sum(ball.force(n) for n in ball.neighbors())/ball.mass

这是欧拉积分,它的属性很差,但对于游戏来说还可以。

【讨论】:

    【解决方案2】:

    我真的很喜欢 pymunk 物理库,它是花栗鼠物理库的包装器。

    首先需要初始化库:

    import pymunk
    pymunk.init_pymunk()
    space = pymunk.Space()
    space.gravity = (0.0, -100.0)
    

    要实现您所要求的点赞,您必须为要创建的每个粒子创建一个Body 和一个Circle 形状。

    mass = 1
    radius = 14
    inertia = pymunk.moment_for_circle(mass, 0, radius, (0,0))
    body = pymunk.Body(mass, inertia)
    x, y = random.randint(0, 200), random.randint(0, 200)
    body.position = x, 550
    shape = pymunk.Circle(body, radius, (0,0))
    shape.sensor = True
    space.add(body, shape)
    

    粒子不会相互碰撞,因为sensor 标志设置为True。半径现在有点影响范围。

    现在,我们为具有重叠影响区域的粒子创建回调函数:

    def near_callback(space, arbiter, *args, **kwargs):
        body_i = arbiter.shapes[0].body
        body_j = arbiter.shapes[1].body
    
        # calculate the forces force_i and force_j with your formula
        ...
    
        body_i.apply_force(force_i)
        body_j.apply_force(force_j)
    

    回调设置在space:

    space.set_default_collision_handler(near_callback, near_callback, None, None, None)
    

    当然,space 必须在每个时间范围内“步进”:

    space.step(dt)
    

    我希望这有点可以理解和有帮助。

    【讨论】:

    • 我知道这已经很晚了,但我正在重新审视这个问题并尝试你的答案。您是否愿意向我指出有关 pymunk 的任何有用材料?我设置了dt=1 并做了将近100 次space.step(dt),但从未调用过回调。可能是我做错了什么。你介意展示一个我可以玩的工作示例吗?
    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多