Skip to content

Lianues/PhysiSim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 

Repository files navigation

PhysiSim (物理场景模拟器)

项目简介

PhysiSim 是一个基于组件的二维物理模拟器,旨在为用户提供一个直观、易用的平台,用于学习、实验和探索各种物理现象。它允许用户通过图形化界面构建复杂的物理场景,观察物体的运动、碰撞和相互作用,并进行简单的受力分析和脚本化控制。

当前状态

项目已成功完成 里程碑 A 的开发。主要成果包括:

  • 搭建了稳定的实体组件系统 (ECS) 架构。
  • 实现了核心物理引擎,包括精确的碰撞检测 (SAT) 与响应、多种连接器(弹簧、理想杆、理想绳、转轴)以及接触力模拟。
  • 开发了功能丰富的高级GUI,支持场景构建、属性编辑、视图控制和模拟控制。
  • 引入了受力分析可视化工具。
  • 实现了场景的加载、保存以及对象预设系统。
  • 物理引擎核心已迁移到基于约束动力学的 ConstraintSolverSystem (physi_sim/physics/constraint_solver_system.py:1),用于处理杆、绳和转轴等约束。

核心特性列表

  • 图形化场景构建:
    • 支持创建和编辑多种几何形状:矩形、圆形、自定义多边形。
    • 直观的拖拽操作用于放置和调整物体。
  • 实体组件系统 (ECS) 架构:
  • 物理模拟引擎:
    • 动力学: 精确模拟物体的平动和旋转运动。
    • 碰撞检测与响应:
      • 采用分离轴定理 (SAT) 进行精确的多边形间碰撞检测。
      • 支持圆形与圆形、圆形与多边形、多边形与多边形的碰撞对。
      • 基于冲量的碰撞响应模型。
    • 接触力: 模拟支持力和摩擦力(静摩擦和动摩擦)。
    • 连接器:
  • 高级GUI工具与交互:
    • 属性面板: 实时查看和编辑选中实体的组件属性。
    • 选择工具: 支持单击选择、拖拽多选、框选、按类型选择物体。
    • 视图控制: 支持场景视图的平移和缩放。
    • 模拟时间控制: 控制模拟的开始、暂停、继续和重置。
    • 受力分析可视化:
      • 在“对象模式”下显示作用在单个物体上的合力与分力。
      • 在“质心模式”下显示作用在物体质心上的合力。
  • 场景管理:
    • 支持新建、加载和保存场景 (使用JSON格式)。
    • 预设系统: 支持将单个实体或组合对象保存为预设,方便复用。
  • 基础脚本求解:

技术栈

  • 核心语言: Python 3.x
  • 图形用户界面 (GUI): PySide6
  • 数值计算: NumPy (广泛用于向量运算、物理计算等)
  • 符号计算: SymPy (用于 SolverModule)

项目结构概览

physi_sim/
├── main.py                 # 程序主入口
├── core/                   # 核心ECS架构、向量、组件基类、系统基类等
│   ├── entity_manager.py   # 实体和组件管理器
│   ├── component.py        # 各类组件定义
│   ├── system.py           # 系统基类
│   └── vector.py           # 二维向量类
├── physics/                # 物理引擎相关模块
│   ├── physics_system.py       # 基础动力学更新
│   ├── collision_system.py     # 碰撞检测与响应
│   ├── constraint_solver_system.py # 基于约束的动力学求解系统 (杆、绳、转轴等)
│   ├── constraint_solver.py    # 约束求解器实现
│   ├── force_calculator.py     # 力计算 (如重力、弹簧力等)
│   └── solver_module.py        # 基于SymPy的符号求解模块
├── graphics/               # 图形渲染与GUI交互
│   ├── renderer_system.py    # 场景渲染系统
│   ├── main_window.py        # 主应用程序窗口
│   ├── property_panel.py     # 属性编辑面板
│   └── drawing_tools/        # 各种绘图工具的处理器
├── scene/                  # 场景管理与序列化
│   ├── scene_manager.py      # 场景加载、保存、预设管理
│   └── scene_serializer.py   # 场景JSON序列化/反序列化
├── scripting/              # 用户脚本与事件处理 (里程碑B重点)
│   └── script_engine.py      # 脚本执行引擎 (初步)
└── assets/                 # 资源文件 (如预设)

如何运行 (初步)

  1. 确保环境:
    • 已安装 Python (建议 3.8 或更高版本)。
    • 已安装必要的第三方库。可以通过 pip 安装:
      pip install PySide6 numpy sympy
  2. 运行程序: 在项目根目录下,执行以下命令启动模拟器:
    python physi_sim/main.py

后续计划 (简述)

  • 里程碑 B:用户事件规则系统:
    • 设计并实现一个灵活的用户事件规则系统,允许用户通过 "IF-THEN" 结构定义场景中物体的行为逻辑,例如: "IF 物体A 接触 物体B THEN 物体A 改变颜色"。
    • 完善 scripting/ (physi_sim/scripting/) 模块,提供更强大的脚本API。
  • 持续改进:
    • 性能优化: 针对大规模场景进行性能分析和优化。
    • 高级碰撞处理: 研究并实现更复杂的碰撞现象,如堆叠、连续碰撞检测 (CCD)。
    • 更多物理模型: 引入流体、软体等更高级的物理模型。
    • 用户体验增强: 持续打磨GUI,提升易用性和美观度。
    • 文档完善: 提供更详细的API文档和用户手册。

贡献指南

(暂无,未来如果项目发展需要,会在此处添加贡献指南。)

致谢

(暂无,未来如果项目发展需要,会在此处添加致谢信息。)

About

简单物理模拟与求解

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages