В дополнение к тому, что Блендер пишет об использовании уравнений Ньютона, вам нужно подумать о том, как вы будете интегрироваться по своему «полю ускорения» (как вы это называете в комментарии к его ответу).
Самый простойспособ заключается в использовании метод Эйлера .Проблема в том, что он быстро расходится, но он имеет преимущество в том, что его легко кодировать и он достаточно быстр.
Если вы ищете лучшую точность и готовы пожертвовать некоторой производительностью, один из Методы Рунге-Кутты (вероятно, RK4) обычно были бы хорошим выбором.Я предупреждаю вас, что если ваше «поле ускорения» является динамическим (то есть оно меняется со временем ... возможно, в результате движения планет по своим орбитам), RK4 станет проблемой.
Обновление (на основе комментария / вопроса ниже):
Если вы хотите рассчитать вектор силы F i (t * 1021)* n ) в какой-то момент времени t n , примененный к конкретному объекту i , затем вам необходимо вычислить силу, вносимую всеми другими объектами в вашей симуляции, используяуравнение Блендер ссылки.То есть для каждого объекта, i , вы выясните, как все другие объекты вытягивают (применяют силу), и эти векторы при суммировании будут вектором совокупной силы, примененным к i .Алгоритмически это выглядит примерно так:
for each object <i>i</i>
<b>F</b><sub><i>i</i></sub>(t<sub>n</sub>) = 0
for each object <i>j</i> ≠ <i>i</i>
<b>F</b><sub><i>i</i></sub>(t<sub>n</sub>) = <b>F</b><sub><i>i</i></sub>(t<sub>n</sub>) + G * m<sub><i>i</i></sub> * m<sub><i>j</i></sub> / |<b>p</b><sub><i>i</i></sub>(t<sub>n</sub>)-<b>p</b><sub><i>j</i></sub>(t<sub>n</sub>)|<sup>2</sup>
Где p i (t n ) и p j (t n ) - положения объектов i и j в момент времени t n соответственно и ||является стандартным евклидовым ( l 2 ) нормальным ... т.е. евклидовым расстоянием между двумя объектами.Кроме того, G - это гравитационная постоянная .
Метод Эйлера разбивает симуляцию на дискретные интервалы времени.Он просматривает текущее состояние и, в случае вашего примера, рассматривает все силы, приложенные в совокупности ко всем объектам в вашей имитации, а затем применяет эти силы как постоянные в течение периода временного интервала.При использовании
<b>a</b><sub><i>i</i></sub>(t<sub>n</sub>) = <b>F</b><sub><i>i</i></sub>(t<sub>n</sub>)/m<sub><i>i</i></sub>
( a i (t n ) = вектор ускорения в момент времени t n применяется к объекту i , F i (t n ) - вектор силыприменяется к объекту i в момент времени t n , а m i - масса объекта i ),вектор силы (и, следовательно, вектор ускорения) поддерживается постоянным в течение продолжительности временного интервала.В вашем случае, если у вас действительно есть другой метод вычисления ускорения, вам не нужно вычислять силу, а вместо этого можно напрямую вычислять ускорение.В любом случае, когда ускорение поддерживается постоянным, положение в момент времени t n + 1 , p (t n + 1 ) и скорость в момент времениt n + 1 , v (t n + 1 ) объекта будет иметь вид:
<b>p</b><sub><i>i</i></sub>(t<sub>n+1</sub>) = 0.5*<b>a</b><sub><i>i</i></sub>(t<sub>n</sub>)*(t<sub>n+1</sub>-t<sub>n</sub>)<sup>2</sup> + <b>v</b><sub><i>i</i></sub>(t<sub>n</sub>)*(t<sub>n+1</sub>-t<sub>n</sub>)+<b>p</b><sub><i>i</i></sub>(t<sub>n</sub>)
<b>v</b><sub><i>i</i></sub>(t<sub>n+1</sub>) = <b>a</b><sub><i>i</i></sub>(t<sub>n+1</sub>)*(t<sub>n+1</sub>-t<sub>n</sub>) + <b>v</b><sub><i>i</i></sub>(t<sub>n</sub>)
Метод RK4 подгоняет драйвер вашей системы к полиному 2-й степени, который лучше приближает его поведение.Подробности на сайте Википедии, на который я ссылался выше, и есть ряд других ресурсов, которые вы можете найти в Интернете.Основная идея заключается в том, что вместо выбора одного значения силы для конкретного временного среза вы вычисляете четыре вектора силы в определенное время, а затем подгоняете вектор силы к полиному 2-й степени.Это хорошо, если ваши векторы силовых полей не меняются между временными срезами.Если вы используете гравитацию для получения векторного поля, а объекты, являющиеся источниками гравитации, перемещаются, то вам необходимо вычислить их положения в каждом из четырех подинтервалов, чтобы вычислить векторы силы.Это можно сделать, но ваша производительность будет немного хуже, чем при использовании метода Эйлера.С положительной стороны, вы получаете более точное движение объектов относительно друг друга.Таким образом, это сложная задача в том смысле, что она требует больших вычислительных ресурсов, и немного затруднительно определить, где все объекты должны находиться для ваших четырех выборок в течение отрезка времени вашей итерации.