С чего все началось
Поначалу, моей целью было смоделировать движение развертываемой нити. Особенность этой задачи — в развертывании. Если его отбросить, то при помощью пакета физического моделирования (например, MapleSim или SimMechanics) такую модель можно составить минут за пятнадцать (имеется в виду модель нити, состоящей из точечных масс соединенных пружинами). Но оказалось, что решать задачи в которых структура модели изменяется в процессе движения (развертывание нити моделируется появлением новых частиц) при помощи существующих пакетов весьма затруднительно.
Что ж, в таком случае можно написать программу самому, а визуализацию движения выполнить в OpenGL. Задача это довольно простая: движение нити описано в 40-овом уроке NeHe [2,3], оставалось доработать его так, чтобы нить разворачивалась. Но мне такой подход не понравился.
Уроки NeHe, несмотря на то, что с их помощью многие познакомились с OpenGL, грешат сваливанием всего в кучу. В одном и том же модуле или даже классе может оказаться код, отвечающий за моделирование движения, его визуализацию и расчет времени. Хотелось структурировать код, и сделать эту структуру достаточно универсальной.
Такой подход принят в физических движках, среди которых есть немало свободных и с открытым исходным кодом. Однако готовый движок использовать не хотелось, чтобы не тратить силы на "вырезание" из него ненужных функций. В результате задача приобрела следующую постановку: создать простой физический движок для моделирования поведения системы частиц, и смоделировать с его помощью развертывание нити.
Физический движок (physics engine) — библиотека или программа, которая выполняет компьютерное моделирование поведения той или иной системы. Чаще всего, на основе законов механики моделируется движение систем частиц, твердых тел или жидкости.
Разработка физического движка описана, в частности, в книге Миллингтона [1]. Однако ее автор движется, на мой вкус, слишком широким шагом. Некоторые главы остаются без примеров. Код движка представлен в готовом виде, тогда как хотелось бы видеть его в развитии. К тому же, реализация ориентирована на Microsoft Visual Studio, и перенос на другие системы требует некоторой доработки.
Что вы здесь найдете
- Описание этапов разработки физического движка, основанное на книге Миллингтона [1]. В частности, рассмотрены вопросы: создания класса для визуализации системы с помощью OpenGL и GLUT, выбора шага интегрирования и отладки приложения. Реализация движка ориентирована на GCC или MinGW.
- Примеры моделирования движения простых систем: мяча, маятника, связанных тел и т. п. Наконец, в финале моделируется движение нити и ее развертывание.
Источники
- Millington I. Game Physics Engine Development. 2nd edition. — Morgan Kaufmann Publishers, 2010. — 553 p.
- Nehe Productions. Lesson 39 "Introduction to Physical Simulations" ( русский перевод).
- Nehe Productions. Lesson 40 "Rope Physics" (русский перевод).
Вспомним физику
- Кухлинг Х. Справочник по физике. — М.: Мир, 1985. — 520 с.
- Бутиков Е.И., Кондратьев А.С. Физика: В 3 кн. Кн. 1. Механика. — М.: ФИЗМАТЛИТ, 2004. — 352 с.
Указанные книги есть на Library Genesis.
Комментарии
comments powered by Disqus