Python 物理引擎 Pymunk 最完整教程(上)
Pymunk 是一个基于 Chipmunk 物理引擎的 Python 封装库,非常适合用来开发2D物理模拟游戏或应用。它提供了简单易用的 API,能够处理物理学中的刚体、碰撞、重力、摩擦等特性。接下来,我们将通过一些实例来介绍 Pymunk 的基本用法。
安装 Pymunk
首先,你需要安装 Pymunk。可以通过 pip 来安装:
pip install pymunk
创建物理空间
在 Pymunk 中,物理模拟是通过创建一个空间(Space)来实现的。空间是一个物理世界的容器,其中包含刚体、约束和碰撞体等。
import pymunk
# 创建一个物理空间
space = pymunk.Space()
space.gravity = (0, -981) # 设置重力为向下的981单位
创建刚体
刚体是物理空间中最基本的元素。我们可以创建一个刚体并为其添加形状。
# 创建一个刚体
mass = 1
radius = 20
body = pymunk.Body(mass, pymunk.moment_for_circle(mass, 0, radius, (0, 0)))
body.position = (400, 500) # 设置初始位置
# 创建形状并添加到空间
shape = pymunk.Circle(body, radius)
shape.elasticity = 0.95 # 弹性
space.add(body, shape)
在上面的代码中,我们创建了一个质量为1的圆形刚体,半径为20,并设置了初始位置。
处理碰撞
Pymunk 允许你对物体之间的碰撞进行处理。你可以通过设置碰撞类型来分别处理不同物体的碰撞。
shape.collision_type = 1 # 设置碰撞类型
要检测碰撞,首先需要定义一个处理函数,并将其添加到空间中:
def collision_handler(arbiter, space, data):
print("发生碰撞!")
return True # 返回 True 以继续处理碰撞
# 添加碰撞处理程序
handler = space.add_collision_handler(1, 1)
handler.begin = collision_handler
更新物理空间
在每一帧,我们都需要调用 space.step(dt)
来更新物理空间的状态,dt
是时间步长。
下面是一个完整的示例,它创建了一个简单的物理模拟环境,包含一个可自由下落的圆形刚体。
import pymunk
import pygame
import sys
# 初始化 Pygame
pygame.init()
# 创建一个窗口
screen = pygame.display.set_mode((800, 600))
# 创建物理空间
space = pymunk.Space()
space.gravity = (0, -981)
# 创建刚体和形状
mass = 1
radius = 20
body = pymunk.Body(mass, pymunk.moment_for_circle(mass, 0, radius, (0, 0)))
body.position = (400, 500)
shape = pymunk.Circle(body, radius)
shape.elasticity = 0.95
space.add(body, shape)
# 主循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 更新物理空间
space.step(1/60.0)
# 清屏
screen.fill((255, 255, 255))
# 绘制圆形刚体
pygame.draw.circle(screen, (0, 0, 255), (int(body.position.x), 600 - int(body.position.y)), radius)
# 更新显示
pygame.display.flip()
在这个示例中,我们使用 Pygame 创建了一个窗口,并在窗口中显示一个自由下落的圆形刚体。物体受重力影响,会不断下落,同时我们也检测到了窗口的关闭事件。
通过这个基础示例,你可以看到如何开始使用 Pymunk。后续的教程将会深入探讨更多功能,包括更复杂的形状、碰撞、约束、以及如何优化物理模拟。