This is a 2D rigid body physics engine written in C++ for game development, featuring collision detection, constraint solving, and advanced capabilities like explosions and object slicing.
Tech Stack
- Core: C++ with minimal dependencies
- Rendering: OpenGL 3.3+, GLAD, GLFW
- UI: Dear ImGui
- Serialization: Cereal, RapidJSON
- Build: Visual Studio 2019+ (MSVC)
- Testing: CppUnitTestFramework
Project Structure
Rebuild of cphysics/ ├── include/CPhysics/ # Core physics headers (20 files) ├── src/ # Physics implementation (~1,562 LOC) ├── testbed/ # OpenGL visualization + demos │ ├── Tests/ # 15 physics demonstration scenarios │ └── imgui/ # Dear ImGui integration ├── dependencies/ # Third-party libraries └── UnitTests/ # Unit test suite
Core Components
Physics Engine:
- World.h/cpp - Main simulation container, time-stepping, gravity
- Body.h/cpp - Rigid bodies with mass, velocity, forces, torque
- Shape.h - Abstract base (Circle, Polygon implementations)
- Arbiter.h/cpp - Collision detection and contact resolution
- Joint.h - Constraint system (body-to-body, body-to-point springs)
Collision System:
- Broadphase: AABB overlap testing
- Narrowphase: Circle-circle, circle-polygon, polygon-polygon
- Sequential Impulses solver with friction and restitution
- Contact manifolds (up to 2 contact points)
Advanced Features:
- Slice.h - Cut objects along arbitrary lines
- ParticleExplosion.h, ProximityExplosion.h, RaycastExplosion.h - 3 explosion types
- Shadowcast.h - Visibility/shadow calculations
- Ray.h - Ray casting for queries
Testbed Demos (15 scenarios):
- Chains, Trebuchet, Newton's Cradle
- Friction, Restitution, Drag testing
- Stack, Bouncing ball, Wrecking ball
- All 3 explosion types, Object slicing
- Line of sight, Ray casting
Architecture Highlights
- Polymorphic shape system - Virtual base class for extensibility
- Sequential Impulses solver - Iterative constraint resolution
- Spring-based joints - Configurable stiffness and damping
- AABB optimization - Broadphase filtering before collision checks
- Data-driven config - Serializable settings with ImGui controls
Key Features
- Pure C++ implementation (no external physics library)
- Convex polygon support (arbitrary vertex count)
- Stable object stacking
- Momentum conservation
- Static/dynamic friction
- Customizable restitution (bounciness)
- Real-time parameter tuning via GUI
- Save/load settings
The testbed (testbed/Main.cpp) provides an interactive OpenGL window where you can run demos, visualize physics (AABBs, contacts, centers of mass), and tweak solver parameters in real-time.