Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Статьи / Rag doll.

Rag doll.

Автор:

Наверняка все из вас видели в современных играх то, как ведут себя монстры (или любые другие живые существа игрового мира) при их убийстве. Они падают на пол, как совершенно обычные живые существа (вследствие полного расслабления всех мышц тела), а затем по-всякому валяются по полу (многие любители игр просто обожают с ними играться!). Многим это нравится! Действительно, а почему обычному человеку не должно нравиться очень реалистичное поведение трупов?!?!

Введение.
Требования.
Начинаем.
  1. Ball-socket joint.
  2. Hinge joint.
Rag doll.
  Реализация rag doll’а на физическом движке Tokamak.

Введение.

Раньше (где-то лет десять тому назад) подобное казалось невозможным (естественно не хватало вычислительной мощности тогдашних персональных компьютеров) и все мы могли лишь мечтать об этом. В последние пять лет ситуация кардинально изменилась (во многом благодаря таким гигантам индустрии как AMD и Intel): теперь процессоры обычных настольных ПК очень неплохо справляются с такой задачей, как расчет динамики твёрдых тел.

В этой статье я планирую рассказать о том, как можно делать rag doll на основе современных физических движков. Напомню, что физический движок может быть как вашим (есть некоторые требования к нему), так и сторонним (Newton, ODE, Tokamak, Meqon, Havok, NovodeX и т.д.). В статье я попытаюсь рассказать о том, как сделать это, не привязываясь к определённому физическому движку. В конце статьи будет дан пример того, как можно сделать это на физическом движке Tokamak.

Требования.

Если вы собираетесь использовать физический движок собственного производства, то он должен иметь следующие характеристики:
- иметь поддержку симуляции динамики твёрдых тел;
- иметь хорошие возможности по определению столкновений между геометриями твёрдых тел, а также просчитывать ответную реакцию тел на столкновения между собой (collision response);
- поддерживать такие ограничители движения (constraints) как шарнирное соединение (ball-socket joint) и петельное соединение (hinge joint);

В том случае если вы используете один из таких физических движков, как Newton, ODE, Tokamak, Meqon, havok или NovodeX, то проблем с ними возникнуть не должно — автор даёт 100% гарантию, что в этих физических движках есть всё необходимое для реализации rag doll’ов.

Системные требования: единственное что необходимо, так это то чтобы центральный процессор вашего персонального компьютера был не ниже по производительности, чем допустим процессор Intel Pentium III, с тактовой частотой примерно 1000-1200 мегагерц.

Начинаем.

Что же такое constraint’ы? Загляните в любой англо-русский словарь — constraint переводится как ограничение. Так на самом деле и есть: constraint’ы ограничивают движение тел в пространстве и взаимно между собой, исходя из определённых критериев. Типов constraint’ов имеется великое множество. Я не буду перечислять все, а скажу лишь то, что нам понадобятся всего два их типа: ball-socket joint и hinge joint.

1. Ball-socket joint.

Изображение

По рисунку наглядно видно, что ball-socket joint есть не что иное, как шарнирное соединение двух тел. Особенность ball-socket joint’а состоит в том, что он ограничивает перемещение тел взаимно между собой, а также ограничивает то, как повернуты тела (вдоль всех трёх осей) относительно друг друга.

2. Hinge joint.

Изображение

По рисунку мы наглядно видим, что hinge joint есть не что иное, как петельное соединение двух тел. Hinge joint очень похож на ball-socket joint, но разница состоит лишь в том, что теперь тела могут поворачиваться относительно друг друга вдоль только одной из осей.

Rag doll.

Словосочетание rag doll c английского переводится как тряпичная кукла, что очень точно соответствует истине.

Теперь я хочу рассказать, о том, как делается собственно сам rag doll. На самом деле rag doll есть не что иное, как обычная комбинация твёрдых тел различных форм (и конфигураций) и двух видов их соединений между собой.
Это очень легко объяснить на примере. Допустим туловище человека, у нас будет неким convex’ом (выпуклое тело), к нему в разных его точках мы будем присоединять другие элементы тела (твёрдые тела). В свою очередь к этим другим элементам твёрдого тела мы будем подсоединять уже следующие по иерархии части тела.

Пример: к туловищу присоединяем предплечье руки, а к предплечью руки присоединяем кисть руки, и так далее.
Какими типами joint’ов соединять, спросят многие. Я отвечу так: каждый решает сам, основываясь на личных предпочтениях о том, что выглядит реалистичней.
Вообще тема rag doll’ов очень тесно связана с темой скелетной анимации (в процессе убийства монстра, каждая кость его скелета конвертируется в подобную кость rag doll’а), поэтому для более глубокого понимания темы советую прочитать статьи по данной теме на этом сайте.

Надеюсь, основная идея ясна? Ну, если не ясно, то всё прояснится при разборе примера реализации.

Реализация rag doll’а на физическом движке Tokamak.

Изображение

Для наглядности я решил не применять классы C++, а ограничиться простыми структурами. С той же целью был выбран физический движок Tokamak. Согласитесь, в маленьких примерах удобнее использовать уже готовые, высокоуровневые средства – Tokamak был написан на C++ и имеет свою собственную хорошую математическую библиотеку.

Для тех, кто не знаком с физическим движком Tokamak вообще, я советую почитать следующую статью:
Введение в физическую библиотеку Tokamak.

Я не хочу подробно разбирать каждую строку/структуру/функцию кода примера, да и не нужно это – в коде самого примера всё разложено по полочкам и очень хорошо прокомментировано. Думаю, что проблем с этим не возникнет ни у новичков, ни у более опытных программистов.
- пример был написан на языке C++, в среде Visual Studio .NET 2003;
- визуализация в примере происходит при помощи открытой кросс платформенной графической библиотеки OpenGL;
- в примере используется Tokamak версии 1.21 – заголовочные файлы и *.lib файл вложены;
- в примере не используется оригинальный glut, а используется его бесплатная, open-source альтернатива free glut – заголовочные файлы и *.lib файл также вложены;
- *.exe файл не требует никаких дополнительных динамически подключаемых библиотек (DLL).

Пример к статье: 20050710_3.rar (370 кБ).

PS: Убивайте монстров и играйте с их rag doll’ами! ;)

10 июля 2005

#rag_doll


Обновление: 6 сентября 2009

2001—2018 © GameDev.ru — Разработка игр