一个基于 OpenGL 3.3 的简易2D图形化物理引擎
这是一个简单的物理引擎,采用 C++ 编写,图形显示部分基于 OpenGL 3.3,使用核心模式,即非固定管线模式。该物理引擎可以模拟简单的凸多边形刚体的运动,并且可以调节许多参数,如重力加速度、弹性碰撞系数、某个物体的大小、质量与静摩擦系数。可用于制作简单的 2D 小游戏,如模仿一个愤怒的小鸟或是特技摩托,也可以用于低年级物理教育辅助软件,或者只是用来实现自己好玩的玩法,如利用遗传算法让蛇学会爬行等。
演示场景
按下 F1 至 F6 可加载 6 种不同的经典场景,如:
金字塔场景,你可以按鼠标中键删除或者左键移动某一块砖块,实现抽积木的效果,或者制造另外一个大质量的砖块来撞击它,并观察效果
或者是模仿一个愤怒的小鸟的场景,用鼠标右键给左边的砖块施加一个冲击,让它撞向右边的房子
功能
- 创建不同种类、不同大小、不同质量的的凸多边形刚体
- 拖动某一个物体或者对其施加冲击
- 设置世界属性,比如重力加速度以及弹性碰撞系数
- 改变某一个物体的属性,如质量以及静摩擦系数
- 开启或关闭显示文字提示与碰撞点的图形界面
- 暂停或恢复世界的时间运行
(The World!)
用法
(程序内右上角可见所有的操作说明)
- 按F1-F6加载实例Demo,按R重置清空世界的内容;
- 按1-5选择鼠标左键的功能,有拖动物体以及放置三角形、长方形、三角形墙和长方形墙;
- 按WASD移动摄像机位置,同时按Shift加速移动,按Ctrl减速移动;
- 鼠标左键执行各种功能,如拖动物体、放置物体,鼠标右键拖动给选择的物体施加力;
- 鼠标中键删除选择的物体,滚动鼠标中键进行摄像机的缩放;
- 按E锁定某一个物体,按Q取消当前选择的物体;
- 按空格暂停时间;
- 按+ -修改重力,按[ ]修改弹性碰撞系数,按↑ ↓修改选择物体的质量,按← →修改选择物体的静摩擦系数;
- 按Tab开启或关闭用户界面。
安装
本项目只在 Microsoft Windows 10 平台上构建并测试通过
可直接执行的 exe 文件:
点此下载
项目源码地址:
Github地址
对于源码,直接下载编辑就完事了
其他
- 以下随便谈谈,只是个人感想,建议跳过
Heracles,即古希腊神话中的大力神海格力斯,或者赫拉克勒斯(Ηρακλής),作为一个模拟力与运动的物理引擎,取这个名字个人感觉毫无违和感,顺便这是这次项目的 Logo,感觉没啥地方合适放就放这里好了:
其实整个项目的图形部分走的都是类似这个 Logo 所示的黑白极简风格,自我感觉效果还行,不至于看不过去(
本文内容主要来自于本项目 Github 上的 README.md 文档和上一篇文章,因为懒得修改太多内容直接就扔上来了(
这次这个项目主要目的是熟悉新版的 OpenGL 的,即核心模式下的 OpenGL,虽然没有固定管线的立即模式那么方便直观,甚至有一点抽象与不便,不过对于性能来说是有利无弊的(虽然这个项目的 Shader 写的过于简单了,体现不出什么性能问题)。
这次的项目除了 GLAD 与 GLFW 以及用于 TrueType 字体显示的 freetype 库之外,没有引用其他第三方库,作为所有计算最基础的二维向量和 2×2 矩阵的数据结构都是自己实现的,结果反而导致坐标变换与旋转这块传给着色器的值有点麻烦,以后用 OpenGL 3+ 写东西的话还是不重复造轮子了,尽可能用通用的库吧,会方便许多。
此外,这次项目借鉴学习了许多其他优秀项目的代码,如 AABB 方法、SAT 方法、射线法等,这些都写在下面的参考资料里了,代码里也尽量都写了注释,虽然过一段时间之后自己肯定还是会看不懂自己写了啥吧(
同时,作为一个物理引擎,这个项目其实还很不完善,主要缺陷有:
- 只能模拟凸多边形刚体,没有非刚体以及凹多边形以及圆的模拟
- 碰撞算法存在问题,导致整体物理效果偏“软”,且完全弹性碰撞没法实现
- 性能问题,没有使用四叉树等高级的数据结构来存储物体顶点位置信息,每一帧碰撞检测时都是对于某个物体,遍历所有其他物体来确定是否相撞并计算碰撞结果,导致物体变多时,性能显著下降
- 整体优化不佳,或者说没有什么优化,程序启动之后什么也不干也会占用我 20% 多的 GPU 利用率;放置物体之后删除,实际内存并没有释放,导致内存占用只会越来越多
这些问题以后有空再解决吧,作为一个课程作业就暂时先这样了(
Comments | NOTHING