Я бы предложил «улучшенный» первый подход: решать дифференциальные уравнения движения численно, например, с помощью классического метода Рунге-Кутта .
Приятная часть этого алгоритмаПосле того, как вы правильно настроили свой фреймворк, вам просто нужно написать функцию «оценки» для закона движения (которая может быть практически любой - вам не нужно ограничиваться определенными силами), и все должно работать нормально (насколько это возможно).как шаг интеграции адекватен).