/gravity

3D Gravity Simulator is a C++ program that visualizes the gravitational interactions between celestial bodies

Primary LanguageC++GNU General Public License v3.0GPL-3.0

3D Gravity Simulato

image.png

Overview

This 3D Gravity Simulator is a C++ program that visualizes the gravitational interactions between celestial bodies in a simplified solar system model. It uses OpenGL for rendering and GLFW for window management and user input.

Program Structure

The simulator consists of several key components:

  1. Simulator: Handles the physics calculations and updates the positions of celestial bodies.
  2. Renderer: Manages the 3D rendering of the celestial bodies, trajectories, and grid.
  3. CelestialBody: Represents individual celestial bodies with properties like mass, position, and velocity.

Physics Implementation

Gravitational Force

The simulator uses Newton's law of universal gravitation to calculate the forces between celestial bodies. The gravitational force between two bodies is given by:

$$ F = G \frac{m_1 m_2}{r^2} $$

Where:

  • $F$ is the gravitational force between the two bodies
  • $G$ is the gravitational constant ($6.67430 \times 10^{-11} , \text{N} \cdot \text{m}^2 / \text{kg}^2$)
  • $m_1$ and $m_2$ are the masses of the two bodies
  • $r$ is the distance between the centers of the two bodies

Motion Update

The motion of each celestial body is updated using numerical integration. We use a simple Euler method for updating positions and velocities:

  1. Calculate the net force on each body
  2. Calculate acceleration:
$$ \vec{a} = \frac{\vec{F}}{m} $$
  1. Update velocity:
$$ \vec{v}_{new} = \vec{v}_{old} + \vec{a} \Delta t $$
  1. Update position:
$$ \vec{x}_{new} = \vec{x}_{old} + \vec{v}_{new} \Delta t $$

Where $\Delta t$ is the time step of the simulation.

Rendering

The program uses OpenGL to render the 3D scene:

  • Celestial bodies are represented as spheres with sizes proportional to their masses (using a logarithmic scale).
  • A grid is drawn to provide a reference plane.
  • Trajectories of the bodies are drawn as lines, fading out over time.
  • The camera can be controlled using WASD keys for movement and the mouse for orientation.

Limitations and Simplifications

  1. The simulation uses a fixed time step, which can lead to inaccuracies in long-term simulations.
  2. The Euler method for numerical integration is simple but can accumulate errors over time.
  3. The scale of the celestial bodies and their distances are not to true scale to make visualization easier.
  4. Relativistic effects are not considered; the simulation uses classical Newtonian mechanics.

How to Use & Installation

Prerequisites

  • C++ compiler with C++17 support
  • CMake (version 3.28 or higher)
  • OpenGL libraries
  • GLFW3
  • GLM (OpenGL Mathematics)
  • vcpkg (for managing dependencies)

Building from Source

  1. Clone the repository:

    git clone https://github.com/Quinta0/gravity.git
    cd gravity
  2. Install vcpkg:

    git clone https://github.com/Microsoft/vcpkg.git 
    cd vcpkg
    ./bootstrap-vcpkg.sh  # On Windows, use bootstrap-vcpkg.bat
    ./vcpkg integrate install
    cd ..
  3. Install dependencies using vcpkg:

    ./vcpkg/vcpkg install freeglut glew glm vcpkg-cmake opengl glfw3
  4. Create a build directory and run CMake:

    mkdir build
    cd build
    cmake -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake ..
    cmake --build .
  5. Run the simulator:

    ./gravity