Участник:Аджил/Блог/3D-модели в игровом движке — различия между версиями
Аджил (обсуждение | вклад) м (→Выбор движка и адаптация моделей: стилевые правки) |
Аджил (обсуждение | вклад) (дополнение) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 10: | Строка 10: | ||
=== Выбор движка и адаптация моделей === | === Выбор движка и адаптация моделей === | ||
− | Автор выбрал проект [http://sandboxgamemaker. | + | Автор выбрал проект [http://www.sandboxgamemaker.com/ Platinum Arts Sandbox] на движке Cube 2 из следующих соображений: бесплатность, кроссплатформенность, открытость исходных кодов, свободность лицензии (zlib), расширяемость, приемлемое качество графики, сравнительно невысокая требовательность к ресурсам (запускаю его прямо в ноутбуке Asus X50M; на средних настройках с не очень большим уровнем летает практически без тормозов). Также стоит отметить удобную возможность редактирования мира на лету (в том числе даже сообща по мультиплееру). |
Cube 2 умеет читать несколько форматов моделей, включая MD5. Посему я сделал экспорт в этот формат, правда, не обошлось и без нюансов. Например, эта версия программы некорректно записывает количество вершин и треугольников в меше, что влечёт за собой падение движка с ошибкой Segmentation Fault, если это не исправить вручную. Файлы .md5mesh — это обычные текстовые файлы, и исправить значения numverts и numtris для каждого участка с подсчётом особого труда не составит. Необходимо обратить внимание и на то, что сгенерированные файлы ссылаются на текстуры (значения shader) с расширением .tga, а для Cube 2 нужны .jpeg или .png, поэтому текстуры следует проэкспортировать отдельно в PNG и соответственно исправить. Ещё настоятельно рекомендуется проименовать каждый меш, вписав перед строкой shader строку вида: | Cube 2 умеет читать несколько форматов моделей, включая MD5. Посему я сделал экспорт в этот формат, правда, не обошлось и без нюансов. Например, эта версия программы некорректно записывает количество вершин и треугольников в меше, что влечёт за собой падение движка с ошибкой Segmentation Fault, если это не исправить вручную. Файлы .md5mesh — это обычные текстовые файлы, и исправить значения numverts и numtris для каждого участка с подсчётом особого труда не составит. Необходимо обратить внимание и на то, что сгенерированные файлы ссылаются на текстуры (значения shader) с расширением .tga, а для Cube 2 нужны .jpeg или .png, поэтому текстуры следует проэкспортировать отдельно в PNG и соответственно исправить. Ещё настоятельно рекомендуется проименовать каждый меш, вписав перед строкой shader строку вида: | ||
Строка 18: | Строка 18: | ||
Первое значение и есть сдвиг модели по оси X в данном кадре. Итак, для каждого кадра нужно поменять его на значение, которое записано в базовом кадре (см. baseframe; как правило, оно равно 0.000000, но может варьироваться). | Первое значение и есть сдвиг модели по оси X в данном кадре. Итак, для каждого кадра нужно поменять его на значение, которое записано в базовом кадре (см. baseframe; как правило, оно равно 0.000000, но может варьироваться). | ||
− | Далее движку необходимы параметры модели (такие как масштаб, соответствие и скорость анимаций, блики/свечение и прочее). Подробно они описаны [http://sauerbraten.org/docs/models.html#md5_format здесь на английском языке]. Я подготовил рабочий пакет моделей ивилюций и выложил [http://www.mediafire.com/?a40k7mbh1mwudk9 сюда] (также сделаны некоторые дополнительные, более сложные вещи, такие как | + | Далее движку необходимы параметры модели (такие как масштаб, соответствие и скорость анимаций, блики/свечение и прочее). Подробно они описаны [http://sauerbraten.org/docs/models.html#md5_format здесь на английском языке]. Я подготовил рабочий пакет моделей ивилюций и выложил [http://www.mediafire.com/?a40k7mbh1mwudk9 сюда] (в некоторых примитивных текстовых редакторах, таких как Notepad, он же Блокнот, переносы строк в моих файлах не отображаются, поскольку они сохранены в стиле UNIX «\n», а не DOS «\r\n»; также сделаны некоторые дополнительные, более сложные вещи, такие как ручная подгонка bounding box, разбивка текстур глаза и рта по эмоциям и т. п.). По просьбе желающих могу собрать и отправить рабочие модели других покемонов в формате MD5, готовые для использования в движке. |
== Загрузка моделей в игру == | == Загрузка моделей в игру == | ||
− | (будет | + | Скачаем пакет Sandbox с официального сайта проекта (ссылка предоставлена выше). Самый простой вариант — выбрать и загрузить готовый релиз под вашу ОС с [http://www.sandboxgamemaker.com/download-sandbox.html соответствующей страницы]. Но так как проект находится на стадии активной разработки, я бы порекомендовал сделать у себя копию последней ревизии из SVN, и собрать исходные коды одним из этих компиляторов языка C++: для Windows это может быть MS Visual Studio либо набор [http://www.mingw.org/ MinGW+MSYS], в *nix-системах сборка как правило ведётся компилятором GCC или аналогичным (см. также список зависимостей библиотек — MESA, SDL и пр.; можете установить dev-пакеты, имеющиеся в репозитории вашего дистрибутива). SVN-дерево проекта — http://www.svn.kids.platinumarts.net/32pas32/trunk/. В ОС Windows удобно пользоваться графическим клиентом [http://tortoisesvn.net/ 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, выберем его и пронаблюдаем. Если всё сделано правильно, сценарий выполняется как и планировалось. На этом разбор мода закончим; прочие подробности в этом руководстве затрагивать не будем. | ||
+ | |||
+ | Автор также собирается рассмотреть проект [http://octaforge.org/ OctaForge] на модифицированном движке Cube 2, поскольку он обладает более гибкой структурой (вся логика описывается сценарийным языком Lua, сравнительно простом в освоении и в какой-то мере похожем на Javascript) и расширяемостью (разработчик проекта даже планирует использовать физический движок [http://newtondynamics.com/ Newton] для большей реалистичности!). Ну, на этом пока всё. Спасибо за внимание! | ||
+ | |||
+ | == Скриншоты == | ||
+ | <gallery> | ||
+ | Файл:Sandbox-shot1.png|[[Амбреон]], уровень fps/island. | ||
+ | Файл:Sandbox-shot2.png|[[Вапореон]], уровень fps/forest. | ||
+ | Файл:Sandbox-shot3.png|[[Гласеон]], уровень rpg/rpg_snow. | ||
+ | Файл:Sandbox-shot4.png|[[Эспеон]] и [[Иви]], уровень fps/international-airport. | ||
+ | </gallery> |
Текущая версия на 13:13, 30 августа 2011
Я как, наверное, многие из вас, в какой-то мере являюсь любителем так называемых трёхмерных видеоигр. Конечно, существует великое множество готовых игрушек, среди них встречаются и про покемонов. Из официальной серии можно отметить 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 для большей реалистичности!). Ну, на этом пока всё. Спасибо за внимание!