Иногда лучше вернуться к основам. Здесь у нас есть симуляция двойного маятника без следов физического движка. И все это укладывается в 100 строк JavaScript.
Двойной маятник интересен тем, что это простая физическая система с удивительно сложным поведением. Он демонстрирует чувствительность к начальным условиям и, следовательно, может считаться хаотичным для некоторых начальных конфигураций.
Микаэль Оливейра создал physics-sandbox с идеей создать несколько демо-версий физики, и первой из них стал двойной маятник, который в упрощенном виде вы можете увидеть ниже.
С точки зрения хаоса интересно то, как часто нижний маятник делает полную петлю. Очень трудно предсказать, произойдет ли петля или когда она произойдет — поэтому во время наблюдения следите за петлей, которая вот-вот произойдет.
Если вы хотите узнать теорию, зайдите на веб-страницу Микаэля с ее объяснением. Он использует подход Лагранжа, и после разработки Лагранжа и подстановки его в уравнения движения, в итоге получается нечто, что выглядит ужасно. Уравнения дают угловое ускорение как функцию углового положения и скорости.
Сила программирования в том, что даже если вы не можете найти замкнутую форму для положения как функции времени, вы можете смоделировать систему. В этом случае не требуется ничего, кроме базового метода Эйлера; новое положение — это старое положение плюс соответствующая скорость, умноженная на шаг по времени, а новая скорость — это старая скорость, умноженная на соответствующее ускорение, умноженное на шаг по времени. Это прямое физическое моделирование, но оно кажется достаточно стабильным, если размер шага мал.
Источник: Георгий Иоаннидис
Двойной маятник, демонстрирующий хаотическую динамику — конец маятника отслеживается светодиодом.
Это не революционно, но это весело и напоминает о том, что вы можете делать вещи, не прибегая к изучению сложного фреймворка.
Кто-нибудь хочет попробовать это в Box2D?
Вы можете посмотреть лучшую версию программы на сайте Микаэля, где вы можете попробовать различные массы и начальные конфигурации.
Код находится на GitHub.