/clib2d

简单的2D物理引擎(CMake,OpenGL)

Primary LanguageC++GNU General Public License v2.0GPL-2.0

clib2d(C++ 2D物理引擎)

apollonia的基础上,结合先前的C# 2D物理引擎,从零开始打造一个简单的2D物理引擎。

目前已经完成基本功能,目前正整合cliblisp

整合cliblisp进度:

  1. 按键盘数字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++

目录(暂定):

  1. 【c1p1】使用OpenGL搭建基本框架
  2. 【c1p2】工厂模式,渲染第一个polygon body矩形物体
  3. 【c1p3】时钟同步,给物体添加重力gravity
  4. 【c1p2】绘制物体的受力force及速度向量velocity
  5. 【c1p2】给物体添加旋转rotate
  6. 【c1p3】求几何凸多边形的centroid重心和inertia转动惯量(刚体的数据结构)
  7. 【c1p3】给物体添加线冲量和角冲量
  8. 【c2p1】collision detection 碰撞检测
    1. 【c2p1】AABB方法(仅限矩形)及SAT方法(仅限凸包)
    2. 【c2p2】计算压力作用点(仅限两个以下)位置(及绘制),多边形裁剪
    3. 【c2p3】计算压力方向
    4. 【c2p3】实现摩擦力friction
    5. 【c2p3】设置弹性碰撞系数bias
    6. 【c2p3】碰撞检测的动态更新vector
    7. 【c2p3】休眠状态的实现
  9. 【c3p1】joint 关节(铰链)的实现
    1. 【c3p1】关节的数据结构
    2. 【c3p1】关节的受力分析
  10. 实现几种基本场景(分别按键盘上的数字1-7)
    1. 【c2p3】三角形
    2. 【c2p3】金字塔
    3. 【c2p3】方块堆叠
    4. 【c3p1】牛顿摆(可测试完全弹性碰撞)
    5. 【c3p1】铰链(测试关节joint结构)
    6. 【c4p2】圆与多边形金字塔(测试圆的碰撞)
    7. 【c5p2】测试cliblisp控制接口
  11. 实现其他特性
    1. 【c4p1】添加圆物体
    2. 【c4p2】碰撞检测(多边形与圆)
    3. 【c4p2】碰撞检测(圆与圆)
  12. 算法测试(有空做)
    1. 遗传算法
    2. 神经网络
    3. 流体力学
  13. 整合cliblisp胶水语言
    1. 【c5p1】整合代码
    2. 【c5p2】编码添加物体
    3. 控制台添加物体

改进

想到的如下优化:

  1. 物体休眠,优化碰撞检测
  2. 修正碰撞点,添加弹力碰撞系数

改进了一些问题:

  • 拖动窗口导致的问题
  • 标题位置随分辨率不一致的问题

目前遇到的问题:

  • 碰撞机制存在问题
  • 圆与多边形的碰撞检测存在问题
  • 圆粘住边界的问题圆无法弹跳牛顿摆的问题
  • 圆的摩擦力问题

文章

物理引擎系列:

LISP系列:

截图

joint

参考

  1. apollonia
  2. matter.js
  3. PhysicsEngine
  4. OpenGL
  5. GLUT
  6. Box2D
  7. Chipmunk2D
  8. cliblisp