文章目录
- 官方示例
- 可视化
官方示例
pymunk是一款2D物理引擎,在游戏开发中十分有用。安装过程无坑
pip install pymunk
下面举出官网的一个案例,来简述pymunk的使用流程
import pymunkspace = pymunk.Space()
space.gravity = 0,-981body = pymunk.Body()
body.position = 50,100poly = pymunk.Poly.create_box(body)
poly.mass = 10
space.add(body, poly)print_options = pymunk.SpaceDebugDrawOptions()
space.debug_draw(print_options) # 打印状态
其中,
- space是一个可供拟合的空间,通过指定gravity设置竖直向下的重力。
- body是一个刚体,通过position指定初始位置在 ( 50 , 100 ) (50,100) (50,100)
- poly是刚体的形状,通过mass指定这个形状的质量
- 最后,调用add将body和poly添加到仿真空间中。
其状态输出如下
draw_polygon ([Vec2d(55.0, 95.0), Vec2d(55.0, 105.0), Vec2d(45.0, 105.0), Vec2d(45.0, 95.0)], 0.0, SpaceDebugColor(r=44.0, g=62.0, b=80.0, a=255.0), SpaceDebugColor(r=52.0, g=152.0, b=219.0, a=255.0))
逐个拆解,draw_polygon表示后面的元组是一个多边形,Vec2d显然是二维平面中的点,4个点构成一个四边形,即poly所对应的形状。由于刚体位置设置在 ( 50 , 100 ) (50,100) (50,100)处,而create_box默认的边长为 ( 10 , 10 ) (10,10) (10,10),所以其四个角的值分别是 50 ± 5 , 100 ± 5 50\pm5, 100\pm5 50±5,100±5。
接下来,对这个空间进行模拟,其方法非常简单,只需调用step命令即可。
ps = [(50,100)] # 记录刚体位置
for _ in range(100): # 运行100次space.step(0.02) # 步进ps.append(body.position)
可视化
接下来可以绘制一下多边形历经区域,考虑到pymunk主要应用在游戏设计中,故而通过pygame实现绘图
import pygame as pg
from pygame.draw import circlepg.init()
screen = pg.display.set_mode((320, 180))c = pg.time.Clock()i = 0
while True:if pg.QUIT in [e.type for e in pg.event.get()]:pg.quit()breakscreen.fill("purple")c.tick(60) # 5i += 1circle(screen, "blue", ps[i%100], 10)print(ps[i%100])pygame.display.update()
由于pygame中,Y轴原点在左上角,所以下图中的重力方向与现实刚好相反。