Python物理库?

9
有没有适用于Linux的Python物理库?我正在使用PyGame开始学习Python,但是PyGame缺少物理库,这很不爽。我花了大约两个小时寻找一个好的物理库,但就像试图抓住油一样,我似乎做不到。
我几乎不需要物理引擎;我想做的只是编程一个对象“跳”起来然后落回地面。似乎有一些简单的碰撞(PyGame可以处理,我想),但实际的跳跃计算让我困惑。如果没有好的可用物理库,问题似乎很简单,我可能会尝试找到一个基本的加速度方程和重力方程并尝试应用它们……尽管如此,我还是想避免这样做。
谢谢任何帮助。

1
基本的物理运动方程就是你所需要的。虽然问题已经得到了回答,但如果我是你,我仍然会手动计算,因为使用库似乎有些过度。从速度方程开始。 - Chuck Dries
4个回答

5

Pymunk 是另一个值得关注的有前途的技术,你可能想要了解一下。


4
尝试使用pyODE,它是open dynamic engine的Python绑定。您可以在这里找到更多信息。

好的,在经历了很多痛苦和“成功”安装模块之后,我运行了一个PyODE示例,结果出现了这个错误:“ImportError: No module named ode”。嗯?我已经安装了它!你知道这里出了什么问题吗? - Elliot Bonneville
@Elliot,能否告诉我你的Python版本和操作系统,以及你如何安装pyODE?我使用了Windows安装程序,一切都很顺利。 - xiao 啸
我正在Linux(Ubuntu 10.10)上使用Python 2.7。看起来pyODE正在安装到2.6,但是当我使用别名运行一个Python 2.6示例时,它仍然给出相同的错误。 - Elliot Bonneville
我首先通过安装ODE,然后使用“python setup.py install”命令行函数安装pyODE。 - Elliot Bonneville

1
基本的物理运动学方程就是你所需要的。虽然问题已经得到了回答,但如果我是你,我仍然会手动计算,因为使用库似乎有些过度。从速度方程式开始:
velocity = initial velocity + (acceleration * time) 

从那里开始,我们进行集成以找到位置:
position = initial position + (initial velocity * time) + (acceleration * time^2)/2

你的跳跃需要计算角色的y位置,因此只需使用该方程计算y位置并玩弄初始速度和加速度。标准重力加速度为-9.8米每秒^2(至少在地球表面上是如此-在不同行星上则有所不同)。从角色所在的初始位置开始,或者如果对你来说地面高度为0,则从0开始。
y = vt + (-4.9)t^2

选择一个初始速度v值,以提供跳跃开始时的向上运动,t应该是自他开始跳跃以来经过的游戏时间。
您只需要一行代码即可完成此操作,无需任何库!
编辑:处理着陆后要做什么。
所以在现实世界中,加速是由不平衡的力引起的。重力总是作用在你身上,但当你站在地面上时,它被地面的“法向力”抵消和取消。只要你站立的地面足够强大,地面就会向上推并抵消重力,你就不会向下加速。因此,在您的游戏中,如果您实际上没有模拟力,则可以在角色接触地面时将加速度从-9.8更改为0。如果地面是平坦的,则当position = initial position时,您的跳跃结束。

1
嗨,Chuck,感谢你清晰简洁的回答。我将我的接受答案改为你的,因为它可能对未来寻找实现“跳转”代码最简单方法的人更有用。 - Elliot Bonneville
@elliot 感谢您的反馈。 - Chuck Dries
未来更新:值得注意的是,许多游戏实现的跳跃并非基于物理学。例如,2D马里奥游戏中,马里奥下落速度比他应有的要快得多。在3D马里奥游戏中,他下落速度要慢得多。这只是一个需要考虑的问题 - 如果您不想遵守物理规律,那么您的游戏就不必如此! - Chuck Dries

0
根据ODE网站的安装说明,ODE软件包本身现在包含基于CPython的Python绑定;而pyODE绑定被认为是过时的。安装说明包含在上述页面中。
默认情况下,这适用于Python 2,但我能够通过最少的工作(Mac OS X)使此绑定与Python 3一起使用。我甚至可以运行教程。
这可能与主题无关,但仅供记录,这是我必须更改的内容:
  1. 我不得不更改OpCode.h,通过取消注释sqrtsincosasinacos#defines(第33-37行,文件版本:2001年3月20日)。这是一个丑陋的hack,因为如果我们相信ODE页面上的文档,没有这个就无法使用双精度算术编译ODE本身,而我们需要在Python绑定中使用它。
  2. 我不得不更改setup.py,在第18行后添加以下行:

    # 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
    

就是这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接