# From Flying Balls to Colliding Polygons

## Table of contents

- [Abstract](#abstract)
- [Before vs After](#before-vs-after)
  - [Context](#context)
  - [Before](#before)
  - [After](#after)
- [Contact](#contact)

## Abstract

> (text taken from the abstract of my report that you can find
> [here](https://github.com/karma-riuk/bachelor-project-report/blob/main/bachelorproject.pdf)

Physics engines are a fun and interesting way to learn about the laws of
physics, as well as computer science. They provide a real-time simulation of
common physical phenomena, and therefore illustrate theoretical concepts such as
the equations that dictate the motion of objects.

The goal of this project was to extend an existing physics engine built for
demonstration purposes. This engine was initially designed and developed to
simulate circular objects ("balls") in 2D.

With this project, we intended to extend this engine to also simulate arbitrary
polygons, again in a physically accurate way. The main technical challenges of
the project is therefore the correct simulation of the dynamics of rigid,
polygonal objects. In particular, we developed a model of polygonal rigid
objects:

- we implemented a simulation of their inertial motion, possibly in the
  presence of a constant force field such as gravity;
- we detect collisions between objects;
- we compute and then simulate the dynamic effects of collisions.

The simulations are animated and displayed in real-time. It is also therefore
crucial that the simulation code be efficient to obtain smooth animations.

## Before vs After

### Context

A little of context for the follow videos:

- in the first video, the special ball with an arrow inside is a "spaceship",
  that can be controlled by the user;
- the yellow bar that appears after midway through both videos represent the
  restitution coefficient of the collision resolution (the lower it is, the
  greater the dampening on impact between objects);
- the white line with a ball at the end that appears after the restitution
  coefficient bar represents the gravity vector that gets applied to the speed
  of each object at each frame, the ball is the direction the vector is pointing
  it.

### Before

https://github.com/karma-riuk/flying-balls/assets/30158492/ddc0d608-9667-4a21-8132-e056e443e0e2

### After

https://github.com/karma-riuk/flying-balls/assets/30158492/bd4013b8-bc01-4d52-aa2f-44dbc25de717

<!-- ## Controls -->
<!---->
<!-- ## Installation -->

## Contact

If you have any question concerning this work, feel free to contact me at [arno.fauconnet@gmail.com](mailto:arno.fauconnet@gmail.com)
