Skip to content

A physics engine written in C# include WPF Demo & Unit Test. 一个使用C#编写的2D物理引擎。

Notifications You must be signed in to change notification settings

Blueve/Physics2D

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Physics2D

一个使用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应用。还未正式启动该项尝试。

如果你喜欢相关的技术,欢迎为相关的分支贡献代码。

演示动画

由于图片比较大,加载完毕可能需要一定时间

  • 烟花

  • 圆周运动

  • 弹性材料

  • 变形球

  • 牛顿摆

  • 多边形连杆(模拟刚体)

About

A physics engine written in C# include WPF Demo & Unit Test. 一个使用C#编写的2D物理引擎。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages