Что такое meshes в играх

Unity: процедурное редактирование Mesh

Преобразование моделей «на лету» — нередкая практика в симуляции физики деформаций, а также в играх с динамически генерируемым и изменяемым контентом. В таких случаях удобно применять методы процедурного редактирования и создания геометрии. Последние часто позволяют сэкономить заветные байты при передаче подгружаемых из сети данных. Кроме того — это весело!

Статья направлена на прокачку навыков процедурной обработки мешей в Unity. Мы расскажем об операциях преобразования и генерации частей меша.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Наш джентльменский набор для процедурного редактирования 3D-моделей включает три базовые операции: триангуляцию, движение точек, выдавливание. Подробно поговорим о последних двух. Сначала рассмотрим простейшие операции движения — перемещение вершин, поворот и масштабирование ребер и треугольников. Затем разберемся с одним из способов генерации новой геометрии — операцией выдавливания (Extrude).

В предыдущей публикации мы описывали свою структуру для удобной работы с данными 3D-моделей.

Как можно заметить, здесь используется PLINQ. Это обусловлено тем, что алгоритмы вычислительной геометрии часто можно оптимизировать за счет многопоточности.
Конечно, во время выполнения LINQ-конструкций мусора создается больше, чем при выполнении «ручного» кода. Однако этот недостаток в значительной степени компенсируется лаконичностью таких конструкций, а также наличием в PLINQ встроенных средств управления ресурсами. Кроме того, переход между однопоточной и многопоточной реализацией осуществляется с помощью всего лишь одной команды, что сильно облегчает процесс отладки.

Кручу, верчу, запутать хочу

Приступим к операциям движения. В перемещении вершин ничего сложного нет. Только нужно не забывать о совпадающих вершинах: если требуется, их положение тоже должно меняться.

Алгоритм реализован через добавление вектора движения к позиции вершины. Смещение при этом происходит относительно начала координат модели (pivot). Стоит отметить, что положение полигонов при таких трансформациях может меняться, а нормали их вершин — нет. Однако для упрощения изложения мы не будем рассматривать этот нюанс.

В CAD-средствах есть функция перерасчета нормалей, которую обычно вызывают уже после применения требуемых трансформаций. Существуют разные способы выполнения такого перерасчета. Наиболее распространенный вычисляет нормаль к плоскости каждого треугольника, а затем каждой вершине присваивает нормаль как среднее от нормалей треугольников, которым эта вершина принадлежит.

В целом здесь нет веских причин усложнять код и применять матрицу трансформации. Результат добавления вектора движения к позиции вершины соответствует интуитивному представлению о ее перемещении.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играхЧто такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Перемещение ребер и треугольников реализовано так же — добавлением вектора смещения.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играхЧто такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх
Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играхЧто такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

А вот вращать и масштабировать удобнее при помощи матрицы преобразования. Результат выполнения этих операций относительно начала координат модели скорее всего окажется не таким, каким вы ожидали или хотели его увидеть. За опорную точку вращения и масштабирования обычно берется середина объекта — как наиболее понятная для человеков.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играхЧто такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играхЧто такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играхЧто такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх
Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играхЧто такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играхЧто такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играхЧто такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Роем себе аккуратную ямку

В 3D-моделировании часто применяется операция выдавливания (Extrude). Для ее выполнения должен быть известен вектор движения (смещения) и набор полигонов. Процесс выдавливания можно декомпозировать на два действия:

1. Смещение полигонов на заданный вектор движения (offset). При этом необходимо дублировать разделяемые граничными полигонами вершины, чтобы не нарушать положение тех элементов, которые не относятся к смещаемой части. Иначе говоря, нужно оторвать и передвинуть выбранный кусок. Если этот шаг выполнить первым, то модель, вероятно, развалится на части, которые придется соединять в будущем.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

2. Добавление новой геометрии между границей смещенной части и границей, которая образовалась при выдавливании. Просвет между основной и сдвинутой частями модели заполняется полигонами, образующими стенку.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

В реализации удобнее сначала выполнять построение стенки, поскольку до сдвига мы имеем исходное положение ребер на границе и можем использовать эти данные сразу. В противном случае пришлось бы либо инвертировать направление вектора сдвига, либо сохранять часть информации о начальном состоянии меша.

Модель и ее части, с которыми мы работаем, складываются из множеств попарно соседних полигонов (треугольников). Назовем каждое такое множество кластером.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх
Два выделенных на модели кластера в Blender

Сперва нам понадобится получить все ребра контуров, ограничивающих выбранные кластеры. Для этого достаточно последовательно добавлять ребра в список. Если встречается совпадающее ребро, то его необходимо удалять, не добавляя при этом текущее. Для правильности работы такого алгоритма нужно ввести ограничение: на выбранном множестве треугольников не существует больше двух совпадающих ребер. В кейсах, где используется Extrude, модели зачастую удовлетворяют этому условию, а более сложный алгоритм требует больших вычислительных ресурсов.

После получения всех ребер контура нужно построить соответствующие стенки. Вариантов реализации можно нафантазировать много, но мы решили пойти по пути наименьшего сопротивления — генерировать параллелограммы в направлении вектора движения на основе ребер по отдельности. Поскольку смещение у нас для всех одно, в результате этого действия параллелограммы будут образовывать сплошную и замкнутую стенку для каждого кластера. Остается определиться с ориентацией элементов стенки.

Стенка, как и весь меш, состоит из треугольников. По конвенции OpenGL обособленный треугольник рендерится на экране, если при проецировании его точек на плоскость экрана обход их по порядку соответствует обходу по часовой стрелке:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Так, треугольнику соответствует некоторый вектор нормали, определяющий лицевую сторону. Каждый треугольник ограничен выпуклым контуром, состоящим из трех ребер. У каждого ребра есть две вершины, в нашей структуре представленные как v0 и v1. Определим направление ребра так, что v0 — начало, v1 — конец. Теперь, если направление ребер треугольника задано в соответствии с обходом его вершин, то любой внешний контур кластера должен иметь обход либо по часовой стрелке, либо против, а любой внутренний — наоборот. Конструкторы CustomMesh и Triangle мы реализовали так, чтобы обход вершин всех треугольников соответствовал направлению хода часовой стрелки.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Имея направление обхода контура, можно точно сказать, с какой стороны от ребра находится внутренняя часть контура, а с какой — внешняя. Опираясь на эту информацию, мы будем выбирать ориентацию стенки. Пусть (v0, v1) — ребро, на основе которого нужно сгенерировать желаемый параллелограмм. Возьмем две точки v2 и v3 как позиции смещения v0 и v1. Затем построим два треугольника по следующей схеме:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

И так для каждого ребра контура.

При таком подходе лицевая сторона генерируемых стенок будет корректной и для горок, и для ямок. Есть лишь одно существенное ограничение: множество треугольников, над которым выполняется операция Extrude, не должно заворачиваться под себя относительно вектора движения.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх
Подмножество полигонов, невалидное относительно смещения. Даже в Blender при таком Extrude не удастся избежать кривой геометрии

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх
Валидные подмножества полигонов

Стенка готова, осталось сместить треугольники. Этот шаг алгоритма прост в понимании, хоть реализация и получилась громоздкой.

В нашем случае нужно убедиться, что каждая вершина кластера принадлежит только его треугольникам. Если не выполнить условие, то за кластером могут потянуться некоторые соседние полигоны. Решение этой ситуации — продублировать каждую вершину, принадлежащую как кластеру, так и остальной части модели. Затем для всех полигонов кластера заменить индекс данной вершины на индекс дубликата. Когда условие выполнено, перемещаем все вершины кластера на вектор движения.

Готово. Теперь, сложив результаты всех шагов, получаем ямку или горку.

Пошаманив с координатами текстурной развертки и смещением точек контура, можно получить вот такое углубление:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

И это еще не все

Помимо рассмотренных выше операций редактирования мы пользуемся и другими удобными методами работы с моделями.

Например, дополнительно мы написали метод Combine() для объединения двух CustomMesh. Ключевое отличие нашей реализации от UnityEngine.Mesh.CombineMeshes() в том, что если при объединении мешей какие-то вершины оказываются полностью эквивалентными, мы оставляем только одну из них, таким образом избегая лишней геометрии.

В том же модуле мы реализовали алгоритм плоской триангуляции Делоне. Используя его, можно, например, закрыть большую яму, созданную с помощью Extrude, плоской крышкой с текстурой воды и получить озеро:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Что же, с этим разобрались! В следующей статье рассмотрим особенности импорта .fbx в Unity и методы валидации моделей в проекте.

Источник

Манипуляция мешами в реальном времени на Unity

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Одно из преимуществ Unity в качестве платформы для разработки игр — её мощный 3D-движок. В этом туториале вы познакомитесь с миром 3D-объектов и манипуляций мешами.

В связи с ростом технологий виртуальной и дополненной реальности (VR/AR) большинство разработчиков сталкивается со сложными концепциями 3D-графики. Пусть этот туториал будет для них отправной точкой. Не волнуйтесь, здесь не будет сложной 3D-математики — только сердца, рисунки, стрелки и куча интересного!

Примечание: этот туториал предназначен для пользователей, знакомых с IDE Unity и имеющих определённый опыт программирования на C#. Если у вас нет таких знаний, то изучите сначала туториалы Introduction to Unity UI и Introduction to Unity Scripting.

Вам понадобится версия Unity не ниже 2017.3.1. Последнюю версию Unity можно скачать здесь. В этом туториале используются custom editor, подробнее о них можно узнать из туториала Extending the Unity Editor.

Приступаем к работе

Для начала познакомьтесь с основными терминами 3D-графики, которые позволят вам лучше понять туториал.

Базовые технические термины 3D-графики:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Затем нормали и UV-данные задают затенение, цвет и текстуру. Данные меша хранятся в mesh filter, а mesh renderer использует эти данные для отрисовки объекта в сцене.

То есть псевдокод создания 3D-модели выглядит так:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Изменение мешей с помощью Custom Editor

Откройте 01 Mesh Study Demo, находящееся в папке Scenes. В окне Scene вы увидите 3D-куб:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Прежде чем приступать к мешу, давайте взглянем на скрипт custom editor.

Изменение скрипта редактора

Выберите папку Editor в окне Project. Скрипты в этой папке добавляют функционал к редактору (Editor) во время разработки и недоступны в режиме Build.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

В MeshInspector.cs перед началом класса MeshInspector добавим следующее:

Объяснение кода: атрибут CustomEditor сообщает Unity, какой тип объекта может изменять класс custom editor.

В OnSceneGUI() перед EditMesh() добавим следующее:

Сохраним (Save) файл и вернёмся в Unity. Перейдите в папку Scripts и перетащите MeshStudy.cs на GameObject Cube в Hierarchy, чтобы прикрепить его.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Теперь в консоли должно выводиться сообщение «Custom editor is running», и это означает, что мы всё сделали верно! Можете удалить отладочное сообщение, чтобы оно не мешало нам в консоли.

Клонирование и сброс меша

При работе с 3D-мешем в режиме Edit при помощи custom editor будьте аккуратны, чтобы не перезаписать меш Unity по умолчанию. Если это произойдёт, то придётся перезапускать Unity.

Чтобы безопасно клонировать меш без перезаписи исходной формы, создадим копию меша из свойства MeshFilter.sharedmesh и присвоим его снова mesh filter.

В MeshStudy.cs перед началом класса MeshStudy добавим следующее:

Объяснение кода: после добавления этого атрибута функция Start() будет выполняться и в режиме Play, и в режиме Edit. Теперь мы сначала можем создать экземпляр объекта меша и клонировать его.

В InitMesh() добавим следующий код:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Объяснение вершин и треугольников в Unity

Меш состоит из вершин, соединённых рёбрами в треугольники. Треугольники задают базовую форму объекта.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Отображение вершин

Здесь мы хотим отобразить вершины куба в виде голубых точек.

В MeshInspector.cs зайдём в функцию EditMesh() и добавим следующее:

Объяснение кода: эта строка преобразует локальную позицию вершины в координату в мировом пространстве.

В той же функции, в блоке if сразу после только что добавленной строки кода добавим следующее:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Перемещение отдельной вершины

Начнём с самого простого шага манипуляций с мешем — перемещения отдельной вершины.

Затем добавим в функцию PullOneVertex() следующее:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Похоже, что некоторые из вершин имеют одинаковую позицию, поэтому когда мы перетаскиваем только одну, остальные вершины остаются за ней, и меш ломается. В следующем разделе мы устраним эту проблему.

Нахождение всех похожих вершин

Визуально меш куба состоит из восьми вершин, шести сторон и 12 треугольников. Давайте проверим, так ли это.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Объяснение кода: [HideInInspector] скрывает общую переменную от окна Inspector.

Закомментируем этот атрибут:

Примечание: сокрытие значений вершин помогает [HideInInspector] в случае более сложных 3D-мешей. Так как размер массива вершин может достигать тысяч элементов, то это может приводить к торможению Unity при попытке просмотра значения массива в Inspector.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

На этот счёт есть много теорий. Но простейший ответ таков: у куба шесть сторон, и каждая сторона составлена из четырёх вершин, образующих плоскость.

Поэтому расчёт таков: 6 x 4 = 24 вершины.

Можете поискать и другие ответы. Но пока достаточно просто знать, что у некоторых мешей будут вершины, имеющие одинаковую позицию.

В MeshStudy.cs заменим весь код внутри функции DoAction() на следующий:

Перейдём в функцию PullSimilarVertices() и добавим следующее:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Теперь, когда мы выполнили первый шаг в манипуляции мешами, сохраним сцену и перейдём к следующему разделу.

Манипулирование мешами

В этом разделе вы узнаете о манипулировании мешами в реальном времени. Существует множество способов, но в этом туториале мы рассмотрим наиболее простой вид манипуляций мешами, а именно перемещение заранее созданных вершин меша.

Сбор выбранных индексов

Начнём с выбора вершин, которые будем перемещать в реальном времени.

Откройте сцену 02 Create Heart Mesh из папки Scenes. В окне Scene вы увидите красную сферу. Выберите Sphere в Hierarchy и перейдите в Inspector. Вы увидите, что к объекту прикреплён компонент скрипта Heart Mesh.

Теперь нам нужно, чтобы скрипт Editor для этого объекта отображал вершины меша в окне Scene. Перейдите в папку Editor и дважды щёлкните на HeartMeshInspector.cs.

Сохраните файл и откройте HeartMesh.cs из папки Scripts. В функцию ClearAllData() добавьте следующее:

Сохраните файл и вернитесь в Unity. Выберите Sphere и перейдите в Inspector к компоненту скрипта HeartMesh. Разверните Selected Indices, нажав на значок стрелки рядом с ним. Это позволит нам отслеживать каждую вершину, добавляемую в список.

Включите Is Edit Mode с помощью флажка рядом с ним. Благодаря этому в окне Scene будут отрисовываться вершины меша. При нажатии на синие точки в Selected Indices должны соответствующим образом меняться значения. Также протестируйте кнопку Clear Selected Vertices, чтобы убедиться, что она очищает все значения.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Примечание: в изменённом custom Inspector у нас есть опция для отображения/скрытия манипулятора transform с помощью Show Transform Handle. Так что не паникуйте, если не найдёте в других сценах манипулятор Transform! Перед выходом включайте его.

Превращение сферы в сердце

Изменение вершин меша в реальном времени по сути состоит из трёх этапов:

В той же функции Init() перед закрывающей скобкой блока else добавим следующее:

Внутрь функции StartDisplacement() добавим следующее:

Источник техники Falloff
Исходная формула взята из файла пакета ассетов Procedural Examples, который можно бесплатно скачать из Unity Asset Store.

Сохраните файл и вернитесь в Unity. Выберите Sphere, перейдите к компоненту HeartMesh и попробуйте добавить несколько вершин в свойство Selected Indices. Отключите Is Edit mode и нажмите Play, чтобы посмотреть на результат своей работы.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Поэкспериментируйте со значениями Radiusofeffect, Pullvalue и Duration, чтобы получить разные результаты. Когда будете готовы, измените настройки в соответствии с показанным ниже скриншотом.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Нажмите на Play. Превратилась ли ваша сфера в сердце?

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Поздравляю! В следующем разделе мы сохраним меш в префаб для дальнейшего использования.

Сохранение меша в реальном времени

Для сохранения процедурного меша в форме сердца в режиме Play необходимо подготовить префаб, дочерним элементом которого будет 3D-объект, а затем заменить его ассет меша новым с помощью скрипта.

В окне Project найдите CustomHeart в папке Prefabs. Нажмите на значок стрелки, чтобы развернуть его содержимое и выберите Child. Теперь вы видите в окне превью Inspector объект Sphere. Это префаб, который будет хранить данные нового меша.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Объяснение кода: возвращает ассет меша со значениями из меша в форме сердца.

Сохраните файл и вернитесь в Unity. Нажмите Play. После завершения анимации в Inspector появится кнопка Save Mesh. Нажмите на кнопку, чтобы сохранить новый меш, а затем остановите проигрыватель.

Перейдите в папку Prefabs и посмотрите на префаб CustomHeart. Вы должны увидеть, что теперь в объекте префаба CustomHeart есть совершенно новый меш в форме сердца.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Соединяем всё вместе

В предыдущей сцене функция DisplaceVertices() использовала формулу Falloff для определения силы перетаскивания, которая прикладывалась к каждой вершине в пределах заданного радиуса. Точка «затухания» (fall off), в которой сила перетаскивания начинает снижаться, зависит от использованного типа Falloff: Linear, Gaussian или Needle. Каждый тип создаёт в меше разные результаты.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

В этом разделе мы рассмотрим другой способ манипулирования вершинами: с помощью заданной кривой. Взяв правило, что скорость равна расстоянию, поделённому на время (d=(v/t)), мы можем определить позицию вектора, ссылаясь на его расстояние, поделённое на время.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Использование способа с кривой

Сохраните текущую сцену и откройте 03 Customize Heart Mesh из папки Scenes. Вы увидите в Hierarchy экземпляр префаба CustomHeart. Нажмите на значок стрелки рядом с ним, чтобы развернуть его содержимое и выберите Child.

Просмотрите его свойства в Inspector. Вы увидите компонент Mesh Filter с ассетом Heart Mesh. Прикрепите к Child в качестве компонента скрипт Custom Heart. Теперь ассет должен смениться с HeartMesh на clone.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Далее откройте CustomHeart.cs из папки Scripts. Перед функцией Start() добавьте следующее:

Перейдите в CurveType1() и добавьте следующее:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Чтобы увидеть подробные результаты для разных типов кривых, введите значения в соответствии со скриншотом:

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Для списка Curve Type выберите значение Curve1, убедитесь, что для Edit Type выбрано None и нажмите Play. Вы должны увидеть, что меш расходится в паттерн. Покрутите модель, чтобы увидеть её в виде сбоку, и сравните результаты для обоих типов кривых. Здесь вы видите, как выбранный Curve Type влияет на смещение меша.

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Что такое meshes в играх. Смотреть фото Что такое meshes в играх. Смотреть картинку Что такое meshes в играх. Картинка про Что такое meshes в играх. Фото Что такое meshes в играх

Вот и всё! Можете нажать на Clear Selected Vertices, чтобы сбросить Selected Indices и поэкспериментировать с собственными паттернами. Но не забывайте, что есть и другие факторы, которые будут влиять на конечный результат меша, а именно:

Куда двигаться дальше?

Файлы готового проекта находятся в архиве проекта туториала.

Не останавливайтесь на этом! Попробуйте использовать более сложные техники, применяемые в туториале «Процедурная генерация лабиринтов в Unity».

Надеюсь, вам понравился этот туториал, а информация оказалась полезной. Особую благодарность я выражаю Джасперу Флику из Catlike Coding за его отличные туториалы, которые помогли мне собрать демо для моего проекта.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *