一个基于 OpenGL 3.3 的简易2D图形化物理引擎

是一个简单的物理引擎,采用 C++ 编写,图形显示部分基于 OpenGL 3.3,使用核心模式,即非固定管线模式。该物理引擎可以模拟简单的凸多边形刚体的运动,并且可以调节许多参数,如重力加速度、弹性碰撞系数、某个物体的大小、质量与静摩擦系数。可用于制作简单的 2D 小游戏,如模仿一个愤怒的小鸟或是特技摩托,也可以用于低年级物理教育辅助软件,或者只是用来实现自己好玩的玩法,如利用遗传算法让蛇学会爬行等。

演示场景

按下 F1 至 F6 可加载 6 种不同的经典场景,如:

金字塔场景,你可以按鼠标中键删除或者左键移动某一块砖块,实现抽积木的效果,或者制造另外一个大质量的砖块来撞击它,并观察效果

Demo1

或者是模仿一个愤怒的小鸟的场景,用鼠标右键给左边的砖块施加一个冲击,让它撞向右边的房子

Demo4

功能

  • 创建不同种类、不同大小、不同质量的的凸多边形刚体
  • 拖动某一个物体或者对其施加冲击
  • 设置世界属性,比如重力加速度以及弹性碰撞系数
  • 改变某一个物体的属性,如质量以及静摩擦系数
  • 开启或关闭显示文字提示与碰撞点的图形界面
  • 暂停或恢复世界的时间运行(The World!)

用法

(程序内右上角可见所有的操作说明)

  1. 按F1-F6加载实例Demo,按R重置清空世界的内容;
  2. 按1-5选择鼠标左键的功能,有拖动物体以及放置三角形、长方形、三角形墙和长方形墙;
  3. 按WASD移动摄像机位置,同时按Shift加速移动,按Ctrl减速移动;
  4. 鼠标左键执行各种功能,如拖动物体、放置物体,鼠标右键拖动给选择的物体施加力;
  5. 鼠标中键删除选择的物体,滚动鼠标中键进行摄像机的缩放;
  6. 按E锁定某一个物体,按Q取消当前选择的物体;
  7. 按空格暂停时间;
  8. 按+ -修改重力,按[ ]修改弹性碰撞系数,按↑ ↓修改选择物体的质量,按← →修改选择物体的静摩擦系数;
  9. 按Tab开启或关闭用户界面。

安装

本项目只在 Microsoft Windows 10 平台上构建并测试通过

可直接执行的 exe 文件:
点此下载

项目源码地址:
Github地址

对于源码,直接下载编辑就完事了

其他

  • 以下随便谈谈,只是个人感想,建议跳过

Heracles,即古希腊神话中的大力神海格力斯,或者赫拉克勒斯(Ηρακλής),作为一个模拟力与运动的物理引擎,取这个名字个人感觉毫无违和感,顺便这是这次项目的 Logo,感觉没啥地方合适放就放这里好了:

Alt

其实整个项目的图形部分走的都是类似这个 Logo 所示的黑白极简风格,自我感觉效果还行,不至于看不过去(

本文内容主要来自于本项目 Github 上的 README.md 文档和上一篇文章,因为懒得修改太多内容直接就扔上来了(

这次这个项目主要目的是熟悉新版的 OpenGL 的,即核心模式下的 OpenGL,虽然没有固定管线的立即模式那么方便直观,甚至有一点抽象与不便,不过对于性能来说是有利无弊的(虽然这个项目的 Shader 写的过于简单了,体现不出什么性能问题)。

这次的项目除了 GLAD 与 GLFW 以及用于 TrueType 字体显示的 freetype 库之外,没有引用其他第三方库,作为所有计算最基础的二维向量和 2×2 矩阵的数据结构都是自己实现的,结果反而导致坐标变换与旋转这块传给着色器的值有点麻烦,以后用 OpenGL 3+ 写东西的话还是不重复造轮子了,尽可能用通用的库吧,会方便许多。

此外,这次项目借鉴学习了许多其他优秀项目的代码,如 AABB 方法、SAT 方法、射线法等,这些都写在下面的参考资料里了,代码里也尽量都写了注释,虽然过一段时间之后自己肯定还是会看不懂自己写了啥吧(

同时,作为一个物理引擎,这个项目其实还很不完善,主要缺陷有:

  1. 只能模拟凸多边形刚体,没有非刚体以及凹多边形以及圆的模拟
  2. 碰撞算法存在问题,导致整体物理效果偏“软”,且完全弹性碰撞没法实现
  3. 性能问题,没有使用四叉树等高级的数据结构来存储物体顶点位置信息,每一帧碰撞检测时都是对于某个物体,遍历所有其他物体来确定是否相撞并计算碰撞结果,导致物体变多时,性能显著下降
  4. 整体优化不佳,或者说没有什么优化,程序启动之后什么也不干也会占用我 20% 多的 GPU 利用率;放置物体之后删除,实际内存并没有释放,导致内存占用只会越来越多

这些问题以后有空再解决吧,作为一个课程作业就暂时先这样了(

参考资料