Skip to content

HaydenMarshalla/CPhysics

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

  1. Polymorphic shape system - Virtual base class for extensibility
  2. Sequential Impulses solver - Iterative constraint resolution
  3. Spring-based joints - Configurable stiffness and damping
  4. AABB optimization - Broadphase filtering before collision checks
  5. 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.

Screenshots

a relative link a relative link a relative link