- - Вступление - -
Создавая различные локации, часто сталкиваюсь с ситуацией, когда необходима не целая модель, а какая-либо её часть. Иногда везёт и ненужную часть модели можно скрыть либо в ландшафте, погрузив её полностью, либо за другой моделью так, чтобы всё ненужное скрылось из поля зрения. Но в большинстве ситуаций обойтись малой кровью не получается и приходится искать другие способы. Как раз этими способами я хочу с вами поделится в этой статье. Будет рассмотрено несколько примеров как для более простых моделей, так и более сложных.
- - №1 Редактирование коллизии по координатам вершин - -
Рассмотрим более лёгкий пример используя модель "NVTOPSCasLoRmMid01" из Fallout New Vegas. Для начала нам необходимо извлечь саму модель из файла Meshes.bsa. Можно воспользоваться программой FO3 Archive Utility. Затем эту модель открыть с помощью программы NifSkope. Для начала советую зайти во вкладку "View" и в пункте "Block List" выбрать "Show Blocks In Tree". Так будет удобнее работать. Так же необходимо зайти во вкладку "Render" и поставить галочку напротив "Draw Havok" для отображения коллизии модели (появятся красные линии на модели). Вот что примерно должно получится:
Модель представляет собой центральную часть комнаты с полом и потолком. Нам, к примеру, необходим только потолок. На данном скриншоте в окне "Block List" красным квадратом обведены два блока текстур. Одна для потолка, другая для пола. При нажатии на блок текстур, белая сетка появится на той части модели, за которую данный блок отвечает. Выбираем тот блок текстур, который отвечает за пол и удаляем его. Для этого нажимаем правой клавишей по нем, выбираем "Block" и далее "Remove Branch". Вот что получится:
Как видим текстура пола пропала. Но осталась коллизия. Теперь займемся её редактированием. Для этого нам необходим блок "bhkCollisionObject". Открываем все его вкладки в плоть до самой последней "hkPackedNiTriStripsData". Теперь переходим в окно "Block Details" и ищем вкладку "Vertices", раскрываем её. Вот, что должно получится:
Как мы видим, после открытия вкладки "Vertices", в узлах коллизии появились белые точки (вершины), а в открывшемся подменю вкладки "Vertices" появилось 8 строк с координатами, которые описывают положение в пространстве каждой из 8 вершин. Двойное нажатие по строке координат позволяет её редактировать. Интересует нас координата Z (отвечает за высоту вершины). Убрать коллизию пола не получится, мы можем лишь переместить её так, чтобы она не мешала. В данном случае, лучший вариант это задать такие же координаты, как и у вершин потолка, чтобы две коллизии совпали. Поэтому нам необходимо скопировать координату Z вершины потолка и вставить её значение в координаты узлов пола. Вот что получится:
Как видно, изменив координату Z одной из вершин пола, она совпала с одной из вершин потолка. Проделываем тоже самое с оставшимися тремя вершинами. Вот что получиться:
Коллизия пола совпала с коллизией потолка и теперь она не будет мешать. Модель можно использовать где угодно.
Редактирование более сложных моделей отличается лишь тем, что у них используется больше вершин в коллизии. Всё остальное абсолютно аналогично. Чтобы найти необходимую строку, отвечающую за координаты вершины, необходимо по-очереди пролистать каждую строку во вкладке "Vertices", при этом соответствующая вершина будет подсвечена желтым цветом в окне просмотра, так что не пропустите.
- - №2 Редактирование модели по координатам вершин - -
Для примера возьмем модель "DLC04MHall1Way01" из Fallout 3 (DLC Point Lookout). Извлекаем её из архива и открываем в NifSkope, вот что должно получится (советую на время отключить отображение коллизии на модели, чтобы не мешала):
На скриншоте выделено два блока текстур: один отвечает за текстуры самой модели, второй - за деколи, которые накладываются на модель (царапины, сколы, следы от пуль и т.д.). Советую текстурный блок деколей также удалить, чтобы не мешал. Далее раскрываем вкладку оставшегося текстурного блока "NiTriStrips" и нажимаем на вкладку "NiTriStripsData". Теперь переходим в окно "Block Details" и ищем вкладку "Vertices", раскрываем её. Вот, что должно получится:
Как видно со скриншота, на модели появились белые точки. Эти точки соответствуют вершинам модели. Теперь самое главное: способ редактирования самой модели ничем не отличается от способа редактирования коллизии - те же самые вершины, те же самые координаты. Выбирая нужную вершину во вкладке "Vertices" вы изменяете её координаты, что ведет к изменению самой модели. Например, сделаем данный участок коридора наклонным. Для этого уменьшим на 40 единиц координату "Z" (высота) вершин, которые находятся ближе к нам. Вот что должно получится после редактирования:
Теперь горизонтальный участок коридора стал наклонным. Можно обратно включить отображение коллизии и подогнать её под новую модель следуя алгоритму способа №1.
Примечание: размерность единиц координат в NifSkope соответствует размерности координат в GECK. То есть, если в данном примере мы опустили одну сторону модели на 40 единиц, то модели в GECK, которые будут стыковаться с этой стороной, также будут располагаться на 40 единиц ниже.
- - №3 Добавление нового текстурного блока к модели - -
Допустим имеется модель "DLC04MRoomDarkWall01" из Fallout 3 (DLC Point Lookout)., которая выглядит вот так:
После некоторых манипуляций вот что получилось (не обращайте внимание на коллизию, она тут роли не играет):
Были удалены текстурные блоки потолка и пола, текстурный блок деколи. Также уменьшена высота стены и она поднята таким образом, чтобы верх стены совпал с верхним молдингом. Осталось только каким-то образом поднять порожек до уровня нижней части стены, чтобы модель получилась целая. Но поскольку верхний молдинг и порожек являются частями одного текстурного блока, то двигать их относительно друг-друга сложно (можно использовать способ №2, но об этом далее). Для этого поступим по-другому: откроем в новом окне NifSkope точно такую же модель стены (не закрывая старую), только с другой текстурой, например "DLC04MRoomPlainWall01". Найдем в ней блок текстур, который отвечает за верхний молдинг и порожек и скопируем его в нашу первую модель. Для этого в окне второй модели, в "Block List" нажмите правой клавишей по блоку текстур "NiTriStrips" → "Block" → "Copy Branch", затем вернитесь к первой модели и в "Block List" правой клавишей "Block" → "Paste Branch" вставьте блок текстур. Вот что должно получится после вставки и поднятия порожка до уровня нижнего края стены:
На скриншоте видно, что в "Block List" стало на один блок текстур больше, который мы скопировали. Оставшиеся части будут скрыты, а коллизию можно отредактировать по способу №1.
Примечания:
1) Почему нельзя было не используя вторую модель, взять и скопировать блок из первой и тут же его вставить?
Эта идея пришла в голову с самого начала. После копирования новый блок текстур появляется в "Block List" и отображается в окне просмотра. Но при добавлении модели в GECK или тестировании в самой игре новый блок не отображался, не было никаких изменений. Связано это, скорее всего с тем, что после копирования оба блока текстур имеют одну и ту же "NiTriStripsData", из-за этого игра воспринимает только тот блок, который был раньше создан. Поэтому и нужна другая модель, хоть сами по-себе они одинаковые - чтобы "NiTriStripsData" у блоков отличались.
2) Почему не лучше было бы воспользоваться способом №2 - изменить координаты порожка так, чтобы он совпал с нижним краем стены?
Способ №2 немного сложнее, более муторный, но у кого есть терпение тот может спокойно им пользоваться. Вторым способом придется пользоваться тогда, когда какая-то модель окажется единственной в своем роде и просто неоткуда будет скопировать нужный блок текстур.
- - Заключение - -
№1
Редактирование коллизии по координатам вершин довольно не сложное и заключается лишь в поиске нужных вершин и изменению их координат. В примере показан способ "сведения" двух коллизий в одну, так как ставил перед собой задачу сделать так, чтобы лишняя коллизия не мешала. Вы же можете делать с коллизией всё что пожелаете, всё на что у вас хватит фантазии.
№2
Редактирование модели аналогично редактированию её коллизии. Способ позволяет из простой модели сделать более сложную и замысловатую, например, добавить выступы, ниши, изменить наклон. Большое количество точек возможно и усложняет редактирование, но дает большую степень свободы. Единственным сложным здесь будет только то, что перед редактированием необходимо прикинуть как модель будет выглядеть, возможно даже выполнить некоторые расчеты координат. Если коллизию можно подогнать "на глаз", то с каркасом модели такое не пройдет.
№3
Данный способ необходим для того, чтобы из нескольких частей сделать одну модель, а затем, размещая модели в самом GECK, не тратит время на отдельные части - стену, порожек, верхний молдинг, еще какие-то элементы (в данном случае). Если моделей много, то разница еще более заметна - расположить одну модель или 5-6 её частей.
- - P.S. - -
Статья обновлена. Остались еще некоторые способы, которые я хочу проверить. Если всё получится - обязательно добавлю в эту статью, может кому пригодится.