Самостоятельно вряд ли напишете, берите любой физический движок и разбирайтесь с ним, например:
https://github.com/wellcaffeinated/PhysicsJS или
https://brm.io/matter-js/ — там есть демки с подобной функциональностью. Вес решений не берусь оценивать, думаю, можно найти и более минималистичные или позволяющие дробить функционал.