作者: Physics Chidc
版本: 0.1-pre
一个用Python实现的超真实3D物理引擎,包含刚体动力学、分子动力学模拟、碰撞检测和3D可视化。
- 刚体动力学:完整的刚体运动模拟,支持质量、惯性张量、摩擦、恢复系数
- 碰撞检测:支持球体、长方体、胶囊体等基本形状,使用GJK/SAT算法
- 碰撞响应:基于冲量的碰撞解析,支持摩擦和恢复系数
- 分子动力学:原子级模拟,支持多种力场(Lennard-Jones、Coulomb等)
- 3D可视化:基于OpenGL的实时渲染,支持相机控制、光照、材质
- 数学库:自定义的Vector3、Matrix3、Quaternion类,避免万向节锁
- 物理系统:模块化设计,支持多种积分器(Euler、Velocity Verlet)
- 碰撞系统:宽相位(AABB)和窄相位(GJK/EPA)分离
- 分子模拟:支持NVE、NVT、NPT系综,周期性边界条件
- 渲染系统:实时OpenGL渲染,支持网格、材质、光照
- 宏观尺度:刚体碰撞、堆叠、关节约束
- 微观尺度:分子运动、化学键、非键相互作用
- 多尺度:支持宏观和微观的联合模拟
- Python 3.8+
- Windows/Linux/macOS
- OpenGL兼容的显卡
- 克隆仓库:
git clone <repository-url>
cd PhysicsEngine- 安装依赖:
pip install -r requirements.txt- 安装引擎(开发模式):
pip install -e .cd examples
python demo_physics.pyfrom core.math import Vector3
from core.physics.rigid_body import RigidBody
from core.collision.collision_shape import SphereShape
# 创建刚体
body = RigidBody(
mass=1.0,
position=Vector3(0, 5, 0),
linear_velocity=Vector3(0, 0, 0)
)
# 添加碰撞形状
body.collision_shape = SphereShape(radius=0.5, position=body.position)
# 创建物理世界
from core.collision.collision_response import PhysicsWorld
world = PhysicsWorld()
# 添加刚体
world.add_rigid_body(body)
# 模拟
for _ in range(100):
world.step(0.016) # 60 FPSfrom molecular.molecule import Atom, AtomType, Molecule
from molecular.force_field import MolecularSimulator, ForceField, ForceFieldType
# 创建水分子
water = Molecule("Water")
oxygen = Atom(AtomType.OXYGEN, position=Vector3(0, 0, 0))
hydrogen1 = Atom(AtomType.HYDROGEN, position=Vector3(0.96e-10, 0, 0))
hydrogen2 = Atom(AtomType.HYDROGEN, position=Vector3(-0.96e-10, 0, 0))
water.add_atom(oxygen)
water.add_atom(hydrogen1)
water.add_atom(hydrogen2)
# 创建模拟器
simulator = MolecularSimulator(
force_field=ForceField(ForceFieldType.LENNARD_JONES),
temperature=300.0,
timestep=1e-15
)
# 添加分子
simulator.add_molecule(water)
# 运行模拟
simulator.step(1000)PhysicsEngine/
├── core/ # 核心引擎
│ ├── math/ # 数学库(向量、矩阵、四元数)
│ ├── physics/ # 物理系统(刚体动力学)
│ ├── collision/ # 碰撞系统(检测与响应)
│ └── constraints/ # 约束系统(待实现)
├── molecular/ # 分子动力学
│ ├── molecule.py # 分子和原子类
│ ├── force_field.py # 力场和模拟器
│ └── predefined_molecules.py # 预定义分子
├── rendering/ # 3D渲染
│ └── opengl_renderer.py # OpenGL渲染器
├── utils/ # 工具函数
├── examples/ # 示例程序
│ └── demo_physics.py # 主演示程序
├── tests/ # 测试
│ └── test_math.py # 数学库测试
├── setup.py # 安装脚本
├── requirements.txt # 依赖列表
└── README.md # 本文档
Vector3(x, y, z):3D向量Matrix3():3x3矩阵Quaternion(w, x, y, z):四元数MathUtils:数学工具函数
RigidBody(mass, position, ...):刚体类PhysicsWorld():物理世界管理器RigidBodySystem():刚体系统(简化版)
CollisionShape:碰撞形状基类SphereShape(radius):球体BoxShape(half_extents):长方体CapsuleShape(radius, height):胶囊体CollisionDetector():碰撞检测器CollisionResolver():碰撞解析器
Atom(atom_type, position, ...):原子Molecule(name):分子Bond(atom1, atom2, ...):化学键ForceField(force_field_type):力场MolecularSimulator():分子模拟器
OpenGLRenderer(width, height):OpenGL渲染器PhysicsVisualizer(renderer):物理可视化器Mesh(vertices, indices):网格数据
# 创建地面
ground = RigidBody(mass=0, position=Vector3(0, -2, 0))
ground.collision_shape = BoxShape(half_extents=Vector3(5, 0.5, 5))
# 创建堆叠的立方体
for i in range(5):
box = RigidBody(mass=1.0, position=Vector3(0, i * 1.0, 0))
box.collision_shape = BoxShape(half_extents=Vector3(0.5, 0.5, 0.5))
world.add_rigid_body(box)# 创建水分子系统
builder = MolecularSystemBuilder()
builder.create_solution(
solvent_type="water",
solute_type="nacl",
solvent_count=100,
solute_count=10,
box_size=Vector3(3e-9, 3e-9, 3e-9)
)
# 创建模拟器
simulator = MolecularSimulator(temperature=300.0)
for molecule in builder.molecules:
simulator.add_molecule(molecule)
# 运行模拟
simulator.step(10000)# 创建渲染器
renderer = OpenGLRenderer(1280, 720)
# 绘制球体
renderer.draw_sphere(Vector3(0, 0, 0), 1.0, (1, 0, 0))
# 绘制立方体
renderer.draw_cube(Vector3(3, 0, 0), Vector3(1, 1, 1), (0, 1, 0))
# 绘制坐标轴
renderer.draw_axes(length=2.0)- 使用睡眠机制减少计算量
- AABB宽相位碰撞检测
- 接触持久化和热启动
- Verlet邻居列表优化
- 截断势能和切换函数
- 周期性边界条件
- 顶点缓冲对象(VBO)
- 显示列表缓存
- 细节层次(LOD)支持
- 继承
CollisionShape基类 - 实现
get_support_point()和compute_aabb()方法 - 在
CollisionDetector中添加检测逻辑
- 创建新的
ForceField子类 - 实现
calculate_pair_energy()和calculate_pair_force()方法 - 在
MolecularSimulator中集成
- 扩展
OpenGLRenderer类 - 实现新的着色器程序
- 添加材质和纹理支持
运行测试套件:
cd tests
python test_math.py测试覆盖:
- 数学库(向量、矩阵、四元数)
- 刚体运动学
- 碰撞检测
- 分子力场
- 实现关节约束(铰链、滑块、球窝)
- 添加软体物理模拟
- 实现流体动力学(SPH方法)
- 添加更多分子力场(CHARMM、AMBER)
- 优化渲染性能(实例化渲染)
- GPU加速计算(CUDA/OpenCL)
- 多线程并行模拟
- 网络多人物理
- VR/AR支持
- 机器学习增强
- Fork仓库
- 创建特性分支
- 提交更改
- 推送到分支
- 创建Pull Request
- 遵循PEP 8编码规范
- 添加类型注解
- 编写单元测试
- 更新文档
MIT License
- 感谢所有开源物理引擎的启发
- 特别感谢分子动力学社区的开源工具
- 感谢OpenGL和Pygame社区
如有问题或建议,请通过以下方式联系:
- 提交Issue
- 创建Pull Request
- 发送邮件
开始构建你的物理世界吧! 🚀