Физические движки

Итак, сегодня будем обсуждать физические двигатели. Для начала определение, физический движок — подсистема в компьютерных играх и некоторых других приложениях, отвечающая за симуляцию физики абсолютно твёрдого тела. Я думаю, уже из названия понятно, для чего он нужен. Например, в гоночных симуляторах, физике отдается очень большое внимание, ведь при езде автомобиля, для реалистичности движения нужно учитывать немало факторов: трение колес о дорогу, силы действующие на машину при поворотах и заносах, сопротивление среды и пр. Таких факторов может быть и боле 100, и чем больше их учитывается, тем реалистичнее становится игра. Прежде чем мы рассмотрим несколько физических двигателей, я хочу напомнить, что любой движок — это в некотором роде обычный модуль, написанный на каком-либо языке программирования, и подключаемый при потребности к игре. Не стоит забывать об этом.
 
 Как всегда у вас есть выбор, писать двигатель самому, либо использовать уже готовый. Изобретать велосипед не советую, это конечно похвально, что вы хотите все сделать сам, но для этого нужна большая и хорошая компания разработчиков, а также опыт. Так что приступаем рассматривать всевозможные существующие физические движки.
1) Open Dynamics Engine(ode) (оф сайт)— это открытый физический движок, распространяемый бесплатно в виде динамически подключаемой библиотеки. Его основными  компонентами являются система динамики абсолютно твёрдого тела и система обнаружения столкновений. Движок относится к свободному программному обеспечению и распространяется по двум лицензиям: BSD license и LGPL. Данный движок, сегодня, наиболее популярен для среднестатистических GameDev’вов. С ODE разобраться не так просто, но если вы упорный и имеете представление о физическом моделировании, через месяц вы сможете собрать неплохой гоночный симулятор. На этом двигателе написано более сотни коммерческих и некоммерческих проектов. Возьмем, к примеру: 18 стальных колес, Taxi3, Monster 4×4 и прочие.

Основные возможности:
  — Жесткие тела с произвольной массой;
  — Типы сочленений(joint): шарик-в-разъеме(ball-and-socket), сгибание(hinge), скольжение(slider), сгибание-2(hinge-2), фиксация(fixed), угловой двигатель(angular motor), универсал(universal);
  — Примитивы, участвующие в столкновении: сфера(sphere), прямоугольный параллелепипед(box), цилиндр с верхушкой(capped cylinder), плоскость(plane), луч(ray) и набор треугольников(triangular mesh);
  — Пространства, в которых происходят столкновения: quad tree, hash space и simple;
  — Методы симуляции: уравнения движения Лагранжа основанные на моделях Trinkle/Stewart и Anitescu/Potra;
  — Используется интегрирование первого порядка(first order integrator). Оно быстрое но не достаточно точное для квантовой физики. Более высокая степень интегрирования появится позже;
  — Выбор метода шага времени(time step): это или стандартный метод «большая матрица»(big matrix) или новый метод итераций QuickStep;
  — Модель контактов и трения: Основана на Dantzig LCP решении Бараффа(Baraff), хотя в ODE реализовано быстрое приближение модели трения Coloumb;
  — Имеет C интерфейс (хотя почти вся ODE написана на C++);
  — C++ интерфейс лежит в основе C интерфейса;
  — Написано много модулей, и много пишутся сейчас;
  — Специфические оптимизации для различных платформ.
 
2) Bullet Physics Library — физический движок реального времени, разрабатывается с помощью специализированного веб-сайта Google Code и распространяется на основе лицензии zlib, что позволяет бесплатно использовать продукт в коммерческих и некоммерческих проектах. Данный двигатель менее известный, как не странно я от всех больше слышу об ODE, но и на нем можно сделать что-то стоящее, ведь его автор Эрвин Куманс разрабатывал коммерческий движок Havok, о котором немного позже.

Некоторые особенности:
    — Просчитывает столкновения (англ. collision shapes) таких фигур: сфера, параллелепипед, цилиндр, конус, выпуклый корпус и сетка треугольников (англ. triangle mesh);
    — Реализует алгоритм расчёта столкновений Гилберта-Джонса-Кёрти (GJK);
    — Swept collision test;
    — Непрерывный расчёт столкновений;
    — Ограничители (англ. constraints);
    — Импорт данных из файлов формата COLLADA 1.4;
    — Модульное строение позволяет подключить собственное физическое ПО;
    — Плагин для Maya 2008.
   
 Кроме того, если вы решите использовать именно Bulet, вам стоит знать ещё вот что. Существует такой графический редактор, Blender, исполбзующийся в Bulet для анимации. Так же есть уже готовые игровые движки Crystal Space и C4 Engine, которые использует Bullet Physics Library, как главную физическую библиотеку.
 

3) Tokamak physics engine (оф сайт) — физический движок, работающий в режиме реального времени, который распространяется на основе свободной лицензии BSD с открытыми исходными кодами начиная с 2007 года. Ещё одна библиотека после ODE, которая хорошо подойдет как для коммерческого, так и для не коммерческого проекта. Плюсов у неё предостаточно, например её легко освоить новичку, ранее не работавшему с физическими двигателями. С другой стороны, в старых версиях есть очень ужасный недостаток, движущиеся объекты иногда неправильно взаимодействовали с статическими объектами, например, в гонках колесо могло запросто попасть под дорогу, да и вообще машина могла упасть под трассу. Но, на сколько я знаю, с этим разработчики уже справились, так что можно об этом не волноваться. 

Отметим некоторые особенности:
 — Tokamak обладает уникальным итерационным методом для обработки ограничений. Этот метод необходим для того, чтобы позволять разработчикам делать выбор между точностью и скоростью и обеспечивать более предсказуемое потребление ресурсов процессора и системной памяти физическим движком;
 — поддерживает множество типов связей, ограничений и реалистическую модель трения;
 — оптимизирован для наложения большого количества объектов, что является часто требуемым многими разработчиками игр;
 — обнаружение столкновений для примитивов (параллелепипед, сфера, капсула), комбинаций примитивов и произвольных статических полигональных сетей;
 — поддерживает «Разламываемую конструкторскую модель», которая разламывается в результате столкновений. Фрагменты (обломки, осколки) первоначальной модели будут созданы автоматически встроенными функциональными возможностями движка;
 — API содержит два разных типа классов: интерфейса и периферии. Классы интерфейса являются классами объектов, создаваемыми и управляемыми непосредственно основными функциями Tokamak или методами его класса. Другая группа — классы периферии, которые представляют собой обычные классы C++, определённые и управляемые пользователем;
 — API написан на языке программирования C++ и представляет собой объектно-ориентированный интерфейс, хотя объявление виртуальных функций сведено к минимуму. Вообще-то, как таковых их нет. Причиной данной реализации является то, что на некоторых платформах вызовы виртуальных функций слишком «расточительны» вследствие ограниченного размера кэша.

 Подведем итоги. Сегодня мы рассмотрели три физических движка: Open Dynamics Engine, Bullet Physics Library, Tokamak physics engine. Наиболее примечательные из них, это ODE и Tokamak, но решать как обычно вам, я лишь подкидываю почву для размышлений. По моему мнению, вам будет интересно познакомится и с коммерческими движками, именно им и будет посвящена следующая статья.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *