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

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

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

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

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

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

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

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

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

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

Источник

Анатомия мешей

Меш состоит из треугольников, расположенных в 3D-пространстве так, чтобы создать впечатление замкнутого объекта. Треугольник определяется тремя угловыми точками или вершинами. В классе Mesh, все вершины хранятся в одном массиве и каждый треугольник задается с помощью трех целых чисел, которые соответствуют индексам в массиве вершин. Треугольники, также, собраны в единый массив целых чисел, которые берутся группами по три от начала этого массива, так чтобы элементы 0, 1 и 2 определили первый треугольник, 3, 4 и 5 определили второй, и так далее. Любая вершина может быть повторно использована во многих треугольниках по желанию, но есть причины, когда это может быть нежелательно, что объясняется ниже.

Освещение и нормали

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

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Так как сетка состоит из треугольников, может показаться, что нормали на его углах будут точно перпендикулярны плоскости их треугольника. Однако на самом деле нормали интерполируются между треугольниками с получением среднего значения между соседними углами. Если все три нормали треугольника указывают в одном направлении, то треугольник будет равномерно освещен на всем протяжении. Эффектом того, что разные треугольники равномерно затенены будет то, что края будут очень четкими и отчетливыми. Это именно то, что требуется для модели куба или других объектов с острым краем, но интерполяция нормалей может быть использована для создания плавного затенения, чтобы представить изогнутую поверхность.

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

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

Текстурирование

Подобно нормалям, текстурные координаты уникальны для каждой вершины и, таким образом, существуют ситуации, когда приходится дублировать вершины для получения различных UV значение вдоль ребра. Очевидный пример, это когда два соседних треугольника используют разделенные части текстуры (например, глаза на текстуре лица). Также, большинство полностью замкнутых объемов потребуют “шов”, где область текстуры заворачивается, и соединяется. Значения UV на одной стороне шва будут отличаться от тех, что на другой стороне.

Источник

Математика в Gamedev по-простому. Триангуляции и Triangle.Net в Unity

Всем привет! Меня зовут Гриша, и я основатель CGDevs. Математика – очень крутой инструмент при разработке игр. Но если скажем без понимания векторов и матриц обойтись в принципе сложно, то алгоритмы триангуляций не столь обязательная вещь, но с помощью них решается достаточно большое количество интересных задач. Сегодня хотелось бы поговорить про достаточно важный инструмент в вычислительной геометрии, такой как триангуляции и их применение в игровой индустрии. Кроме того, я написал порт и немного обёрток великолепной библиотеки Triangle.Net для Unity. Если интересно – добро пожаловать под кат. Ссылка на гитхаб прилагается.

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Что такое триангуляция?

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

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

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

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Зачем они нужны?

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

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

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Помимо этого, с помощью триангуляции Делоне с ограничениями и таким алгоритмам как Chew’s second algorithm и Ruppert’s algorithm можно генерировать сетки ещё лучше для тиррейнов и генерировать хорошие сетки для другого применения – метода конечных элементов.

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

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

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

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

Ear Clipping with Holes

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Пожалуй, один из самых простых алгоритмов триангуляции. Даёт не лучшую сетку и обладает большой вычислительной сложностью О(n^2) в худшем случае.

Bowyer–Watson algorithm

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Алгоритм, генерирующий триангуляцию Делоне по набору точек. В целом, как и у большинства алгоритмов Делоне при правильной реализации алгоритмическая сложность O( n log n), где n – количество вершин. Но в некоторых случаях может занимать O(n^2).

Минусами относительно Ear Clipping является то, что данный алгоритм строит выпуклую триангуляцию и в базовой реализации не предполагает дыр в получившейся сетке.

Обработка триангуляции Делоне (Delaunay refinement)

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Chew’s second algorithm и Ruppert’s algorithm – это алгоритмы, которые позволяют вводить ограничения в триангуляцию Делоне и задать минимальный угол треугольника в сетке. Важной деталью алгоритмов является то, что они могут уйти в бесконечный цикл и гарантировано дают результат при углах между примерно 20.7 градусов и 29 градусов. Возможность задать минимальный угол важна при решении задач, описанных выше.

Chew’s second algorithm реализован в бесплатном пакете www.cs.cmu.edu/

Triangle.Net для Unity

Ну и раз уж с помощью триангуляций можно решать так много крутых задач, то на праздниках захотелось реализовать свою обёртку для Unity, чтобы всегда иметь под рукой удобный инструмент. В данной реализации алгоритм триангуляции в среднем работает за O(n), а в худшем за O(n * log n) – где n-количество вершин. К примеру, при тесте на 1кк вершин случайно разбросанных по квадрату юнити в редакторе на Intel Core i7-8700 строило сетку в среднем за 7.56 секунд.

Основные отличия от оригинальной библиотеки в наличии методов расширений заточенных под Unity, а так же замена double на float во всей библиотеке (+ пара определённых операторов для каста) Double в юнити не имеет особого смысла. Если считать физические симуляции, то я бы использовал отдельное приложение на плюсовой библиотеке, а результат вычислений уже отдавал Unity чисто для визуализации. А также переименован тип Mesh на TriangleNetMesh, чтобы не сбивать относительно Mesh из Unity. Да, они и так в разных неймспейсах, но тем не менее думаю новичков немного сбивал бы тот факт, что мы с помощью одного Mesh получаем другой.

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

Для демонстрации и примера использования была сделана специальная демо-сцена с возможностью отрисовки мешей. С ней и портом библиотеки можно ознакомится в github проекте.

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

Источник

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

OnPostRender не работает в EditorWindow.

Так картинка рисуется:

Может какой-то шейдер специальный нужен.

Линии тоже получалось рисовать. Вот с треугольником как-то не выходит. В режиме игры получается рисовать его.

Как нарисовать треугольник?
Помогите пожалуйста. Пишу программу для построения графиков. Вся математика и процедуры написаны.

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

Как нарисовать треугольник из символов?
Помогите пожалуйстаааа! Необходимо нарисовать треугольник из символов, используя обращение к.

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

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнитиКак нарисовать равнобедренный треугольник
Здраствуйте, кто может помочь советом а может и кое коким кодом? Нужно нарисовать равнобедренный.

Источник

Игра-головоломка Neo Angle. Работа с уровнями в Unity

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Всем доброго времени суток! Я бы хотел вам рассказать историю своей новой игры-головоломки Neo Angle, а также поделиться опытом импортирования, хранения и генерации уровней в Unity.

Начну с краткой предыстории 5-летней давности, когда я решил заняться геймдевом, впервые познакомившись с языком программирования action script 3.0 (для разработки flash-игр) в университете.

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

Таким образом, затратив неделю на разработку в одиночку, была выпущена моя первая flash-игра SeaQuest.

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

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

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити
Результат под названием Stone Quest

На этом линейка логических игр завершилась и была успешно мной позабыта.

Далее последовал обещанный обвал флэш индустрии, который перекинул меня в unity разработку для мобильных. И вот, в декабре 2016 года, совершенно случайно мне в голову вернулась мысль о треугольно-ориентированных головоломках. Особенно подтолкнуло к разработке то, что геймплей отлично подходит под тачскрин. Было решено использовать механику предыдущей игры, но с другой стилизацией.

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

Результат работы в редакторе продемонстрирован ниже:

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Прежде чем перейти к работе с Unity, мне необходимо было убедиться в том, что я смогу предоставить достаточное количество уровней для мобильной игры, которая требует разнообразный контент. Поэтому первые полторы недели я даже не открывал Unity, а работал в своем редакторе, параллельно занимаясь графикой. К слову, был выбран набирающий популярность ретро-стиль synthwave 80-ых. Он достаточно прост в исполнении, являясь при этом очень привлекательным.

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

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

В связи с этим, возникли следующие вопросы: каким образом импортировать, хранить и генерировать уровни в Unity из xml файла?

Найденных вариантов решения было три:

1. При старте игры вычитывать xml файл и каждый раз динамически создавать уровни на runtime.
2. В edit mode сгенерировать уровни и создать на каждый по сцене.
3. В edit mode сгенерировать уровни и создать для каждого префаб.

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

Для работы с объектами в edit mode добавим кастомную панель в редакторе Unity. Для этого создаем класс наследуемый от EditorWindow в папке Assets/Editor и добавляем туда следующий метод:

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Далее, в методе OnGUI можно начинать добавлять кнопки и поля для нашего окна.

Больше информации по компонентам можно найти в официальной документации. А я продолжу описание моего Level Loader’a, продемонстрировав принцип работы ниже:

Как сделать треугольник в юнити. Смотреть фото Как сделать треугольник в юнити. Смотреть картинку Как сделать треугольник в юнити. Картинка про Как сделать треугольник в юнити. Фото Как сделать треугольник в юнити

Сперва, мы вычитываем уровни из xml файла, путем нажатия на Read Levels, после этого создается выпадающий список с возможностью выбора уровня и появляются дополнительные контролы, которые позволяют сгенерировать уровень на сцене, создать префаб выбранного уровня, пересоздать префабы всех уровней, показать/скрыть номера полей (для тестирования отрисовки и отслеживания ошибок).

Для создания объектов на сцене в edit mode используется стандартная функция Instantiate, а для удаления DestroyImmediate.

Какое-то время я создавал префабы уровней вручную, перетягивая их со сцены в папку Resources. Однако, это быстро мне надоело и я полез в интернет за информацией о том, как создавать префабы в edit mode программными средствами. Ниже конструкция, позволяющая это сделать:

Далее, в режиме игры уровни добавляются на сцену следующим образом:

Так, этапы добавления уровней получились следующие:

Спасибо за внимание! Поиграть в игру можно в Google Play по запросу Neo Angle.

Источник

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

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