clib2d(C++ 2D物理引擎)
已整合Qt:Qlib2d
在apollonia的基础上,结合先前的C# 2D物理引擎,从零开始打造一个简单的2D物理引擎。
目前已经完成基本功能,目前正整合cliblisp。
整合cliblisp进度:
- 按键盘数字7自动运行情景一脚本:
box #(pos 0.5d 0.5d) #(size 0.4d 0.5d) #(mass 1d)
创建一个矩形物体(#号替换为反引号)
介绍
先前所做C#版本的PhysicsEngine代码翻译自JS物理引擎matter.js。
本次借鉴OpenGL工程apollonia,两者取长补短。
代码为CMake跨平台,需要使用库:
- freeglut
- opengl32
- glu32
glm(已移除)
Win7上使用CLion+MinGW编译没有问题,Linux、MacOS系统下暂未尝试,64位系统需要“-m32”编译。
先前立下雄心壮志制作简单的2D物理引擎(零),如今在一点点实现中~
使用
- 键盘数字1到7:切换经典场景
- WASD:给所有物体分别添加四个方向的力
- QE:给所有物体添加旋转
- G:切换重力
- 空格/鼠标离开:暂停
计划
进度与注释:
- 第一部分已完成
- 第二部分已完成
- 第三部分已完成,单文件共1537行代码
- 第四部分已完成,实现圆与多边形的碰撞,单文件共2069行代码
- 第五部分进行中,用cliblisp作控制台语言,拆分代码,不再是单文件,长期更新
分阶段最小化原则添加代码,功能由简到繁。前期的代码99%引自apollonia(为第一时间可以运行),后面会从头开始写。
文章发表在知乎专栏:学习C++。
目录(暂定):
- 【c1p1】使用OpenGL搭建基本框架
- 【c1p2】工厂模式,渲染第一个polygon body矩形物体
- 【c1p3】时钟同步,给物体添加重力gravity
- 【c1p2】绘制物体的受力force及速度向量velocity
- 【c1p2】给物体添加旋转rotate
- 【c1p3】求几何凸多边形的centroid重心和inertia转动惯量(刚体的数据结构)
- 【c1p3】给物体添加线冲量和角冲量
- 【c2p1】collision detection 碰撞检测
- 【c2p1】AABB方法(仅限矩形)及SAT方法(仅限凸包)
- 【c2p2】计算压力作用点(仅限两个以下)位置(及绘制),多边形裁剪
- 【c2p3】计算压力方向
- 【c2p3】实现摩擦力friction
- 【c2p3】设置弹性碰撞系数bias
- 【c2p3】碰撞检测的动态更新vector
- 【c2p3】休眠状态的实现
- 【c3p1】joint 关节(铰链)的实现
- 【c3p1】关节的数据结构
- 【c3p1】关节的受力分析
- 实现几种基本场景(分别按键盘上的数字1-7)
- 【c2p3】三角形
- 【c2p3】金字塔
- 【c2p3】方块堆叠
- 【c3p1】牛顿摆(可测试完全弹性碰撞)
- 【c3p1】铰链(测试关节joint结构)
- 【c4p2】圆与多边形金字塔(测试圆的碰撞)
- 【c5p2】测试cliblisp控制接口
- 实现其他特性
- 【c4p1】添加圆物体
- 【c4p2】碰撞检测(多边形与圆)
- 【c4p2】碰撞检测(圆与圆)
- 算法测试(有空做)
- 遗传算法
- 神经网络
- 流体力学
- 整合cliblisp胶水语言
- 【c5p1】整合代码
- 【c5p2】编码添加物体
- 控制台添加物体
改进
想到的如下优化:
- 物体休眠,优化碰撞检测
- 修正碰撞点,添加弹力碰撞系数
改进了一些问题:
-
拖动窗口导致的问题 -
标题位置随分辨率不一致的问题 - 将圆的碰撞实现转化为多边形的实现,解决碰撞问题
目前遇到的问题:
-
碰撞机制存在问题 -
圆与多边形的碰撞检测存在问题 -
圆粘住边界的问题,圆无法弹跳,牛顿摆的问题 -
圆的摩擦力问题
文章
物理引擎系列:
LISP系列: