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。后续的教程将会深入探讨更多功能,包括更复杂的形状、碰撞、约束、以及如何优化物理模拟。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部