一个使用C#编写的2D质体物理引擎,项目包含了
- 质体物理引擎
- 单元测试
- 基于WPF绘制的简单Demo合集
该项目是一个实验项目(Toy Project),用于实践我所学习到的关于框架设计、语言特性等知识,因此该项目不具备工业项目的稳定性及性能(说到性能,其实用C#做这样的项目似乎就不算太合适),但是制作一些基于WPF的小型游戏应该还是可以做到的。为了简化系统自身,并且基于项目的实现目的,该引擎并暂时没有考虑实现刚体物理模型,但是各个模块的设计为实现刚体物理模型提供了可能性和便利性,也就是说你可以很容易的将刚体物理模型加入到本引擎当中。
该项目力求追随工程项目的最佳实践,希望能够从设计、重构、文档、测试方面都能够较为完备。目前大部分代码都包含详实(但不啰嗦)的注释,大部分方法和属性都标注了文档注释,可以使用Doxygen等第三方软件生成可读的API文档。物理引擎类库部分的所有代码都被被单元测试覆盖,但遗憾的是,单元测试的代码覆盖率并不能证明程序执行的正确性,所以测试用例还需在后续的开发过程中不断地补充完善。
- 质体(粒子)
- 可以定制的质体作用力发生器
- 可以定制的区域作用力
- 质体碰撞处理
- 质体连杆、绳索
- 摩擦力
- 液体模拟
- 沙盒模拟器
基本使用
// 创建一个物理世界
var world = new World();
// 在物理世界里创建一个质体(粒子)
// 位置 (0, 0) 初速度 (1, 0) 质量 1 kg 碰撞恢复系数0.9
world.CreateParticle(Vector2D.Zero, new Vector2D(1, 0), 1, 0.9);
// 创建一个全局有效的重力场
world.CreateGravity(9.8);
// 执行 1/60 s
world.Update(1/60.0);
添加碰撞
// 创建一条长5m深4m的底边
var edge = world.CreateEdge(0, 4, 5, 4);
// 将质点视为可与底边接触的球(圆),半径为0.2m
particle.BindSharp(new Circle(0.2));
// 执行 1/60 s
world.Update(1/60.0);
目前该项目的Demo图形依赖于WriteableBitmapEx(通过nuget引入到项目),限于GDI+的性能问题,也希望能够尝试使用SharpDX或Win2D这样的由DirectX驱动的图形库,为此我创建了两个分支:
-
SharpDXonWPF 在WPFDemo项目中增加了基于SharpDX中Direct2D的Image扩展,使用Direct2D作为渲染驱动。该尝试仍处于试验状态。
-
UWPDemo 由于Win2D仅支持UWP等沙盒内应用,所以增加了UWPDemo项目,由于将Physics2D项目更改为了PCL类型,所以Physics2D可以同时支持WPF以及UWP应用。还未正式启动该项尝试。
如果你喜欢相关的技术,欢迎为相关的分支贡献代码。
由于图片比较大,加载完毕可能需要一定时间
- 烟花
- 圆周运动
- 弹性材料
- 变形球
- 牛顿摆
- 多边形连杆(模拟刚体)