Создание игр c использованием 3D’sMAX и Delphi
Автор о себе:
Я живу в далеком сибирском городке под названием Ангарск. Сейчас учусь в 11 классе (а если точнее на 3 курсе лицея). Нигде пока не работаю, только иногда выполняю с мамой заказы на дизайн интерьера (мама у меня дизайнер\архитектор, у нее прекрасные идеи, но на компьютере работать совсем не умеет).
Хотя я и отлично окончил художественную школу на отделении архитектуры (ну как не похвастаться :))), но все же поступлю и выучусь на программиста.
Искусство же для меня скорее хобби. Макс начал изучать год назад, абсолютно случайно увидел диск и заинтересовался. Со временем затянуло :) (думаю, многие поймут). Очень люблю рисовать, играть в компьютерные игры, программировать, а также играть на гитаре.
Данный урок, конечно, не научит вас делать игры вроде халфы, но, я думаю, из него можно узнать много интересных моментов, связанных с играми, а главное - о создании моделей для них.
Сделав недавно 3d-игру (это был мой курсовик в лицее) я решил-таки поделиться с народом опытом в создании игр. Вся статья основывается на моей программе (скрины из нее выставлены как одна из моих работ).
Для начала поговорим о создании моделей и текстур.
Моделирование сцены для игры описано в tutorials - Modeling Level Design, но там не написано про последующее экспортирование, а это оказалось не так-то просто!
Все моделирование происходило в 7 максе. Методом множества проб и ошибок был придуман следующий алгоритм подготовки модели, текстуры и их экспортирования:
1. Делаем low poly модель (модели, если это уровень).
2. Текстурируем ее, применяя модификатор Unwrap UVW (обязательно!)
3. Unwrap UVW -> edit ставим mapping = flattern, теперь Unwrap UVW сохраняем в файл. (file->save)
4. Выделив объект, rendering -> render to texture, там настройки:
output, path – папка, куда будет сохранена текстура.
Далее, там, где output, нужно нажать add… выбираем complete map, в file name and type выбираем имя и тип файла, size- размер текстуры (ниже 256 лучше не ставить – будет не красиво, если, конечно, объект не мизерный :-))
5. Теперь внимание! Hажимаем unwrap only, к нашему объекту добавится модификатор, выбираем его и нажимаем EDIT file->load – загружаем ранее сохраненный unwrap.
6. Теперь в render to texture жмем render. Он отрендерит текстуру в указанную ранее папку.
7. Теперь в главном окне file->export selected ставим галочку в диалоге и ОК.
Если это уровень, то, по сути, получается, что собрав уровень в максе, мы разделяем его на составные объекты, а в игре вновь составляем. Естественно, в 3ds будет записано расположение объекта относительно центра сцены, так что это надо учесть, ведь в программе в указанное место будет поставлена эта точка.
Все! Теперь у нас есть объект и текстура к нему (кстати такие текстуры удобно обрабатывать в фотошопе, например, добавлять надписи на стены). Данная последовательность, конечно не единственно верная, но она верная!
В некоторых играх тени просчитываются в самой игре, а можно просчитать их в максе, так меньше будет нагрузка на комп, но будет меньше реализма.
Если весь уровень создается в одном максовом файле, то удобно поменять настройки в customize -> grid and snap settings -> home grid – grid spacing = 5.0, perspective view grid extend = xx (поставьте побольше) . А после этого можно использовать snaps toggle для точного перемещения объектов по сцене.
Теперь о программной части работы.
Программирование я решил вести в делфи потому, что я ее хорошо знаю (хотя, конечно, для реально мощных игр предпочтительнее что-то вроде С++, но это реально сложно :-)))
Первым делом, я начал поиск компонентов, упрощающих работу с 3d графикой, т.к. работа со встроенными возможностями Delphi была бы тяжело выполнима ввиду сложного доступа к этим возможностям (по крайней мере, на мой взгляд :)). И был найден ряд таких компонентов, но большинство из них было ограничено в возможностях и потому не давало нужного простора для размышлений. Поэтому была выбрана библиотека под названием GLScene, которая давала возможность доступа ко многим возможностям OpenGl. Взять эту библиотеку можно на сайте www.glscene.org (она является обсолютно бесплатной). Была придумана такая схема проекта (привожу ее просто как пример).
По этой схеме и были созданы основные формы и модули в проекте.
Важным периодом создания был период оптимизации (текстур, моделей и программы) для ускорения работы программы, но на данном этапе проявился недостаток создания приложения, которое создает объекты из файла. Все дело в том, что при создании каждого объекта программа ищет в массиве объектов пути к модели или текстуре, и на это уходит большой объем времени. Как вариант решения было бы создание всех статичных объектов как единого объекта. Но здесь возникает другая проблема – на видеокартах с памятью в 64 Мб максимальное разрешение текстуры – 2024*2024, а если создавать гигантский объект, текстуры нужны, как минимум, в 2 раза большие! Что было неприемлемо, т.к. сейчас много компьютеров, оснащенных, слабыми видеокартами (например, у меня GeForce4MX 440, на новую нет денег :-( ). Из-за этого приходится мириться с невысокой скоростью загрузки.
После создании уровня нужно было создать объекты, с которыми можно было бы взаимодействовать, а значит, создать модуль для обработки скриптов, который учитывался еще на раннем этапе. Ничего необычного здесь не применялось – просто построчное чтение переданного из параметров скрипта (*.txt) и его обработка. Так же было решено для некоторых объектов передавать некоторые параметры вместо скрипта (растения, анимированные объекты и стенки).
Отдельно о стенках (не знал я, как их назвать вот и стали они стенками) – эти объекты невидимы, однако персонаж с ними взаимодействует. Нужны такие предметы, чтобы ограничить пространство перемещения по уровню. Второй областью их применения являются лестницы. Дело в том, что сложно было бы реализовать подъем по ступеням лестниц, так как каждая из них создавала бы препятствие для движения, поэтому персонаж поднимается по наклонной поверхности (ведь на самом деле взаимодействует совсем не персонаж, а невидимая сфера).
После создания программы я создал на ее основе редактор карт, редактор параметров моделей и редактор скриптов. Они были созданы для того, чтобы ускорить и упростить редактирование карт, моделей и скриптов пользователем (советую делать их всем игроделам).
Подробнее о выбранных форматах файлов.
Для простых объектов взяты модели 3DS потому, что они занимают мало места и редактируются большинством 3D редакторов. Также причиной для выбора 3DS послужило то, что в этом формате все объекты сохраняют свое положение относительно глобального центра координат, поэтому я могу создать уровень в 3D Max, и при экспортировании моделей они будут сохранять свое положение относительно друг друга, и не будет необходимости перемещать их в редакторе уровней). Данный способ неприменим к объектам со скриптом pick (скрипт, при помощи которого персонаж поднимает или использует объекты), потому что при обработке данного скрипта должно учитываться расстояние до объекта). Формат моделей MD2 был взят как единственный формат, нормально поддерживаемый в GLScene для анимированных объектов (анимацию из 3DS загрузить мне так и не удалось, хотя, насколько я знаю, это возможно, и если у кого нибудь получится – напишите:) ). Текстуры могут быть как JPG, так и TGA, они были выбраны как наиболее сжатые.
Ну, в принципе, урок я закончил. Надеюсь он вам понравился.
Я решил не напрягать урок скринами из моей игры, их можно посмотреть как мою работу the game.
Вопросы и пожелания по мылу tony89@yandex.ru или по ICQ 297-984-288, но лучше по мылу (в инет я выхожу нечасто).
Более подробно о программировании или моделировании для игр, возможно, будет рассказано в следующем уроке, если, конечно, к уроку будет проявлен интерес :-) , а пока это все.
2005 год