【问题标题】:Python physics library? [closed]Python物理库? [关闭]
【发布时间】:2011-06-17 03:49:06
【问题描述】:

是否有任何适用于 Linux 的最新 Python 物理库?我刚刚使用 PyGame 进入 Python,但 PyGame 缺少物理库并不酷。我花了大约两个小时试图找到一个好的物理库,但这就像试图抢油一样;我好像做不到。

我几乎不需要物理引擎;我想做的就是将一个对象编程为“跳”起来然后落回地面。似乎发生了一些简单的碰撞(我认为 PyGame 可以处理),但让我难过的是实际的跳跃计算。如果事实证明没有任何好的可用物理库,那么问题似乎很简单,我可能会尝试找到一个基本的加速度方程和重力方程并尝试应用它们......我想避免不过,要这样做。

感谢您的帮助。

【问题讨论】:

  • 您只需要基本的物理运动学方程。即使问题已经得到解答,但如果我是你,我仍然会手工完成,因为使用库似乎有点过头了。启动速度方程。

标签: python physics pygame


【解决方案1】:

Pymunk 是另一个你可能想看看的有前途的。

【讨论】:

    【解决方案2】:

    试试pyODE,它是开放动态引擎的python绑定。

    您可以找到更多信息here

    【讨论】:

    • 好的,在经历了巨大的痛苦并“成功”安装了模块之后,我运行了一个 PyODE 示例,它给了我这个:'ImportError: No module named ode'。诶?我安装了!知道这里发生了什么吗?
    • @Elliot,您能告诉我您的 python 版本和操作系统,以及如何安装 pyODE?我使用的是 Windows 安装程序,它是开箱即用的。
    • 我在 Linux (Ubuntu 10.10) 上使用 Python 2.7。似乎 pyODE 正在安装到 2.6,但是当我将其中一个示例作为 Python 2.6(使用别名)运行时,它仍然给我同样的错误。
    • 我先安装 ODE,然后通过 'python setup.py install' 命令行功能安装 pyODE。
    【解决方案3】:

    您只需要基本的物理运动学方程。即使问题已经得到解答,但如果我是你,我仍然会手工完成,因为使用库似乎有点过头了。启动速度方程:

    velocity = initial velocity + (acceleration * time) 
    

    从那里,我们整合找到位置:

    position = initial position + (initial velocity * time) + (acceleration * time^2)/2
    

    您的跳跃正在计算角色的 y 位置,因此只需使用该等式计算 y 位置和玩具的初始速度和加速度。重力引起的标准加速度为-9.8 米每秒^2(至少在地球表面上 - 这是不同的行星不同的行星)。无论你的角色在哪里,都从初始位置开始,如果地面对你来说是 0,则从初始位置开始。

    所以:

    y = vt + (-4.9)t^2
    

    选择一个初始速度v 值来提供跳跃开始时的向上运动,t 应该是他开始跳跃后经过的游戏时间。

    你只需要一行代码就可以做到这一点,不需要库!

    编辑:处理着陆时的操作。

    所以在现实世界中,加速度是由不平衡的力引起的。重力总是作用在你身上,但是当你站在地面上时,它会被地面的“法向力”抵消和抵消。只要您站立的地面足够坚固以支撑您的体重,地面就会向上推并抵抗重力,您就不会向下加速。因此,在您的游戏中,如果您实际上并未模拟力,只需将角色接触地面时的加速度从 -9.8 更改为 0。如果地面平坦,你的跳跃会在position = initial position 时结束

    【讨论】:

    • 嗨 Chuck,感谢您简洁明了的回答。我正在将我接受的答案更改为您的答案,因为它可能对未来正在寻找实现“跳跃”代码的最简单方法的人们更有用。
    • @elliot 感谢您的反馈
    • 来自未来的更新:值得注意的是,很多游戏都实现了不基于物理的跳跃。例如,在 2d mario 游戏中,mario 下落的速度比他快得多。在 3d mario 游戏中,他下落的速度要慢得多。只是需要考虑一下 - 如果您不想让游戏遵守物理规则,您的游戏不必遵守!
    【解决方案4】:

    根据 ODE 网站的installation instructions,ODE 包本身现在包含基于 CPython 的 Python 绑定;并且 pyODE 绑定被认为是过时的。安装说明包含在上述页面中。

    默认情况下,这是针对 Python 2 的,但我也能够以最少的工作量(Mac OS X)使此绑定与 Python 3 一起工作。我什至可以运行教程。

    这可能超出主题,但为了记录,我必须更改以下内容:

    1. 我不得不通过取消注释 #defines 来更改 OpCode.h sqrtsincosasinacos(第 33-37 行,文件版本:2001 年 3 月 20 日) .这是我需要的一个丑陋的 hack,因为没有这个 ODE 本身就不能使用双精度算术编译,如果我们可以信任 ODE 页面上的文档,就需要将其与 python 绑定一起使用。
    2. 我必须通过在第 18 行之后添加以下行来更改 setup.py

      # bugfix: in Python3 read() returns bytes, which need to be converted
      # to strings
      try: 
          ode_cflags = [x.decode("utf-8") for x in ode_cflags]
          ode_libs = [x.decode("utf-8") for x in ode_libs]
      except:
          # in Python2 we just continue
          pass
      
    3. 要运行教程,在我使用的demos 目录中

      $ 2to3 -w *.py
      

    就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2019-02-20
      • 1970-01-01
      • 2016-10-26
      相关资源
      最近更新 更多