С чего все началось

Поначалу, моей целью было смоделировать движение развертываемой нити. Особенность этой задачи — в развертывании. Если его отбросить, то при помощью пакета физического моделирования (например, MapleSim или SimMechanics) такую модель можно составить минут за пятнадцать (имеется в виду модель нити, состоящей из точечных масс соединенных пружинами). Но оказалось, что решать задачи в которых структура модели изменяется в процессе движения (развертывание нити моделируется появлением новых частиц) при помощи существующих пакетов весьма затруднительно.

Что ж, в таком случае можно написать программу самому, а визуализацию движения выполнить в OpenGL. Задача это довольно простая: движение нити описано в 40-овом уроке NeHe [2,3], оставалось доработать его так, чтобы нить разворачивалась. Но мне такой подход не понравился.

Уроки NeHe, несмотря на то, что с их помощью многие познакомились с OpenGL, грешат сваливанием всего в кучу. В одном и том же модуле или даже классе может оказаться код, отвечающий за моделирование движения, его визуализацию и расчет времени. Хотелось структурировать код, и сделать эту структуру достаточно универсальной.

Такой подход принят в физических движках, среди которых есть немало свободных и с открытым исходным кодом. Однако готовый движок использовать не хотелось, чтобы не тратить силы на "вырезание" из него ненужных функций. В результате задача приобрела следующую постановку: создать простой физический движок для моделирования поведения системы частиц, и смоделировать с его помощью развертывание нити.

Физический движок (physics engine) — библиотека или программа, которая выполняет компьютерное моделирование поведения той или иной системы. Чаще всего, на основе законов механики моделируется движение систем частиц, твердых тел или жидкости.

Разработка физического движка описана, в частности, в книге Миллингтона [1]. Однако ее автор движется, на мой вкус, слишком широким шагом. Некоторые главы остаются без примеров. Код движка представлен в готовом виде, тогда как хотелось бы видеть его в развитии. К тому же, реализация ориентирована на Microsoft Visual Studio, и перенос на другие системы требует некоторой доработки.

Что вы здесь найдете

  • Описание этапов разработки физического движка, основанное на книге Миллингтона [1]. В частности, рассмотрены вопросы: создания класса для визуализации системы с помощью OpenGL и GLUT, выбора шага интегрирования и отладки приложения. Реализация движка ориентирована на GCC или MinGW.
  • Примеры моделирования движения простых систем: мяча, маятника, связанных тел и т. п. Наконец, в финале моделируется движение нити и ее развертывание.

Источники

  1. Millington I. Game Physics Engine Development. 2nd edition. — Morgan Kaufmann Publishers, 2010. — 553 p.
  2. Nehe Productions. Lesson 39 "Introduction to Physical Simulations" ( русский перевод).
  3. Nehe Productions. Lesson 40 "Rope Physics" (русский перевод).

Вспомним физику

  1. Кухлинг Х. Справочник по физике. — М.: Мир, 1985. — 520 с.
  2. Бутиков Е.И., Кондратьев А.С. Физика: В 3 кн. Кн. 1. Механика. — М.: ФИЗМАТЛИТ, 2004. — 352 с.

Указанные книги есть на Library Genesis.



Комментарии

comments powered by Disqus