一个可运行的最小2D物理引擎需实现离散时间步进、AABB/圆碰撞检测与冲量响应三部分:用欧拉积分更新刚体位置速度,通过投影重叠或距离判断碰撞,再沿法线施加冲量修正速度。

用 C++ 实现一个“简单”的 2D 物理引擎,不等于从零造 Box2D,而是理解其核心思想后,动手写一个可运行、可调试、能处理刚体运动与碰撞的最小可行系统。Box2D 是工业级实现,而学习它的原理,关键在于抓住 离散时间步进 + 碰撞检测 + 冲量求解 这三个支柱。
刚体运动:用欧拉积分模拟位置和速度
最简物理对象是质点或轴对称刚体(忽略旋转惯量),只跟踪 position、velocity、acceleration(如重力)。
- 每帧按固定时间步 dt(例如 1/60.0 秒)更新:
- velocity += acceleration * dt
- position += velocity * dt
- 加速度可设为 Vec2(0, -9.8f) 模拟向下重力
- 注意:朴素欧拉法有能量漂移,但教学/原型足够;后续可升级为半隐式欧拉(先更新 velocity,再用新 velocity 更新 position)
碰撞检测:AABB 与分离轴定理(SAT)入门
矩形(AABB)之间检测最轻量;圆与 AABB 或圆与圆则更直观,适合起步。
- AABB-AABB:检查 x 和 y 方向投影是否重叠 —— 若任一方向无重叠,则无碰撞
- 圆-圆:计算两圆心距离,小于半径和即发生碰撞
- 圆-AABB:找圆心到矩形的最近点(clamp 坐标),再算该点到圆心距离 ≤ 半径
- 暂不处理连续碰撞(tunneling),靠减小 dt 或使用扫掠检测(sweep test)缓解
碰撞响应:用冲量(Impulse)修正速度
检测到碰撞后,不直接“移动物体”,而是计算一个瞬时冲量 J,改变双方速度 —— 这是物理真实感的关键。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~