Max Payne: Создание объектов

Содержание:
Объекты создаются точно так же, как и комнаты. Начнем с простейшего объекта – ящика. Перейдите в режим F3, выровняйте секту вдоль пола и создайте меш нужного размера. Что-то не особо похоже на ящик, верно? Дело в том, что по умолчанию все новые меши создаются с полигонами, повернутыми внутрь. Давайте вывернем их наружу. Наведите курсор в F4 на любой полигон ящика и нажмите Ctrl+F (СКМ -> Flip Normals). Ящик принял вменяемый вид.
Добавим ящику немного деталей, например, доски по краям. Выровняйте сетку вдоль одной из сторон ящика и сделайте одну доску. Помните, что иногда удобнее поднимать или опускать полигоны уже созданного объекта, нежели пытаться с первого раза сделать необходимый объект. Подровняйте текстуру если нужно.
Одна доска есть, нам нужно еще 7. Если все их делать с нуля, то на это ушло бы много времени. Лучше раскопируем ту, что есть. Выделите ее и нажмите Ctrl+C и сразу же Ctrl+V. У нас две одинаковые доски в одном и том же месте, причем одна из них выделена. Переместите ее на другой край. Точно так же копируются любые объекты.
Одна сторона ящика сделана. Займемся соседней. Нажмите Ctrl+V еще раз. Подвиньте появившуюся доску так, как показано на скриншоте. Теперь нужно ее повернуть (см. здесь) и скопировать так же как и на первой стороне.
Наш ящик – это симметричный объект. Для симметричных объектов удобно использовать операцию отражения (F5 СКМ -> Mirror Selection или M). При этом объект отражается относительно сетки. Опробуем этот инструмент. Выровняйте сетку вдоль одной из граней ящика, установите размер сетки так, чтобы перемещая ее вверх и вниз (PgUp и PgDn в режиме F12) можно было бы поместить ее точно посередине ящика. Теперь выделите обе доски зажав Ctrl, скопируйте+вставьте и нажмите М. Доски переместились на противоположную сторону. Проделайте то же самое с оставшейся стороной (кстати, конкретно в нашем случае можно было обойтись всего одной операцией отражения, если изначально расположить сетку по диагонали ящика и скопировать все 4 имеющихся доски)
Давайте добавим еще и диагональные доски, но сохраним такую же ширину, как у боковых. Это можно сделать двумя способами: повернуть на нужный угол сетку (в текущем положении сложно подобрать подходящий размер ячейки) и нарисовать новый меш, либо скопировать и повернуть одну из существующих досок. Если доска не полностью касается боковых, то удлините ее (F4 - DownArrow на торцевых полигонах).
Стало быть, у нас есть доска с выступающими краями. А давайте их просто обрежем? Выровняйте сетку вдоль плоскости резания, выделите разрезаемый объект (в нашем случае диагональную доску) и не уходя из F5 нажмите Y (СКМ -> Split Object). "Do you really want to split?" - отвечайте OK, и все – объект разделен на два. Огрызок можете выкинуть. Хотя иногда бывают нужны обе половинки.
Можно было повернуть торцевые полигоны на 45 градусов и подогнать длину доски. Но после поворота край доски перестает совпадать с сеткой, и скорее всего, придется работать с очень маленькими значениями сетки и при большом приближении (напомню, что скорость камеры изменяется Ctrl + [Num+] / [Num-]). Вообще, поворот чреват отклонениями от "точных" сеточных расстояний. Всегда следите, вокруг какой вершины вы вращаете.
Итак, геометрия ящика готова. Для удобства стоит сгруппировать все доски к основному кубу ящика (группировка описана в первой главе) и переименовать этот родительский куб, например в "Box". Лично я рекомендую давать имена часто используемым объектам. И обязательно именовать динамические объекты, иначе в скриптах будет неразбериха.
Теперь выделите наш ящик с дочерними объектами и зайдите в свойства. Менять нам пока ничего не придется, просто рассмотрим, что предлагает на MaxEd. Пойдем по порядку:
Name – имя объекта; недоступно когда выделено несколько объектов.
Exclude from Game – правильнее было бы назвать этот параметр exclude from export – объекты с таким параметром просто не попадают в ldb-уровень при экспорте. Обычно используется для невидимых источников света. В окне иерархии объект приобретает красный крестик.
Exclude from Lighting – см. главу Освещение.
Enable Export Regrouping – не используется.
Gameplay Critical – кроме Output Filter нигде не используется.
Cast No Shadows и Ray Tracing – см. главу Освещение
Collisions – общий параметр для физических взаимодействий.
Bullet Collisions – если отключен, то пули проходят сквозь объект.
Character Collisions – если отключен, то персонажи проходят сквозь объект.
Generate Bounding Box Hull – когда вы наводите в F5 курсор на объект, то его окружает зеленый каркас. При включении этого параметра каркас будет виден постоянно.
Do Not Render – объект не отображается в игре, но сохраняет все остальные свойства.
Помните, что от этих свойств может зависеть отображение объектов в редакторе. Чтобы их исчезновение или появление не стало для Вас неожиданностью, проверьте Output Filter (F1). Могу еще отметить, что включение Exclude from Game равносильно Collisions off + Do Not Render on. Обратите внимание, что эти физические свойства не делают объект физическим, в том смысле, что его нельзя например, пнуть и он отлетит. О создании физическим объектов подробно рассказано здесь .

Префабы

Немаловажная часть MaxEd – это префабы (prefabs). Префаб – это некая группа объектов, сохраняемая в отдельном файле. Обычно используется для повторяемых объектов. Давайте сделаем префаб из нашего ящика. Создайте новый объект (не меш) так же, как создавали их в первой главе (F3: N). Выберите тип Prefab Parent (далее PrP) – это "корень" префаба. В него группируются все объекты, которые вы хотите поместить в префаб. PrP обозначается розовой сферой, радиус который указывается в его свойствах. Поместить PrP можно в любую точку, но учтите, что при вставке префаба из файла в указанную точку сетки попадает именно PrP. Если объект, например, стоит на полу, то логично там же расположить и PrP.
После переноса всех нужных объектов в PrP стоит задать ему понятное имя, т.к. оно отображается в иерархии. А то когда у Вас много префабов, да еще и разных типов, разгребать кучи файлов с именами типа prefab_№ не очень-то удобно. Теперь зайдите в F5 СКМ -> Prefab -> Save As и сохраните его в виде файла. Префаб готов.
Посмотрим, как добавляются на уровень уже готовые префабы. Наведите в F3 курсор на предполагаемое место нового префаба и нажмите P (СКМ -> Place Prefab). Откроется список доступных префабов. Он составляется автоматически в зависимости от наличия префабов на уровне. В нашем случае там только один ящик; если хотите добавить префаб, которого на уровне еще нет, нажмите Add.
Обратите внимание, что наш префаб закрыт (значок в виде замка в иерархии) – закрытие происходит при сохранении. Редактировать закрытый префаб нельзя, сначала надо его открыть: F5 СКМ -> Prefab -> Edit This. Когда вы отредактировали один префаб и хотите, чтобы остальные тоже обновились соответствующим образом, используйте F5 СКМ -> Prefab -> Save And Refresh. Файл будет перезаписан, а префабы – загружены заново. Отменить редактирование и снова закрыть префаб можно через F5 СКМ -> Prefab -> Refresh This.
Можно превратить объекты префаба в обычные меши, то есть разорвать связь с файлом. Это полезно в случаях, когда один или малое количество префабов должны отличаться от других. Для удаления корня префаба служит команда F5 СКМ -> Prefab -> Remove Prefab.

Буферная зона физических взаимодействий

Если Вы уже прочитали в статье по скриптам, как делать физические объекты, то могли заметить, что объект взаимодействует не точно по своему контуру, а на небольшом расстоянии. Зеленый контур при выделении в F5 – это оно и есть, это так называема буферная зона (buffer area), равная 5 см. Вообще, это сделано для оптимизации, но иногда это слишком заметно и мешает, например, когда объекты сложены в стопку.
Для "устранения" буферной зоны есть следующий прием. Делается дополнительный объект (физическая модель), на 5 см меньший чем основной. В случае с коробкой можно просто скопировать ее и опустить все полигоны на 5 см. Кстати, изначально такого размера сетки нет, нужно добавить значение 0.05 в Main Menu -> Document Preferences -> Grid Scale Steps. Физическая модель размещается "внутри" объекта и группируется в него. Свойства этих двух мешей показаны на скриншоте; "Shape" – это основной объект, а "Collision" – его физическая модель. Обращаю ваше внимание, что для Shape наличие затемненных галочек обязательно – в данном случае они показывают, что дочерние объекты Shape могут иметь физические свойства. Могут возникнуть проблемы с деколями (дырки от выстрелов и.т.д.), так как на пули реагирует физическая модель, а отображаться деколи они должны на главном объекте. В таком случае поставьте еще No Decals в свойствах основного объекта.
Динамические объекты не могут иметь "вогнутую" форму, например в форме буквы L. При экспорте они приводят к ошибке "<имя меша>: object is concave or flipped". Такие сложные объекты должны составляться из простых. То есть, один меш объекта делается динамическим, а остальные, статические, группируются в него. Есть и другой вариант - поставить в свойствах объекта Generate Convex Hull. Но в этом случае "вогнутые" части объекта охватываются невидимым барьером; деколи на этом барьере не отображаются.
Часто разделение объекта на "форму" и "физику" используется для оптимизации объектов сложной формы. Физическая модель при этом делается проще по форме, чем основной объект.

Открытые пространства и Skybox

Создание открытых пространств здесь немного не в тему, но они создаются слишком просто, чтобы оформлять такую тему отдельной главой. Стало быть, для отображения неба служит категория skybox. Полигоны, покрытые этой текстурой, в игре не видны; вместо этого сквозь нее просвечивает окружение (worldsphere). То есть, для создания уличных карт нужно просто сделать большую комнату, охватывающую весь Ваш уровень и покрыть ее текстурой skybox.
Тип окружения записан в levels.txt (строка WorldSphere). Посмотреть сами картинки окружений можно в папке C:\MaxPayne2Dev\Game\data\database\worldspheres\files\textures, но в levels.txt используется не имя файла, а сопоставленное ему имя окружения из C:\MaxPayne2Dev\Game\data\database\worldspheres\worldspheres.txt.

Теперь вкратце о вещах, о которых я еще не упомянул.

Есть интересный способ преобразования объектов – масштабирование. Выделите объект в F5 и нажмите C (СКМ -> Mesh Manipulation -> Scale Selected Objects). Вы можете сохранить исходные пропорции объекта, или указать индивидуальный коэффициент для каждой. Заметьте, что текстура при этом тоже масштабируется.
Можно создавать плоские объекты, или "спрайты" – плакаты, мусор на полу, растения и.т.д. Спрайт делается так же, как обычный меш, только замыкается не ПКМ, а Shift+ПКМ. Если спрайт находится на каком-нибудь полигоне, то чтобы избежать мигания, его текстура должна принадлежать к категории graffiti. Как и любой полигон, спрайт имеет лицевую и тыльную стороны (меняются в F4 - Ctrl+F). Чтобы сделать спрайт видимым с обеих сторон (если это, к примеру, решетка забора), нужно поставить в свойствах его текстуры Dualsided. Спрайт не может быть физическим объектом – при экспорте выдается ошибка "some vertices used less than three times".
Аналогично мешам, полигоны можно разрезать по сетке и объединять. Например, разделять, если Вам нужно покрыть одну грань объекта разными текстурами, или объединять, если вы объединили два меша. Делается это в F4: разделение кнопкой S (СКМ -> Split Active Polygon By Grid), а объединение – кнопкой J (СКМ -> Join Polygons).
Когда у Вас много объектов и редактор начинает подтормаживать, или некоторые объекты мешают обзору, их можно скрыть. Выделите объект и не уходя из F5 нажмите H (СКМ -> Hiding -> Hide Selection). Чтобы вернуть показ объектов, нажмите Shift+H (СКМ -> Hiding -> Unhide Selection). Скрывать можно как в окне строительства, так и в иерархии. Скрытые объекты обозначаются там тонким шрифтом.


Views: 5 846

Комментарии пока отсутcтвуют.