Участник:Аджил/Блог/3D-модели в игровом движке

Материал из ПокеВики
Перейти к: навигация, поиск

Я как, наверное, многие из вас, в какой-то мере являюсь любителем так называемых трёхмерных видеоигр. Конечно, существует великое множество готовых игрушек, среди них встречаются и про покемонов. Из официальной серии можно отметить Pokémon Stadium 1/2, Snap, Colosseum, XD, PBR, PokéPark Wii: Pikachu’s Adventure. Эти игры выпущены исключительно под игровые консоли фирмы Nintendo (хотя при наличии ПК достаточной мощности некоторые успешно запускаются на эмуляторах). Данная статья содержит сведения о примере использования 3D-моделей в собственных игровых модах или проектах. Итак, начнём.

Получение моделей

Чтобы иметь в конечном счёте рабочие трёхмерные модели покемонов, очевидно, можно пойти двумя путями — создать с нуля, либо взять с готового источника и адаптировать под выбранный игровой движок. Первый вариант, естественно требует куда больших затрат, и затрагивать его здесь мы не будем.

Выбор источника

Прежде всего нужно выбрать подходящий источник. Последними выпущенными играми (к моменту поиска таковых автором) были PBR и PokéPark. В пиринговых сетях присутствуют образы носителей для целевой платформы (Nintendo Wii). Производитель не документировал структуру их содержимого, поскольку это не предусматривается эксплуатацией, однако сообщества успешно прочитали файловую систему с помощью техники, именуемой «reverse engineering». Как выяснилось, в Pokémon Battle Revolution модели покемонов (и прочие ресурсы) присутствуют в виде файлов .FSYS, о формате которых в то время было практически ничего не известно (кроме того что это данные, сжатые алгоритмом LZSS). В PokéPark же формат файлов иной — .BRRES, который используется в прочих видеоиграх для Wii, начиная с Super Smash Bros. Brawl (отсюда и название — BRawl RESource), и его структура сообществу была уже известна. Некто Kentilan выпустил(а) программу-просмотрщик файлов .BRRES, содержащих модели с текстурами и анимациями, для платформы Microsoft Windows на x86 (между прочим, у меня она запускалась и работала из-под Wine 1.1 в Linux). Эта программа также позволяет экспортировать текстуры в файлы формата Targa (.TGA) или PNG, модели и анимации же — формата DooM 3 MD5 (.md5mesh/.md5anim) или Unreal (.PSK/.PSA).

Исходные файлы моделей ивилюций вместе со смотрелкой я загрузил на сервис файлового хостинга, вот ссылка. Модели прочих покемонов, которые есть в PokéPark, могу выслать желающим отдельно по требованию.

Выбор движка и адаптация моделей

Автор выбрал проект Platinum Arts Sandbox на движке Cube 2 из следующих соображений: бесплатность, кроссплатформенность, открытость исходных кодов, свободность лицензии (zlib), расширяемость, приемлемое качество графики, сравнительно невысокая требовательность к ресурсам (запускаю его прямо в ноутбуке Asus X50M; на средних настройках с не очень большим уровнем летает практически без тормозов). Также стоит отметить удобную возможность редактирования мира на лету (в том числе даже сообща по мультиплееру).

Cube 2 умеет читать несколько форматов моделей, включая MD5. Посему я сделал экспорт в этот формат, правда, не обошлось и без нюансов. Например, эта версия программы некорректно записывает количество вершин и треугольников в меше, что влечёт за собой падение движка с ошибкой Segmentation Fault, если это не исправить вручную. Файлы .md5mesh — это обычные текстовые файлы, и исправить значения numverts и numtris для каждого участка с подсчётом особого труда не составит. Необходимо обратить внимание и на то, что сгенерированные файлы ссылаются на текстуры (значения shader) с расширением .tga, а для Cube 2 нужны .jpeg или .png, поэтому текстуры следует проэкспортировать отдельно в PNG и соответственно исправить. Ещё настоятельно рекомендуется проименовать каждый меш, вписав перед строкой shader строку вида:

// meshes: body

Соответственно, этот меш будет иметь логическое название «body». Имена мешей в одной модели не должны повторяться! Следует учесть, что данный метод именования мешей применим специфически к Cube 2, и в других движках может проводиться по-другому либо не проводиться вообще. Что касается анимаций, некоторые из них (а конкретно Walk и Run) также требуют хирургического вмешательства. Дело в том, что они содержат данные по смещению модели в процессе движения, и для нашего движка их нужно устранить (иначе модель будет дёргаться вперёд-назад). Делается это просто — в (таком же текстовом) файле .md5anim находятся блоки, соответствующие кадрам. Вторая строка внутри каждого блока показывает смещение модели относительно логического положения в координатах и имеет вид:

0.200000 0.000000 0.000000 0.000000 0.000000 0.000000

Первое значение и есть сдвиг модели по оси X в данном кадре. Итак, для каждого кадра нужно поменять его на значение, которое записано в базовом кадре (см. baseframe; как правило, оно равно 0.000000, но может варьироваться).

Далее движку необходимы параметры модели (такие как масштаб, соответствие и скорость анимаций, блики/свечение и прочее). Подробно они описаны здесь на английском языке. Я подготовил рабочий пакет моделей ивилюций и выложил сюда (в некоторых примитивных текстовых редакторах, таких как Notepad, он же Блокнот, переносы строк в моих файлах не отображаются, поскольку они сохранены в стиле UNIX «\n», а не DOS «\r\n»; также сделаны некоторые дополнительные, более сложные вещи, такие как ручная подгонка bounding box, разбивка текстур глаза и рта по эмоциям и т. п.). По просьбе желающих могу собрать и отправить рабочие модели других покемонов в формате MD5, готовые для использования в движке.

Загрузка моделей в игру

Скачаем пакет Sandbox с официального сайта проекта (ссылка предоставлена выше). Самый простой вариант — выбрать и загрузить готовый релиз под вашу ОС с соответствующей страницы. Но так как проект находится на стадии активной разработки, я бы порекомендовал сделать у себя копию последней ревизии из SVN, и собрать исходные коды одним из этих компиляторов языка C++: для Windows это может быть MS Visual Studio либо набор MinGW+MSYS, в *nix-системах сборка как правило ведётся компилятором GCC или аналогичным (см. также список зависимостей библиотек — MESA, SDL и пр.; можете установить dev-пакеты, имеющиеся в репозитории вашего дистрибутива). SVN-дерево проекта — http://www.svn.kids.platinumarts.net/32pas32/trunk/. В ОС Windows удобно пользоваться графическим клиентом TortoiseSVN. В POSIX-системах чекаут ревизии делается вводом следующей командной строки в оболочке:

svn co http://www.svn.kids.platinumarts.net/32pas32/trunk/ Sandbox

Я сам временами вношу свой вклад в проект, например — как дополнение мода MovieCube. Давайте на его примере посмотрим, как используются модели в движке. Предполагается, что вы уже либо распаковали содержимое файла SEpack.zip в корневую папку установленного/собранного дистрибутива, либо просто поместили сам файл туда как есть. Выполним программу Launcher, выберем какой-нибудь уровень, откроем вкладку MovieCube и запустим игру. Если вы записывали zip-файл как есть, прямо в игре сначала пропишите (следя за регистром):

/addzip SEpack.zip

Это смонтирует содержимое, которое будет видеться игрой как обычные папки с файлами. Теперь приступим собственно к моделям. На примере покемона Иви установка модели производится вводом:

/preloadplayermodel sepack/Eievui

Следующая строка сменит текущую модель игрока:

/setplayermodel 1

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

/preloadplayermodel sepack/Showers
/setplayermodel 2

Каждой загруженной в дальнейшем модели с помощью preloadplayermodel будет соответствовать новый индекс в порядке возрастания: 3, 4, 5 и т. д. Теперь создадим персонажа-«актёра». Переключимся в режим редактирования уровня нажатием клавиши E. Наведём указатель на какой-нибудь участок, на котором можно стоять, и введём:

/newent waypoint

Обратите внимание, на том месте появится участок с данными. Нам нужно число, которое написано рядом с надписью uid. Если, допустим, это число 150, то собственно создание персонажа (пусть это будет Иви, присвоим ему имя Andy) будет выглядеть так:

/newcharacter Andy
/appendactionmodel Andy 0 1
/appendactionspawn Andy 0 150

Выйдем из режима редактирования с помощью всё той же клавиши E. Индекс модели указывается командой appendactionmodel (не обращайте внимание на нуль, это зарезервированное поле, вводите как указано). Нажмём Tab, в списке выберем нашего «актёра». И вот, персонаж появился! Но он просто стоит на месте. Добавим ему парочку действий. Снова нажмём клавишу E (заметьте, персонаж исчез!), выберем другой участок и снова введём:

/newent waypoint

Пусть uid в этот раз будет 151. Напишем сценарий, где наш персонаж будет ждать 1 секунду (1000 миллисекунд) после появления, а затем подбежит ко второму вейпоинту:

/appendactionwait Andy 0 1000
/appendactionmove Andy 0 151

Снова нажмём E, затем Tab, выберем его и пронаблюдаем. Если всё сделано правильно, сценарий выполняется как и планировалось. На этом разбор мода закончим; прочие подробности в этом руководстве затрагивать не будем.

Автор также собирается рассмотреть проект OctaForge на модифицированном движке Cube 2, поскольку он обладает более гибкой структурой (вся логика описывается сценарийным языком Lua, сравнительно простом в освоении и в какой-то мере похожем на Javascript) и расширяемостью (разработчик проекта даже планирует использовать физический движок Newton для большей реалистичности!). Ну, на этом пока всё. Спасибо за внимание!

Скриншоты