Как сделать треугольник в unity

Как сделать треугольник в unity

Для представления плоских поверхностей в Unity есть примитивы Plane и Quad (подробнее см. Примитивы. Однако полезно изучить то, как может быть построен минимальный меш плоскости, т.к. это, возможно, самой простой пример, с четырьмя вершинами для углов и двумя треугольниками.

В первую очередь, следует задать массив вершин. Предположим, что плоскость лежит на осях X и Y и путь её ширина и высота контролируются переменными-свойствами. Расположим вершины в таком порядке: нижняя-левая, нижняя-правая, верхняя-левая, верхняя-правая.

Как сделать треугольник в unity

Т.к. свойства данных меша исполняют код “за кулисами”, будет куда более эффективно задать данные в собственном массиве, и затем назначить свойству, нежели получать доступ к свойству-массиву поэлементно.

Затем идут треугольники. Т.к. нам требуется 2 треугольника, каждый из которых определён тремя целыми числами, массив треугольников в общем счёте будет иметь 6 элементов. Помня о правиле упорядочивания углов по часовой стрелке, левый нижний треугольник будет использовать 0, 2, 1 в качестве индексов угла, в то время как другой (верхний правый) будет использовать 2, 3, 1.

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

Наконец, добавление текстурных координат в меш позволит ему правильно отображать материал. Предполагая, что мы хотим увидеть всё изображение на плоскости, все значения UV будут равны 0 или 1, в соответствии с углами текстуры.

Завершенный скрипт может выглядеть как-то так:-

Учтите, что если код был запущен один раз в функции Start, то меш не изменится на протяжении всей игры. Тем не менее, вы можете просто поместить код в функцию Update, тем самым позволив мешу меняться каждый кадр (хотя это может изрядно увеличить нагрузку на CPU).

Видео:Как сделать оптимизацию игры в Unity 3D // Occlusion CullingСкачать

Как сделать оптимизацию игры в Unity 3D // Occlusion Culling

Процедурная генерация трёхмерных моделей

Как сделать треугольник в unity

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

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

На примере движка Unity и C# я покажу как можно работать с моделями и превращать текст в графику. Большинство приводимого кода легко портируется на другие фреймфорки и языки.

Видео:[Unity] генерация 3d объектов. Mesh generationСкачать

[Unity] генерация 3d объектов. Mesh generation

Треугольник

Как сделать треугольник в unity
Начнём с простейшей формы — треугольника. В Unity и во многих других движках используется популярный способ описания моделей: с помощью массивов вершин, треугольников и нормалей. Дополнительно для текстурирования используются uv-координаты вершин. Для работы с моделями есть класс Mesh, в котором для каждого набора данных имеется отдельный массив. В Mesh.vertices хранятся координаты вершин, в Mesh.triangles — индексы вершин группами по три. А в Mesh.normals и Mesh.uv лежат векторы нормалей и координаты uv-карт, индексы которых должны совпадать с индексами соответствующих вершин, т. е. порядок в массивах должен быть одинаковым. Покажу на примере, чтобы было понятнее.

Сделаем функцию, которая на вход принимает три вершины треугольника, а отдаёт готовую модельку. Начнём с основы.

Упаковываем три вершины в массив и передаём мешу. Треугольник описывается элементарно, но есть нюанс, про который нужно помнить. Если смотреть на модель снаружи, то вершины её треугольников должны располагаться по часовой стрелке. Это сделано для того, чтобы во время отрисовки можно было отсечь треугольники, которые «не смотрят в камеру», и обрабатывать их отдельно. Порядок вершин рассчитывается очень просто, поэтому такой способ фильтрации очень эффективен. Если взять произведение двух векторов, то можно найти третий вектор, перпендикулярный плоскости, образуемой сомножителями. Если пробежаться по треугольнику и посчитать произведения, то можно узнать порядок вершин. Кстати эти перпендикулярные вектора нам тоже нужны для описания моделей — это ведь нормали. Нормаль считается следующим образом:

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

Осталось добавить uv-координаты, для трёх вершин это просто.

Ну и всё, треугольник готов. Теперь его можно использовать.

Видео:Трюки юнити: Как сделать любой пивот для объекта?Скачать

Трюки юнити: Как сделать любой пивот для объекта?

Четырёхугольник

Как сделать треугольник в unity
Помимо треугольников есть ещё один популярный примитив для моделирования — четырёхугольник, ну или квад, если вам так больше нравится.

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

Напоминаю, что вершины по-прежнему записываются по часовой стрелке.

Теперь, когда мы имеем два базовых примитива, мы можем собрать любую модель.

Видео:Unity/C# Векторы, модуль, направлениеСкачать

Unity/C# Векторы, модуль, направление

Плоскость

Как сделать треугольник в unity
Поэкспериментируем со сборкой моделей на примере плоскости. Возьмём много квадратов и разложим стык в стык.

Лень — двигатель прогресса, поэтому для сборки квадратов в модель будем использовать Mesh.CombineMeshes. Этот метод принимает на вход структуру CombineInstance, в которой можно указать модельку, её индекс и матрицу трансформирования. Для нас важно только первое, остальное игнорируем.

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

Видео:Физика в Unity - 1. RigidbodyСкачать

Физика в Unity - 1. Rigidbody

Параллелепипед

Как сделать треугольник в unity
Раскладывать плитки по плоскости слишком просто, пора перейти к третьему измерению.

Из квадратов хорошо получаются кубы. Даже лучше, с помощью наших псевдоквадов можно делать не только кубы, но и параллелепипеды. Только тссс! Никому не говорите.

Нужно всего шесть четырёхугольников. Зная длину, ширину и высоту параллелепипеда, можно рассчитать все его вершины. Удобно сначала найти два противоположных угла параллелепипеда, а потом от них отстраивать всё остальное. Также имеет смысл отцентрировать модель. Как это выглядит на практике можете посмотреть ниже.

Видео:Физика в Unity - 10. JointСкачать

Физика в Unity - 10. Joint

Октаэдр

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

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

В конце я применил Mesh.RecalculateNormals, который автоматически считает нормали, так проще.

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

Видео:Уроки по Unity3d #17 - работа с мешами(создание простых мешей из кода)Скачать

Уроки по Unity3d #17  - работа с мешами(создание простых мешей из кода)

Тетраэдр

Как сделать треугольник в unity
Теперь можно взяться за фигуры поинтереснее. Расчёт вершин даже для простого тетраэдра требует потребует пятёрки по школьной геометрии, поэтому сразу предупреждаю, если не помните что на что делится в синусе, то лучше сначала заглянуть в учебник, как это пришлось сделать мне.

Освежили память? Продолжим.

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

Остальные вершины должны образовывать равносторонний треугольник. Их координаты можно найти с помощью синусов и косинусов. В Unity есть функции Mathf.Sin и Mathf.Cos, которые ведут расчёт в радианах. Делим окружность на три части и находим на ней три точки:

Из этих вершин уже можно собрать пирамидку, но это не будет тетраэдром, потому что у настоящего тетраэдра все грани одинаковые. Для настоящего тетраэдра основание пирамиды нужно немного уменьшить и сдвинуть ниже. Тут опять пригодятся синусы и косинусы, но чтобы ими воспользоваться, немного смухлюем и подсмотрим один угол в Википедии. «Edge central angle» это угол между радиусами описанной сферы, пересекающими вершины тетраэдра. Кхм, или что-то в этом роде, я успел запутаться пока формулировал мысль. В общем присовокупив этот угол получаем следующий код:

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

А вот тот же тетраэдр без математики, с захардкоденными вершинами, почувствуйте разницу:

Видео:Рисуем линии с помощью LineRenderer в Unity. Гайд для отсталых.Скачать

Рисуем линии с помощью LineRenderer в Unity. Гайд для отсталых.

Икосаэдр

Как сделать треугольник в unity
Напоследок самое вкусное — икосаэдр. Если выровнять икосаэдр и посмотреть на него под правильным углом, то можно заметить, что две его вершины лежат на одной оси друг под другом, а остальные расположены на двух окружностях.

На каждой окружности их по пять штук, а значит интервал между ними 72 градуса. Смещение между окружностями — 36 градусов. Для выравнивания вершин нам опять понадобится волшебный угол из Википедии: «If two vertices are taken to be at the north and south poles (latitude ±90°), then the other ten vertices are at latitude ±arctan(1/2) ≈ ±26.57°». В переводе на русский это означает, что волшебный угол — арктангенс одной второй.

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

Видео:КАК СДЕЛАТЬ НОРМАЛЬНУЮ 3Д ТРАВУ В ЮНИТИ UNITYСкачать

КАК СДЕЛАТЬ НОРМАЛЬНУЮ 3Д ТРАВУ В ЮНИТИ UNITY

Заключение

Если вы внимательно читали код в статье, то наверняка заметили, что там много ненужных вычислений, тот же Mathf.Cos(magicAngle) из примера выше. При желании его можно посчитать только один раз и занести в переменную, это будет не так наглядно и понятно зато быстрее.

Кроме того в генерируемых моделях не самые удобные uv-карты, было бы неплохо их исправить, но для этого придётся переделывать очень много кода, пока и так сойдёт.

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

Исходники и бинарники для разных платформ можете скачать по ссылкам ниже.

Видео:Как создать Ragdoll в Unity3D?Скачать

Как создать Ragdoll в Unity3D?

dariy.net

Mesh состоит из треугольников, расположенных в 3D-пространстве так, чтобы создать впечатление замкнутого объекта.

Класс Mesh в Unity предоставляет базовый интерфейс для работы с геометрией mesh’а у объекта. Он использует массивы для представления вершин, треугольников, нормалей и текстурных координат, а так же имеет и другие полезные свойства и методы для генерации mesh’а.

Mesh-объект имеет свойства для вершин и данных о них (нормали, UV-координаты), а так же для данных о треугольниках. Вершины могут находиться в любом порядке, но массивы нормалей и UV-координат должны быть упорядочены так, чтобы индексы всех данных, связанных с конкретной вершиной, совпадали. Т.е. элемент с индексом 0 в массиве нормалей соответствовал нормали для вершины с индексом 0.

Vertices (вершины) — это Vector3-позиции точек в локальном пространстве объекта.
Normals (нормали) — это нормированные Vector3, представляющие направление, опять же в локальных координатах.
UV-координаты определены как Vector2, где U — это X, а V — это Y.

Triangles (треугольники) собраны в массив целых чисел (int[]), которые берутся группами по три от начала этого массива, так чтобы элементы 0, 1 и 2 определили первый треугольник, 3, 4 и 5 определили второй, и так далее. Любая вершина может быть повторно использована в нескольких треугольниках.

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

Пример взят из официальной документации:

Три основных действия с Mesh с кодом можно посмотреть в документации.

📽️ Видео

КАК СДЕЛАТЬ РАЗРУШЕНИЕ ОБЪЕКТОВ В Unity 3D | ЮНИТИ | РАЗРАБОТКА ИГР НА ЮНИТИСкачать

КАК СДЕЛАТЬ РАЗРУШЕНИЕ ОБЪЕКТОВ В Unity 3D | ЮНИТИ | РАЗРАБОТКА ИГР НА ЮНИТИ

Unity для новичков за 20 минут | Gamicle #unity #gamedev #gamicleСкачать

Unity для новичков за 20 минут | Gamicle #unity #gamedev #gamicle

Как сделать МЕНЮ в Unity? | Scene Management, UI, TutorialСкачать

Как сделать МЕНЮ в Unity? | Scene Management, UI, Tutorial

Как сделать взрыв в UnityСкачать

Как сделать взрыв в Unity
Поделиться или сохранить к себе: