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

python:pymunk + pygame 模拟六边形内小球弹跳运动

向 chat.deepseek.com 提问:编写 python 程序,用 pymunk, 有一个正六边形,围绕中心点缓慢旋转,六边形内有一个小球,六边形的6条边作为墙壁,小球受重力和摩擦力、弹力影响,模拟小球弹跳运动,中心点位置保持不变。

以下是结合 pymunk(2D 物理引擎)和 pygame 的 Python 脚本,模拟六边形中小球的弹跳运动。

1. 安装依赖

确保你已经安装了 pymunk 和 pygame:pip install pymunk pygame

2. 示例代码 test_pymunk_6e1b.py 

# -*- coding: utf-8 -*-
""" pymunk + pygame 模拟六边形内小球弹跳运动 """
import math
import pygame
import pymunk
import pymunk.pygame_util

# 初始化pygame
pygame.init()

# 屏幕参数
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("2D Hexagon Ball Simulation with Pymunk")

# 初始化pymunk
space = pymunk.Space()
space.gravity = (0, 500)  # 设置重力

# 绘制选项
draw_options = pymunk.pygame_util.DrawOptions(screen)

# 创建六边形的静态物体
def create_hexagon(center, radius, rotation_angle=0):
    num_sides = 6
    points = []
    for i in range(num_sides):
        angle = 2 * math.pi * i / num_sides + rotation_angle
        x = center[0] + radius * math.cos(angle)
        y = center[1] + radius * math.sin(angle)
        points.append((x, y))
    # 创建六边形的边
    segments = []
    for i in range(num_sides):
        p1 = points[i]
        p2 = points[(i + 1) % num_sides]
        segment = pymunk.Segment(space.static_body, p1, p2, 5)
        segment.elasticity = 0.8  # 反弹系数
        segment.friction = 0.5  # 摩擦力
        segments.append(segment)
    return segments

# 创建小球
def create_ball(space, position, radius, mass):
    moment = pymunk.moment_for_circle(mass, 0, radius)
    body = pymunk.Body(mass, moment)
    body.position = position
    shape = pymunk.Circle(body, radius)
    shape.elasticity = 0.8  # 反弹系数
    shape.friction = 0.5  # 摩擦力
    space.add(body, shape)
    return body

# 中心点和半径
hexagon_center = (width // 2, height // 2)
hexagon_radius = 200

# 初始六边形
rotation_angle = 0  # 初始旋转角度
hexagon_segments = create_hexagon(hexagon_center, hexagon_radius, rotation_angle)
for segment in hexagon_segments:
    space.add(segment)

# 创建小球
ball_radius = 20
ball_mass = 1
ball_position = (width // 2, height // 2 - hexagon_radius + ball_radius + 10)
ball_body = create_ball(space, ball_position, ball_radius, ball_mass)

# 主循环
clock = pygame.time.Clock()
running = True
rotation_speed = 0.01  # 旋转速度
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 清屏
    screen.fill((255, 255, 255))

    # 更新六边形的旋转角度
    rotation_angle += rotation_speed
    if rotation_angle >= 2 * math.pi:
        rotation_angle -= 2 * math.pi

    # 移除旧的六边形边
    for segment in hexagon_segments:
        space.remove(segment)

    # 创建新的六边形边
    hexagon_segments = create_hexagon(hexagon_center, hexagon_radius, rotation_angle)
    for segment in hexagon_segments:
        space.add(segment)

    # 更新物理引擎
    space.step(1 / 60.0)

    # 绘制物理空间
    space.debug_draw(draw_options)

    # 刷新屏幕
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

3.运行 python test_pymunk_6e1b.py 

运行脚本后,你会看到一个六边形和一个红色小球在六边形内弹跳。小球受重力影响,碰到六边形的边时会反弹。

4. 代码说明

  1. 初始化

    • 初始化 pygame 和 pymunk

    • 设置重力方向为向下((0, 500))。

  2. 创建六边形

    • 使用 pymunk.Segment 创建六边形的六条边。

    • 设置边的弹性(elasticity)和摩擦力(friction)。

  3. 创建小球

    • 使用 pymunk.Circle 创建一个圆形刚体。

    • 设置小球的弹性(elasticity)和摩擦力(friction)。

  4. 主循环

    • 每帧更新物理引擎(space.step)。

    • 使用 space.debug_draw 绘制物理空间的内容。

  5. 显示

    • 使用 pygame 显示六边形和小球的运动。

5. 自定义参数

你可以调整以下参数来改变模拟效果:

  • 重力:修改 space.gravity 的值。

  • 反弹系数:修改 elasticity 的值(范围为 0 到 1)。

  • 摩擦力:修改 friction 的值。

  • 小球质量:修改 ball_mass 的值。


6. 总结

  • 使用 pymunk 可以轻松实现 2D 物理模拟。

  • 结合 pygame 可以实现图形显示和交互。

  • 这个脚本是一个简单的示例,你可以根据需要扩展功能,例如添加更多小球或更复杂的形状。

 


pymunk + pygame 模拟八边形内小球弹跳运动
只需修改一行 num_sides = 8 ,另存为:test_pymunk_8e1b.py
运行 python test_pymunk_8e1b.py


http://www.kler.cn/a/577109.html

相关文章:

  • Node.js中HTTPS模块应用详解
  • [补]数电笔记——逻辑代数基础
  • HarmonyOS 应用程序包结构 (发布态)
  • 【Spring Boot 应用开发】-05 命令行参数
  • Python使用入门(一)
  • 网络编程介绍
  • Vue 3 组件库测试驱动开发 (TDD):Jest + Vue Test Utils 单元测试实战 - 保障组件质量与长期维护性
  • Redis在人员管理系统中的应用示例
  • 【每日八股】计算机网络篇(四):HTTP
  • 大白话react第十七章React 与 WebGL 项目进阶优化及拓展
  • GStreamer —— 2.13、Windows下Qt加载GStreamer库后运行 - “教程13:播放控制“(附:完整源码)
  • BUUCTF——[GYCTF2020]FlaskApp1 SSTI模板注入/PIN学习
  • 无人机避障——XTDrone中运行VINS-Fusion+Ego-planner进行路径规划
  • 构建功能齐全的JavaScript计算器:从基础到高级功能的全面实现
  • 深入解析 BitBake 日志机制:任务调度、日志记录与调试方法
  • UE5中UBlueprintFunctionLibrary类详解
  • MySQL表空间碎片原理和解决方案
  • Ubuntu-docker安装mysql
  • 语言模型作为零样本规划者:提取可执行知识以供具身代理使用
  • 在Linux系统上集成OpenSlide与SpringBoot