9 июля 2013 г.

Автомобильный суицид

Небольшая заметка про то, как можно сделать систему модульных повреждений для игрушек под мобилки, а также какие сюрпризы могут встретиться на пути.

В общем-то, задача звучит просто - нужно сделать систему повреждений автомобиля такой, чтобы он красиво разваливался по кускам, при этом должна быть четко видна разница между степенями повреждений (т.е. задел машину рядом - это царапки, "поцеловался" - уже вмятины, столб - "стальные объятия"). И да, именно под iOS.


Первая мысль была сделать вмятины через Morph Targets. В принципе, это самое первое и логичное что приходит на ум - можно и степень "повреждения" легко менять, и выглядит хорошо, да и художнику привычно. Ок, делаем, машинка выглядит клево. После чего понимаем, что морфинга в UDK под iOS нет. Об этом нигде не сказано, он просто не блендится на мобилках*. В общем-то не удивительно, т.к. он реализован через хитрый вертексный шейдер, которому пока не место на таких устройствах.

Самое забавное, что в начале мы подумали, что тупит экспорт/импорт моделек - ведь иногда все работало.. когда для удобства просмотра результата во вьювере (там цвет фона разный - на черном модельки сливаются) я отключал эмуляцию мобильных устройств.. :)


Следующее решение лежит на поверхности - разделить машинку на отдельные куски, каждый из которых живет отдельной жизнью. "Степени повреждения" - это LOD'ы данного куска.

У SkeletalMeshComponent'а есть переменная ForcedLodModel , которая отвечает будет использоваться автоматический LOD, или же какой-то жестко заданный. Изменение данной переменной ведет к изменению LOD'а в риалтайме.

Казалось бы - все просто. Убедившись, что на тушке машинки модель работает, мы порезали модельку на куску, собрали, загнали.. и ничего :) Даже при очень сильных столкновениях все части машинки оставались идеально новыми.

Нехитрый эксперимент показал, что изменение LOD'а может быть применено только для всего павна целиком. Другими словами, изменение ForcedLodModel для главного компонента вехайкла, к которому приаттачены все остальные, вызывает изменение лодов всех компонентов. При этом форсирование LOD'а для дочернего компонента - не имеет никакого значения для модели. Такое поведение вполне логично с точки зрения системы LOD'ов как таковых, хотя и достаточно однобоко, на мой взгляд.

Собственное решение не заставило себя долго ждать - если нельзя использовать "встроенные" LOD'ы, добавим свой аналог под конкретные цели. Мы просто показываем или скрывает тот или иной меш из "набора" детали машины в зависимости от "состояния". Полчаса работы, и машинка разбивается всеми своими частями:


Дополнительно можно оптимизировать эту схему путем динамического спавна/удаления мешей вместо постоянного хранения их в памяти (хотя, как показывает практика, на лоупольных машинках можно этим пренебречь).

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

P.S. - Ситуация с блокировкой сайтов все чаще привлекает к себе внимание. Интересно, является ли заголовок данной записи причиной для ее блокировки?

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


Бедные мустанги как бандерлоги шли прямо в пропасть, а некоторые - даже сразу после спавна не смогли почувствовать упругую силу асфальта. Увы, сложно жить машинкам, которых выпустили на игровую сцену над куском уровня, который еще не был загружен.

P.P.S. - В заметке использованы рабочие снимки не анонсированного проекта компании Sky Games.

* Не берусь судить, но последних моделях мобильных устройств при включенном CPU Skinning'е морфинг теоретически может быть.

Комментариев нет:

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

Примечание. Отправлять комментарии могут только участники этого блога.