Max Payne: Примеры создания собственных скайбоксов

» Раздел: Max Payne II: Моддинг
  • Часть1. Создание простого скайбокса для игры "Max Payne 2" за авторством Sayantan (Satan) Biswas. (вольный перевод - Iron Fred).
  • Часть2. Создание анимированного скайбокса для "Max Payne 2". автор - Iron Fred. (отдельное спасибо - Hancock и zzzGERTzzz).

Часть 1. Простое небо.

Тутор написан по примеру модера Satan'а, (делавшего скайбокс для мода "Новый рассвет"), но в моей вольной интерпретации, ибо тот был написан на английском. Данный труд описывал создание простого скайбокса для игры Max Payne, и человек жаловался, что не выходит сделать анимированный.
Здесь мы с вами рассмотрим оба вар-та, сначала простой, потом сложный. Попутно рассмотрим вар-ты внесения разных деталей, улучшающих вид игрового скайбокса.
[Заметка!] Мой перевод содержит только самое необходимое для создания простого скайбокса, некоторые особенности я счел нужным выкинуть, так как каждый волен сам поэкспериментировать при создании с теми или иными примочками. Например, я выкинул добавление небу additive reflection, так как это, имхо, уже излишество.
Создать сферу диаметром 200м. Кол-во сегментов - 32.
Трансформировать ее в "Edit mesh" и, в режиме редактирования полигонов, выделить у нее нижнюю часть, как на скрине ниже.



Удалить эту часть.
Выделить все оставшиеся полики и флипнуть им нормали наизнанку (чтоб внутрь смотрели). Скрин ниже.
Создать плоскость имитирующую пол, (хотя это кому как нравится), у Ремеди, например, просто все нижние вершины сферы коллапсированы в одну точку.
Данная плоскость должна чуть выступать за стенки полусферы небосвода, чтоб не было видно краев.










Далее, нужно сплющить небесную полусферу для большей реальности. Для этого я зажал инструмент "скейл" и выбрал его вар-нт "Non-uniform Scale" (см скрин).
Этот инструмент нужен для равномерного неодинакового сплющивания.
Сплющить полусферу в подобие блина и выровнять оба объекта в нулевой точке координат.









Теперь - опустить плоскость пола немного ниже нулевой точки. Пол должен находиться несколько ниже Гг в игре, ведь сам скайбокс привязывается к нему.
Можно приступать к текстурированию.
Текстурирование.

Нажмите "М", откроется редактор материалов. Переименуйте первый из списка в, например "Sky" и выберите "KF Material", ведь *.KF2 формат использует только его.

[Заметка!] Понятное дело, что плагины, необходимые для работы с этим форматом уже должны быть у вас установлены. Они поставляются в комплекте с редактором "MaxED", и о том как их ставить подробно рассказано, например, в туторах "Игромании", здесь я об этом писать не буду.
В качестве диффузной текстуры выберите "KF Texture" и текстуру вашей панорамы скайлайна. К слову сказать, вполне юзабельны доработанные в фотошопе панорамные фото, выгугленные из интернета, с охватом в 360 градусов и пережатые вами в *.DDS формат. Лучше всего сжимать в DXT5, но если и он сильно портит четкость сжатием, можно использовать 32bit ARGB, он конечно тяжеловат (ибо видимо вообще не ужимает), но учитывая мощности современных ПК, это лишь капля в море.
[Заметка!] Текстуры должны лежать строго в папке "Textures", которая может находиться только по адресу:
Директория редактируемой игры "MaxPayne2Dev"\Game\data\database\worldspheres\files\textures, либо, если под свое небо вы создали свою папку - в этой папке.

Переименуйте имя диффузной текстуры в, например "Skyline" (можно и не делать этого, я поступаю так всегда для того, чтобы потом было проще редактировать в хексе).
Вернуться в корневую директорию материала удобно с кнопки "Go To Parent", выделенной на скрине ниже кружком.










Напротив пункта "Diffuse" (см скрин ниже), в "кармане" выбрать "None", так как небо является объектом, который не взаимодействует с освещением игровых карт.
Для "пола" скайбокса можно использовать отдельный материал с текстурой, настройки его сделать аналогично, я, в целях экономии времени заюзаю один и тот же материал. Ведь самый низ текстуры скайлайна может иметь полосу того-же черного цвета (имитируя пропасть, а, напр, серый - имитирует туман и дым). Присвойте данный материал вашим мешам и включите его отображение на объектах, для этого в свойствах текстуры диффуза нужно врубить "Show map in viewport" (либо в разделе material, либо нажать кнопку - "клетчатый кубик", как на скрине ниже).
Покрываем текстурой объект.

Для того, чтобы наблюдать свой результат в действии, создайте внутри своего неба камеру. Перед экспортом эту камеру нужно будет удалить за ненадобностью!
В свитке "Create" (справа от вьюпортов макса) выберите иконку "Cameras" и кнопку "Free". Создайте свободную камеру внутри своего небосвода. (см скрины)
В любом удобном вам окне наведите на верхний левый угол и, щелкнув правой кнопкой мыши, откройте контекстное меню, где в пункте "Views", выберите "Camera 01",
(если вы зачем-то переименовывали камеру, то там добавится оное имя вашей камеры, кликните на него). В выбранном окне вьюпорта будет вид изнутри вашего неба.
Теперь вам будет удобно осматривать правильность наложения текстур на меши, смоделировав таким образом вид от первого лица в игре.
Выбираем нашу полусферу-шапку, называем ее например "Skyline_mesh", в свитке "Modifier list" выбираем "UVW Map", как на скрине ниже.
Теперь выберите в параметрах "Shrink Wrap" и поколдуйте над кол-вом "плиток" (U, W и V Tile), меня устроила цифра "3". Нажатие кнопки "reset" сделает вашу сферу наложения по контурам меша небосвода. Короче, можно добиться вполне приемлемого результата. Но если данный модификатор не устроил вас полученным результатом, то нажмите на нем правой кнопкой мыши и выберите пункт "collaps to", после чего в свитке выберите модификатор "Unwrap UVW" и подредактируйте наложение текстуры в нем так, как вам понравится. Описывать подробно сей процесс я здесь не буду, так как это сильно раздует данный тутор, если не умеете работать с анврапом - погуглите в поисках соответ-его тутора, научитесь, и будет вам счастье.
У вас должно получиться что-то наподобие скрина ниже. Только текстуры в фотошопе получше отредактируйте, чтобы не было таких кривых облаков как у меня.
Экспорт простого скайбокса.

Еще раз напомню: Перед экспортом, камеру, созданную внутри скайбокса, нужно удалить!
Заходим в File\Export, выбираем "KF Exporter" и папку, где будет находиться новый скайбокс (в этой папке должна быть обязательно папка "textures", содержащая текстуры данного неба, у меня это: MaxPayne2Dev"\Game\data\database\worldspheres\files\textures), назовите как-то этот новый скайбокс, например "Daylight" (дневное).
Экспортируйте с галками как на скрине ниже.











Добавление в игру.
  • Добавляется скайбокс вписыванием в текстовик Worldspheres.txt аналогично всем прочим скайбоксам по умолчанию, либо можно заменить любой не нужный стандартный.
  • Выбрать для нужной карты его нужно в параметрах уровня в levels.txt в графе WorldSphere. Вписать его название.
Теперь в игре получится простое статическое небо, на вроде показанного ниже.

Часть 2. Анимированное небо.

Теперь рассмотрим усложнение нашего простого неба и анимируем некоторые его элементы.
Добавим новый материал в редактор материалов (горячая клавиша - "М"). Это будет не прозрачная текстура небесного свода, который будет распологаться выше облаков. Самое простое, это сделать крошечную текстурку залитую однотонным синим цветом, этого достаточно для имитации чистого небосвода над облаками. Если подойти к делу более творчески - сделать хотяб 1024x1024 с россыпью перистых облаков в проекции снизу вверх, а не сбоку, как у скайлайна. Фоток в сети - как грязи. Настроим новый материал аналогично тому, как уже делали в первой части. Проще можно взять и драгэндропнуть соседний материал на пустой, а потом редактнуть его.
Теперь вернемся к ранее созданному небосводу. В режиме редактирования полигонов, выделим его почти весь, начиная сверху, оставив не выделенным только самый нижний ряд полигонов. Зажав Shift, оттянем это дело вверх. Вы увидите, что "шапка" скопировалась и макс просит определить, будет ли это отдельным объектом или частью прежнего меша-небосвода. Выбираем - отдельным объектом и даем ему название, например, "Skytop". Инструментом "Scale" сделаем оный скайтоп побольше размером.

! Можно, кстати, сразу сделать это копирование скейлом, а не оттягивать.


Скроем созданный ранее небосвод, выбрав его правой кнопкой мыши и нажав в конт-ом меню "hide selection". Займемся новым небосводом. Надо сказать, что разработчики Макса Пейна 2 не стали себя утруждать созданием двух уровневого неба, а просто сделали непрозрачными облака. Не знаю как кому, а мне такое небо кажется несколько "давящим". Двухуровневое небо должно правильнее передавать глубину, при взгляде на него должно появиться чувство некой пространственности. Именно по этой причине я решил усложнить эту задачу.
Присваиваем новой шапке новый материал. Применяем к мешу модификатор "Unwrap UWV", вибираем тип маппинга - "Normal mapping", а в нем - "Top/bottom mapping". Теперь текстура ляжет на шапку правильно. См ниже.

"Шапка" верхнего неба готова. Скрываем ее (hide selection) и снова анхайдим старую шапку - "скайлайн" (правой кнопкой мыши в любом месте -> Unhide by name -> выбрать спрятанный ранее меш скайлайна). Если заранее известно, где точно будет 100% альфа прозрачность, можно отчекрыжить не нужные скайлайну, лишние полигоны. Выбрать их в соответствующем режиме редакт-ния и удалить. Однако не следует увлекаться, как с удалением, так и с прозрачностью неба скайлайна, если сильно занизить скайлайн при помощи альфы, пропадет желаемый эффект пространства. Я вообще удалил только саму круглую "крышку" меша.



Теперь перенастроим материал скайлайна так, чтобы он правильно и плавно отображал альфа-переход в шапку-скайтоп. Ставим в базовых параметрах напротив "Diffuse" - "Gouraud", затем ниже ставим галку на "Alpha Compare" и "Edge Blend", "Reference Value" можно поставить либо единицу, либо вообще нулевую. Смотрите скрин.









Теперь, если сделать проверочный экспорт, все должно отображаться как нужно. При этом сразу бросится в глаза глубина небосвода, которой не было в обычном "Макс Пейн 2".
Создание анимированных облаков.

Теперь создадим ползущие по небу облака или тучи (еще это может быть туман, дым от взрывов, пожаров и тд...)
Добавим в папку с текстурами нашего неба текстуру облаков.
[Заметка!] Текстура облаков должна быть тайловая, то есть с плавными бесшовными переходами в свои повторения. Каждое такое повторение данной текстуры на объекте и называется плиткой или тайлом (от анг слова tile - секция, плитка).
Внимание! Она не должна иметь альфа канал прозрачности. Чуть больше терпения, и вы узнаете почему. ;)
Создадим новый материал для облаков, драгэндропнем тот, что у нас без альфы (тот, что для небосвода делали), выберем в нем нашу текстуру.
Спрячем мешающийся пол скайбокса, оставим в сцене только скайлайн. Создадим новую плоскость с количеством сегментов, например, как на скрине ниже. Я взял семь сегментов в ширину, чего вполне хватило для загибания плоскости облаков аркой. Ну а сильно длинной плоскость делать не стоит, достаточно расчитать длину всего на одно смещение (тайл), анимация будет незаметно возвращать плоскость на первый кадр (фрейм) в бесконечном цикле. Покройте арку облаков новым материалом.
[Заметка!] Плоскость облаков должна достаточно нависать над основным небом со всех сторон, это, думаю понятно каждому. Ее края не должны быть видимы в игре.


В режиме редакт-ия полигонов выворачиваем нормали поликов так, чтобы они смотрели вниз (если вы сразу не создали плоскость нормалями к низу). Напомню, это делается в свитке модификатора в самом низу перед группами сглаживания, в разделе Surface properties\Normals. После выделения поликов, нажать кнопку Flip. К плоскости облаков применяем модификатор "UWV Map" с параметром "Planar" (плоскость). Далее нужно определиться, сколько плиток "U Tile" и "V Tile" у вас будет повторяться. Здесь сразу отмечу, если сильно сплющите тайлы текстуры по направлению движения облаков, то в игре будет смотреться мягко скажем, плохо. Пусть лучше облака будут чуть растянуты как-бы ветром.



Приступим к анимированию.

Настроим временной конфиг (Time Configuration), жмем оную кнопку внизу справа (см. скрин).
Настраиваем скорость проплывания облаков. Например я использовал 48 FPS и уложился в 6 300 фреймов, что мне и было нужно для медленного движения. Поколдуйте с этими настройками для получения нужного вам результата.
Врубим теперь Set Key Mode


Полоса таймлайн станет зеленой.


Перед тем, как начать непосредственно анимировать, назначим данному мешу (будущим облакам) контроллер, который обеспечит равномерно плавное движение. Стоящий по умолчанию "Position XYZ" для данной операции подходит плохо, так как скорость с ним не равномерна (облака то ускоряются, то очень медленно плывут, вплоть до короткой остановки на моменте циклического перехода в начало).
Жмем на кнопку "Mini Curve Editor" в левом нижнем углу макса, чтобы вызвать редактор кривых. См. скрин ниже. Выбираем пункт "Position", и нажав на нем ПКМ, выбираем в контекст меню - "Assign Controller". Выпадет окошко, в котором назначим нашему мешу контроллер "Linear Position", он должен обеспечить то самое, равномерное движение.
Жмем "OK".
Другой способ назначить контроллер более простой и не требует юза редактора кривых (который мне более привычен). Нужно в свитке "Motion" (на правой панели инструментов), раскрыть вкладку "Assign Controller", выбрать "Position" и нажать на кнопку в виде книжки с вопросом (см. скрин). Выбрать там нужный "Linear Position" и нажать "OK".
Установим ползунок в самом начале линии таймлайна, на нулевом фрейме. Жмем "Set Key" (большую квадратную кнопку с изображением ключа)
Первый ключ готов. Теперь передвинем ползунок на самый конец полосы, на последний фрейм. Выберем наш меш с облаками и передвинем его так, чтобы рисунок облаков повторился своим вторым тайлом. Удобнее всего тут прицеливаться по клеткам "Grid" окна с видом "Bottom". Старайтесь быть точнее. Снова жмем "Set Key" и ставим последний ключ анимации.

Все готово! Нажатие кнопки "Play Animation" включит воспроизведение вашей только что созданной анимации.
Создание второго слоя небосвода, статического.

Однако получившийся скайбокс еще не раскроет полностью своей красоты. Нижние облака не прозрачны и верхнего небосвода видно не будет. Поправим это дело.
Жмем на любом месте любого окна ПКМ и выбераем "Unhide All", все ранее спрятанное появится. Нам нужен ранее созданный небосвод-шапка. Каким образом будет отображаться он, просвечиваясь сквозь дымку облаков (либо туч, дыма и тд...)? Если сделать полупрозрачным сами облака - станут видны прямоугольные края их меша, что сразу изуродует всю картину. Такова уж особенность движка. Сделаем "ход конем". Пусть полупрозрачным станет сам верхний небосвод-шапка, ведь нет разницы, что и через что будет просвечивать. Снизу будет видно все именно так, как это нужно. ;)
Доработаем текстуру небосвода, снабдим ее альфа-каналом прозрачности. Так как текстурная развертка "шапки" круглая (см. 2й скрин в начале 2й части), то нужно сделать альфу прозрачной по углам, с плавным переходом в полупрозрачную окружность в центре. Я сделал это в фотошопе. Для начала я сдублировал базовый слой с облаками и обесцветил его. Потом нарисовал контур круга из центра, сделал обводку черным цветом большой кистью с легким нажимом и закрасил сплошным черным все что вне круга. Скопировал полученную картинку в добавленный канал прозрачности и сделал ее потемнее (чтобы небосвод не сильно просвечивался и не превратил облака в совсем прозрачную дымку). Получилось примерно так, как на скрине ниже, но позднее я затемнил еще сильнее (в почти черный) и убавил контрасности. Мне понадобилось сделать нижним облакам менее прозрачный вид.
После этого нужно настроить материал небосвода точно так-же, как до этого настраивали материал для скайлайна.
Экспортировать анимированный скайлайн нужно с галками на: "Loop when finished" (циклическая анимация), "Geometry", "Animation", "Materials" и "Environment". Пример на скрине ниже.
Внимание! Галку с "Re-Scale" не снимать и значение 0,01 под этим пунктом не трогать, ничего хорошего, в случае чего, из этого не выйдет. :)
Теперь у нас готов свой скайлайн с анимир-ными нижними облаками и легкой имитацией пространственности небосвода полупрозрачным вторым слоем верхних облаков (либо это может быть просто чистое небо). Что получилось у меня - см. на скрине ниже.
Архив с примером (для 3D Max 5.1) тут
Теперь "ложка дегтя": К сожалению подобный метод исключает создание полностью не прозрачных облаков с просветами небосвода между ними, во всяком случае вменяемого подобного результата я так пока и не получил. Я пробовал делать прозрачными сами нижние облака, но у меня получалась только очень грубая, однобитная прозрачность. Может у кого-нибудь в дальнейшем и получится что-то более хорошее, а может чем проще - тем лучше, решать вам.
И еще добавлю, что если убавить разрешение текстур в настройках игры хотя-бы до среднего уровня, она может крашиться с ошибкой, ссылаясь на мип-мапы.
Все текстуры скайбоксов в Max Payne 2, по умолчанию, мип-мапов не содержат! А учитывая мощности современного железа, убавлять разрешение текстур дело не совсем разумное.
Итак, подобный метод позволяет создавать свои скайбоксы, и они могут быть анимированы точно так же, как это делали разработчики игры "Max Payne 2", более того, можно создавать дополнительные полупрозрачные детали и дополнять ими свои скайбоксы. Здесь приведен пример дополнительного просвечивающегося небосвода, но можно сделать и другие вещи, навроде отдельных, медленно текущих облаков в периферийной области, либо вообще анимировать дополнительные боковые меши окружения с проносящимися мимо лесами-полями и использовать, например, на картах с движущимся поездом. (Сам поезд оставить статичным, в силу малобаговости этого способа, а скайлайн будет имитировать его движение). Простор для фантазии есть.

На этом у меня все. Спасибо за то, что прочитали данные туториалы. Отдельное спасибо: Satan, за первую часть тутора. Hancock - за помощь в моем освоении анимирования скайбоксов и за разъяснение некоторых деталей. zzzGERTzzz - за его "Статью по созданию собственных skybox'ов" на XGM форуме, в ней тоже были пара советов по созданию.
Свои вопросы прошу писать по адресу: (Fred.MF@mail.ru), либо на XGM форуме (www.xgm.ru/forum) в разделе “Max Payne”, в теме ”Вопросы”.


Views: 4 207

Iron Fred #1 - 6 years ago 0
Голосов: +0 / -0
В связи с тем, что старый проект Mortal Fury (MF) давно скончался, на мыло Fred.MF@mail.ru просьба ничего не писать. Ответов не будет.