当前位置: 首页 > news >正文

Pygame基础10-物理模拟

PyMunk

PyMunk是一个模拟物理的库。

注意,PyMunk只是进行物理模拟,不包含可视化的功能。如果需要可视化,可使用pygame等库。

可用pip安装pymunk
pip install pymunk

在这里插入图片描述

pymunk中的概念

  • space: 物理空间。 包含gravity 模拟重力,update更新空间。

  • Body: 原子物体(一个点,没有形状),受到力的影响。

  • Shape:形状,包围在Body周围,用于检测碰撞。

pymunk中有3种类型的Body

  • static:静止的,不会移动,但是可以产生碰撞。
  • dynamic:动态的,受到力的影响。
  • kinematic:受玩家控制(或非物理控制)的影响。

在这里插入图片描述

模拟的过程

  1. 创建空间
space = pymunk.Space()
space.gravity = (0.0, 100.0)
  1. 创建Body和shape, 并加入到空间中
def create_apple(space, pos):body = pymunk.Body(mass=1, moment=10, body_type=pymunk.Body.DYNAMIC) # DYNAMIC 类型的物体会受到力的影响body.position = posshape = pymunk.Circle(body, radius=10)space.add(body, shape)return shape

(如果使用pygame可视化)绘制物体:

def draw_apple(apples):for apple in apples:pos_x = int(apple.body.position.x)pos_y = int(apple.body.position.y)pygame.draw.circle(screen, (255, 0, 0), (pos_x, pos_y), 10)
  1. 更新空间
...
# 在每一帧中更新空间
space.step(1/60.0)

案例

下面是一个完整示例,模拟苹果掉落的过程。
在这里插入图片描述

import sys
import pygame
import pymunkpygame.init()
screen_size = (800, 600)
screen = pygame.display.set_mode(screen_size)
clock = pygame.time.Clock()space = pymunk.Space()
space.gravity = (0.0, 100.0)def create_apple(space, pos):body = pymunk.Body(mass=1, moment=10, body_type=pymunk.Body.DYNAMIC) # DYNAMIC 类型的物体会受到力的影响body.position = posshape = pymunk.Circle(body, radius=10)space.add(body, shape)return shapedef draw_apple(apples):for apple in apples:pos_x = int(apple.body.position.x)pos_y = int(apple.body.position.y)pygame.draw.circle(screen, (255, 0, 0), (pos_x, pos_y), 10)def create_static_ball(space, pos):body = pymunk.Body(body_type=pymunk.Body.STATIC) # STATIC 类型的物体 不会移动body.position = posshape = pymunk.Circle(body, radius=10)space.add(body, shape)return shapedef draw_balls(balls):for ball in balls:pos_x = int(ball.body.position.x)pos_y = int(ball.body.position.y)pygame.draw.circle(screen, (0, 255, 0), (pos_x, pos_y), 10)apples =[]balls = []
balls.extend([create_static_ball(space, (400, 300)),create_static_ball(space, (500, 400))])while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN:pos = pygame.mouse.get_pos()apple = create_apple(space, pos)apples.append(apple)screen.fill((35, 35, 35))draw_apple(apples)draw_balls(balls)space.step(1/60.0)pygame.display.flip()clock.tick(60)
http://www.lryc.cn/news/332154.html

相关文章:

  • 蓝桥杯 --- 日期问题模板
  • Java 处理Mysql获取树形的数据
  • 前端三剑客 —— CSS ( 坐标问题 、定位问题和图片居中 )
  • 向量数据库 | AI时代的航道灯塔
  • Linux中的conntrack命令深入解析
  • 反截屏控制技术如何防止信息通过手机拍照泄漏?
  • 0.k8s简介
  • VScode 集成终端设置默认打开当前文件夹 mac系统
  • HDLbits 刷题 -- Alwaysblock2
  • 一、Docker部署GitLab(详细步骤)
  • Vue3 Ajax(axios)
  • 正则表达式引擎库汇合
  • eBay买家号注册下单容易死号?是什么原因导致?
  • 【Linux】-进程知识铺垫①计算机硬件的组织:冯诺依曼体系结构详细解读②关于操作系统对软硬件及用户的意义
  • 让ECC升级S/4HANA一步到位的“全面升级方案包”
  • AutoGluon
  • 【网站项目】少儿编程管理系统
  • 基于C语言的数据结构--顺序表讲解及代码函数实现展示
  • (学习日记)2024.03.31:UCOSIII第二十八节:消息队列常用函数
  • DLC原理解析及其优化思考
  • tigramite教程(七)使用TIGRAMITE 进行条件独立性测试
  • 【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置
  • 鸿蒙OS开发实例:【应用状态变量共享】
  • C#清空窗体的背景图片
  • Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)
  • 将写好的打印机代码打包成jar包然后直接注册成windows服务,然后通过调用插件的接口地址将流传到接口实现解析并无需预览直接通过打印机直接打印PDF文件
  • 加密软件VMProtect教程:使用脚本-功能
  • 51单片机入门_江协科技_21.1_开发板USB口连接建议
  • 基于Spring Boot 3 + Spring Security6 + JWT + Redis实现登录、token身份认证
  • Kubernetes(k8s):精通 Pod 操作的关键命令