Разработка процедурного генератора планет на Blender

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 02.04.2024
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

«ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

(ФГБОУ ВО «ВГУ»)

Физический факультет

Кафедра электроники

Бакалаврская работа

Разработка процедурного генератора планет на Blender

09.03.01 Информатика и вычислительная техника

Вычислительные машины, комплексы, системы и сети

Обучающийся А.В. Вознюк

Руководитель к.ф.-м.н. М.П. Ряполов

Воронеж 2022

Реферат

Разработка процедурного генератора планет на Blender. Бакалаврская работа по направлению 09.03.01 Информатика и вычислительная техника, Воронеж, ВГУ

Ключевые слова: визуальный шум, шум Перлина, шум Симплекс, шум Вороного, когерентный шум, 3D моделирование, Blender, скриптинг, аддон.

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

Содержание

Введение

1. Генерация ландшафта при помощи когерентных шумов

1.1 Шумы

1.1.1 Шум Перлина

1.1.2 Шум Симплекс

1.1.3 Шум Вороного

1.2 Работа с 3D графикой

1.2.1 Работа Blender

1.2.2 Unbiased Render

1.2.3 Biased Render

1.2.4 Типы построения сфер

2. Создание дополнения для Blender на Python

2.1 Скриптинг в Blender

2.2 Создание аддона для Blender

2.3 Панель в меню и результат работы программы

2.4. Установка аддона

Заключение

Список литературы

Введение

Нас окружают дома, машины, реклама, фильмы и видеоигры, в современных больницах всё чаще используют полимерные протезы. Все эти аспекты нашей жизни объединяются тем, что на начальных этапах разработки каждый из них использует технологии 3D моделирования. Эта технология прочно укоренилась в современном мире. Существуют программы для полигонального моделирования, скульптинга, САПР (Система Автоматизированного Проектирования) [1]. При помощи этой технологии производятся и персонажи для мультфильмов, и импланты, и детали для станков ЧПУ. Сфера активно развивается, модернизируются старые технологии, появляются всё новые, а вместе с ними появляются и рабочие места. В связи с этим, появляется потребность в новом программном обеспечении. Стоит отметить, что работа в таких программах не всегда до конца автоматизирована. Большая часть работы рутинна и однообразна. Таким образом, большое количество времени работников этой сферы тратится на такие задачи, которые можно было бы автоматизировать. Во всех сферах применения, моделирование делится на большое количество этапов, подразумевающих необходимость их неоднократного повторения из раза в раз в других работах. Это может быть как этап создания моделей, либо создания топологии, так и различные этапы, связанные с созданием материалов, производством измерений, вычислений, либо импортом объектов в различные программы, например в игровые движки, для дальнейшей работы с ними. Для решения этой проблемы существует возможность автоматизации производства 3D моделей на различных её этапах.

Целью бакалаврской работы является разработка инструмента, позволяющего автоматизировать создание процедурно генерируемых 3D моделей планет посредством программы Blender.

Задачи курсовой работы:

? Изучить способы разработки кастомного ПО в сфере 3D моделирования.

? Изучить специфику работы с процедурными материалами.

? Автоматизировать работу в 3D редакторе, касающуюся способов создания топологии для генерируемых планет.

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

1. Генерация ландшафта при помощи когерентных шумов

1.1 Шумы

Для того чтобы создать процедурную геометрию, необходимо использовать шум. Существует два основных типа шума: когерентный и некогерентный [2]. Различие заключается в том, что точки на графике когерентного шума зависимы от других точек, а на некогерентном значения в точках полностью случайны [3]. Примером такого полностью случайного шума может быть белый шум [4]. На рис. 1.1 представлен белый шум. Белый шум в идеальной своей реализации обладает равным количеством чёрных и белых пикселей, таким образом образуя огромное количество максимально сильных перепадов. Такой шум малопригоден для моделирования чего-либо естественного. С его помощью можно моделировать мелкие частицы, многократно повторяющиеся, и не имеющие крупной просматриваемой визуально структуры, например, песок или гальку. В более крупных естественных процессах, таких как образование ландшафта, либо формирование облаков, есть доля случайности, однако сформированы они в результате трудно вычислимых взаимодействий, поэтому для них более предпочтительным будет не настолько случайный вид шума [5].

Рис. 1.1. Белый шум

1.1.1 Шум Перлина

Кен Перлин в 1983 году создал алгоритм построения своей версии визуального когерентного шума. Его задачей и было создать такой шум, который имитировал бы случайные процессы из реального мира. Этот шум непрерывен и бесшовен, что позволяет бесконечно его масштабировать, всегда получая плавный результат [6]. Помимо этого, алгоритм создания классического шума Перлина позволяет воссоздать его не только в 2D и 3D, но и в любом n-мерном пространстве [7]. В частности, если воссоздать такой шум в 4-мерном пространстве, установив одну ось как ось времени, можно получить достаточно достоверный и качественный процедурный дым, либо движение облаков. Несомненно, такой огромный вклад в создание процедурных графических материалов был по достоинству оценен, в особенности в киноиндустрии. Впоследствии этот алгоритм назвали в честь своего создателя. Однако, этот шум оказался очень ресурсозатратным. Алгоритм его создания имеет сложность (), что сильно замедляет его использование в многомерных пространствах.

Рис. 1.2. Классический шум Перлина

1.1.2 Шум Симплекс

Кен Перлин обратил внимание на главную проблему своего шума - сложность его алгоритма. И в 2001 году реализовал новую версию алгоритма создания шума. Шум Симплекс в итоге отличается меньшей вычислительной сложностью (), благодаря чему гораздо лучше масштабируется до n-мерных измерений [8; 9]. Такое упрощение происходит по причине того, что в отличие от классического шума Перлина, который формирует градиенты интерполируя их на основе четырёх точек гиперсетки, шум симплекс формирует их на основе точек многомерного треугольника (симплекса). При повышении размерности измерения, количество точек у симплекса растёт по формуле (n+1), в то время как у классического шума это (). Визуально шум Симплекс отличается уменьшенным количеством направленных артефактов, то есть более случаен и равномерен. Стоит отметить, что визуально этот шум различен в зависимости от измерения, в котором он воспроизводится. То есть двухмерная его версия и плоский срез трёхмерной версии выглядят различно. На рис. 1.3. представлен шум Симплекс.

Рис. 1.3 Шум Симплекс

1.1.3 Шум Вороного

Шум Вороного назван в честь русского математика Георгия феодосьевича Вороного. Основан шум на созданной им диаграмме [9]. Это такой способ разбиения плоскости, при котором она делится на локусы. Локус - это область, образованная вокруг какой-либо основной точки. Эта область содержит в себе все точки, которые ближе к данной основной точке, а не к любой иной [10]. На Рис. 1.4. представлена диаграмма Вороного.

Рис. 1.4 Диаграмма Вороного

Такую диаграмму можно использовать и для создания карты шума, которая будет изменять цвет или ландшафт планеты [11]. Шум, реализованный на основе этой диаграммы отличается наличием ячеек и чётких границ между ними. Такой шум способен сымитировать структуру пористого камня, либо же, если правильно настроить баланс яркости и контрастности, вымощенной камнями дороги. На Рис. 1.5. представлен двумерный шум на основе предыдущей диаграммы.

Рис. 1.5. Шум Вороного

Для моделирования ландшафта, либо другой естественной структуры существует возможность комбинировать шумы, накладывая друг на друга их октавы. Благодаря такому подходу можно достигать впечатляющих результатов [12; 13].

1.2 Работа с 3D графикой

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

Рендер - это визуализация, перевод виртуально смоделированных геометрических тел, фигур и форм в растровое (пиксельное) изображение [14]. Для компьютерной графики существует последовательность действий, которые нужно произвести для того чтобы получить готовую визуализацию [15]. Эти действия могут различаться в зависимости от задач. Для игровой компьютерной графики они следующие:

1. Моделирование объектов, их форм.

2. Оптимизация полигональной сетки.

3. Создание и наложение на эти объекты текстур, либо материалов, имитирующих реальные текстуры.

4. Работа с освещением, HDRI

5. Рендер.

1.2.1 Работа Blender

Все 3D объекты в Blender строятся из полигонов.

Рис. 1.6. Полигон куба

Полигон - это часть плоскости, ограниченная несколькими гранями. Стандартно, у полигона есть две стороны. Одна из них является лицевой, а другая тыльной. Лицевая сторона может принимать свойства физического объекта и отражать свет, в то время как тыльная сторона пропускает весь свет вне зависимости от материала. Таким образом, крайне важно в какую сторону направлен полигон, и под каким углом на него падает свет. Это сделано для экономии ресурсов компьютера, ведь в большинстве случаев мы не видим изнанку объекта. Однако, в некоторых редакторах можно включить “backfacing”, после чего тыльная сторона полигона тоже будет отражать свет. Понять что такое полигон можно на примере куба. Куб состоит из 6 полигонов. Каждый из его полигонов ограничен 4 гранями.

Рис. 1.7. Рёбра куба

Грани, в свою очередь, ограничены точками, которые называются вертексами.

Рис. 1.8. Вертексы

ландшафт blender рендеринг изображение

Таким образом, вся фигура базируется на вертексах, у каждого из которых есть своя координата.

Существует две основные системы координат, используемые в 3D графике: левосторонняя и правосторонняя. Обе из них являются прямоугольными или Декартовыми. На рис 1.9. показаны вариации систем координат. Лаптев Г.Ф. писал: “Система координат называется правой, если из конца третьего орта k поворот от первого орта i ко второму орту j виден происходящим против хода стрелки часов.” [16, с.38]

Рис. 1.9. Системы координат

Левосторонняя система координат используется во многих игровых движках. В то время как правая система традиционно применяется в 3D редакторах и САПР.

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

Рис. 1.10. Треугольники в полигонах

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

Рис. 1.11. Высокополигональная сфера

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

Рис. 1.12. Низкополигональная сфера

1.2.2 Unbiased Render

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

Рендеринг - это визуализация. В 3D моделировании это превращение виртуальной модели объекта, композиции или сцены в растровое 2D изображение [17].

Существует две разновидности рендеринга: biased и unbiased.

Unbiased (offline или рендер “без допущений”) отличается тем, что он максимально точно воспроизводит физические законы поведения света, отражений и рассеивания в различных материалах. Причём, чем больше просчитывается света, тем более качественным, менее зашумлённым становится изображение. Традиционно, этот способ воспроизводился на центральном процессоре компьютера, который отличается высокой тактовой частотой и способностью выполнять сложные вычисления, в том числе и физических формул поведения света. Однако, центральные процессоры не отличаются многопоточностью. А так как просчитать нужно огромное количество лучей, этот недостаток становится особенно заметен. Со временем, видеокарты с их многокристальными процессорами, отличающимися колоссальной многопоточностью, стали более производительными и смогли выполнять ту же работу, но гораздо быстрее. Сейчас unbiased рендеринг производится как на CPU (центральный процессор), так и на GPU (видеокарта).

В unbaised рендере существует понятие Raytracing. Это и есть моделирование света. При рейтрейсинге устанавливается виртуальный источник света, который имитирует какой-либо существующий. Это может быть как солнце, так и лампы различной световой температуры или пламя. Из источника света испускаются лучи, которые отражаясь, попадают в виртуальную камеру, которая и фиксирует изображение. При таком подходе достигается фотореализм. Но колоссальное количество лучей после череды отражений просто не попадают в камеру, в результате чего, ресурсы компьютера расходуются впустую. Ввиду критично низкой эффективности, этот способ просчёта света не используется. Вместо рейтрейсинга используется перевёрнутый подход - Raycasting [18]. При рейкастинге лучи испускаются не из источника света, а из камеры. То есть более направленным, сконцентрированным пучком. Те лучи, которые в итоге попадают в источник света, регистрируются, а не попавшие просто не учитываются. Стоит отметить, что чаще всего под рейтрейсингом подразумевается именно рейкастинг.

1.2.3 Biased Render

Biased (real-time, или рендер “с допущением”) отличается скоростью, но проигрывает в качестве изображения. Он применяется в задачах, где требуется отрисовка изображения в реальном времени, например видеоигры, либо визуализация, требующая отрисовки большого количества кадров в секунду. Biased рендеринг не использует физических формул и не воспроизводит реального поведения света. Вместо этого он имеет большое количество настроек, а также способов сделать изображение более реалистичным. Среди них, например, Cubemap и Lightmap. Cubemap - это изображение окружающего мира, выполненное на внутренней стороне виртуального куба, окружающего объект. Это изображение проецируется на объект со всех сторон, и так получаются отражения в реальном времени. А Lightmap - это заранее просчитанные тени, часто при помощи unbiased рендеринга. Далее тени сохраняются в отдельной текстуре, которая накладывается поверх материала. Таким образом, в real-time рендеринге будет присутствовать тень, на которую уже не надо тратить ресурсы компьютера. Кроме того, ресурсы компьютера могут тратить и множественные мелкие элементы. Стоит отметить, что как для программы-рендерера, так и для игрового движка практически нет разницы между крупным и мелким объектом. Вследствие, кадр, нагруженный большим количеством мелких элементов, будет обрабатываться гораздо дольше. Чтобы решить эту проблему и добавить выразительности, не теряя при этом в производительности, используют карты нормалей. Карты нормалей - это текстуры, которые добавляют иллюзию объёмности, не изменяя при этом геометрию объекта. Принцип заключается в том, чтобы сделать полноценный “high-poly” объект и зафиксировать на нём все неровности, царапины или швы в кирпичной кладке и зафиксировать их на специальной текстуре. Затем создаётся тот же объект, но уже “low-poly”, то есть с маленьким количеством полигонов. Там где были зафиксированы эти неровности будут уже плоские полигоны. После чего, на эти плоские места накладывается карта нормалей, и на рендере получается объект, который на первый взгляд трудно отличить от оригинального.

Для окрашивания виртуальных объектов используется шейдинг, либо текстурирование. Шейдеры - это процедурный способ создания материала. В оффлайн рендеринге используются PBR (Physically Based Rendering) текстуры [19]. Такие текстуры воспроизводят физические свойства объекта. Есть два основных варианта окраски объекта. Это surface (поверхность) и volume (объём). Surface output - это способ для окраски объектов, у которых есть поверхность. При попадании лучей на эту поверхность, материал заставляет их отражаться, рассеиваться или преломляться. При помощи него можно имитировать как обыкновенные поверхностные материалы, например, дерево или металл, так и зеркальную поверхность, мёд, воду или стекло. Но этот подход способен окрасить объект только если камера находится снаружи него. Для того чтобы разместить камеру в тумане или под водой, используется Volume output. Шейдер объёма применяет физические свойства вне зависимости от расположения камеры. С его помощью легко настраивать частицы. Текстурирование осуществляется при помощи заранее подготовленной для отдельного объекта текстуры.

1.2.4 Типы построения сфер

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

? UV - сфера

? Ico - сфера

? Roundcube

? Сфера Фибоначчи

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

Рис. 1.13. UV - сфера

Ico - сфера отличается тем, что каждый из её полигонов - треугольник. У такой сферы очень равномерная полигональная сетка, но минусом такой сферы является неудобство контроля количества этих полигонов. Единственной её настройкой, отвечающей за их количество является количество подразделений (subdivisions). Примитив базируется на икосаэдре, поэтому имеет 20 граней. А при каждом подразделении полигоны этой сферы разделяются на 4 более маленьких треугольника. Таким образом при 5 подразделении он будет состоять из 5120 треугольников, а при 6 уже из 20480.

Рис. 1.14. Ico - сферы

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

Рис. 1.15. Кубическая сфера

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

Рис. 1.16. Сфера Фибоначчи

2. Создание дополнения для Blender на Python

2.1 Скриптинг в Blender

Аддоны в blender можно добавить прямо через сам blender. Там есть вкладка Scripting, в которой открывается поле с кодом, где сразу можно открыть один из шаблонов кода. Рядом открывается окно layout, в котором можно протестировать работу аддона. Если в этом окне вручную использовать какие-либо инструменты, в специальном окне под консолью будет показан код использованного инструмента. Таким образом его легко можно будет реализовать в аддоне. Весь код, который может быть использован для создания аддона находится в библиотеке bpy. Вся информация об этой библиотеке находится на сайте блендера. Программировать можно не только во встроенном текстовом редакторе, но и в стороннем. В таком случае нужно оставить в Blender ссылку на файл с расширением.py и от итерации к итерации тестировать аддон в самом 3D редакторе. Встроенный текстовый редактор блендера не обладает широким спектром возможностей современных IDE, таких как автосохранение, гипертекст и система контроля версий. Однако, удобство работы непосредственно через блендер заключается в том, что в одном окне собран весь необходимый функционал для тестов и отладки.

2.2 Создание аддона для Blender

Скриптинг в блендере производится на языке python. Для этого существует библиотека bpy, позволяющая подключаться к API блендера. Поэтому сначала надо импортировать библиотеку [20].

import bpy

Любой скрипт можно запустить через вкладку Scripting, но мы сразу будем создавать аддон. Делается это схожим с созданием библиотек принципом. Сначала нужно объявить класс:

class PlanetPanel(bpy.types.Panel):

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

bl_label = "Planet Geometry Addon"

bl_idname = "SCENE_PT_layout"

bl_space_type = 'PROPERTIES'

bl_region_type = 'WINDOW'

bl_context = "scene"

Помимо этого, для работы необходимо прописать ещё две функции:

def register():

bpy.utils.register_class(LayoutDemoPanel)

def unregister():

bpy.utils.unregister_class(LayoutDemoPanel)

Чтобы работала стандартная для библиотек проверка:

if __name__ == "__main__":

register()

Перейдём непосредственно к логике аддона. Объявляется функция draw и сразу же создаются ссылки для сокращения записей.

def draw(self, context):

layout = self.layout

scene = context.scene

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

bl_space_type = 'PROPERTIES'

bl_region_type = 'WINDOW'

bl_context = "scene"

Теперь наше меню появится в меню Properties во вкладке Scene Properties. Первой функцией, которая нам понадобится, будет создание скруглённого куба. Это позволяет сделать метод

bpy.ops.mesh.primitive_round_cube_add()

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

bpy.ops.mesh.primitive_round_cube_add(radius=1, arc_div=124)

Метод создаёт примитив через интерактивную консоль, но нам нужна кнопка меню, автоматически выполняющая эту операцию. Для этого создадим функцию:

def add_planet_surface(context):

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

bpy.ops.mesh.primitive_round_cube_add(radius=1, arc_div=64)

global obj_name

obj_name = bpy.data.objects.keys()[-1]

base_geometry = bpy.data.objects[o_name]

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

bpy.ops.texture.new()

global t_name

t_name = bpy.data.textures.keys()[-1]

bpy.data.textures[t_name].type = 'DISTORTED_NOISE'

bpy.data.textures[t_name].noise_basis = 'IMPROVED_PERLIN'

bpy.data.textures[t_name].noise_distortion = 'VORONOI_F4'

Следующим действием изменяется геометрию сферы на основе шума. Для этого к сфере применяется модификатор Displace. Этот модиификатор принимает в качестве входных данных текстуру, переводит её в формат “grayscale” и, в зависимости от цветов пикселей, изменяет положение точек объекта. Более светлые пиксели перемещают точки в направлении их нормалей. В нашем случае, нормали каждой точки направлены от центра окружности, таким образом, они образуют возвышенности. Более тёмные точки в свою очередь перемещают точки в направлении к центру окружности, образуя впадины. После этого на планету применяется настройка сглаженного отображения теней (Shade Smooth) для сглаживания поверхности без увеличения количества полигонов.

modifier = base_geometry.modifiers.new(name="Displace", type='DISPLACE')

modifier.texture = bpy.data.textures[t_name]

modifier.strength = 0.1

bpy.ops.object.shade_smooth()

Сила действия модификатора сразу указана со значением 0,1. Такого значения достаточно для отображения шума, повторяющего ландшафт. Если оставить большее значение, ландшафт будет неестественным. Чтобы добавить кнопку, воспроизводящую вышеуказанный алгоритм, нужно зарегистрировать класс. Ему присваивается идентификатор и название.

class AddOperator(bpy.types.Operator):

bl_idname = "object.add_operator"

bl_label = "Add Planet Surface"

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

def execute(self, context):

add_planet_surface(context)

return {'FINISHED'}

Для завершения работы с планетой нужно закрепить изменения ландшафта. Для этого модификатор “применяется” (Apply).

def apply_planet_surface(context):

bpy.ops.object.modifier_apply(modifier='Displace')

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

class ApplyOperator(bpy.types.Operator):

"""Executes the function which applies distortion modifier"""

bl_idname = "object.apply_operator"

bl_label = "Apply Planet Surface"

def execute(self, context):

apply_planet_surface(context)

return {'FINISHED'}

В классе Planet Panel нужно добавить функцию, отвечающую непосредственно за отрисовку панели в боковом меню. Для непосредственно отрисовки меню создаётся функция draw. В ней для удобства и читаемости кода сокращаем.

def draw(self, context):

layout = self.layout

scene = context.scene

obj = context.object

В классе UILayout существуют методы, позволяющие настроить расположение кнопок в меню. Функция colгьт позволяет расположить элементы в вертикальную колонну, row располагает в ряды, а split создаёт пробел, таким образом завершая колонну или ряд. Кнопки же создаются при помощи функций operator или prop. Operator создаёт кнопку, по нажатию выполняющую другую функцию из библиотеки блендера, либо запуская работу зарегистрированного класса. Prop - функция, создающая кнопку изменяющую какое-либо свойство объекта. Её внешний вид изменяется в зависимости от типа изменяемой переменной. Это могут быть переменные трёх типов: Bool, Float и String. Соответственно, для переменной Bool, prop принимает вид галочки, для Float - ползунка, значение которого можно настраивать как перемещением мышки, так и вводом значения с клавиатуры, а для переменной String это поле, в которое можно ввести текст. Далее в коде создаётся кнопка, запускающая скрипт создания планеты и присвоения ей модификатора с текстурой шума.

row.operator("object.add_operator", icon='RNDCURVE')

В качестве названия по умолчанию для кнопки применяется название класса, идентификатор которого указывается в качестве первого аргумента. Также, в аргументах для этой функции указывается иконка “RNDCURVE”, наглядно передающая смысл выполняемой операции. Для настройки и изменения форм рельефа в меню нужно добавить ползунки, отвечающие за изменение некоторых значений текстуры. Делается это при помощи функции prop. Эта функция в качестве основных аргументов принимает адрес списка, где находится объект, чьё свойство необходимо изменить и название этого свойства. Нам нужен объект из списка bpy.data.textures, а его ключ мы сразу после создания записали в переменную t_name.

texture = bpy.data.textures[t_name]

col.prop(texture, "distortion", text='Shape')

Первое свойство, которое нужно изменить это distortion. Оно ключевым образом меняет геометрию, поэтому кнопке даётся название “Shape”. аналогично и с другими свойствами.

col.prop(texture, "noise_scale", text='Noise Scale')

col.prop(texture, "intensity", text='Altitude')

col.prop(texture, "contrast", text='Altitude Difference')

Для Noise Scale название остаётся таким же, в то время, как “intensity” и “contrast” меняются на “Altitude” и “Altitude Difference”, в соответствии с их назначением. Кроме того, размер планеты тоже необходимо изменять посредством кнопок.

object = bpy.data.objects[obj_name]

col.prop(object, "scale", text='Planet Size')

Если объекта с таким именем не будет существовать, программа выдаст ошибку KeyError. Для этого применяется конструкция try - except. Если программа остановится, выдавая ошибку KeyError, программа будет располагать в панели кнопку создания планеты, а если скрипт найдёт такой элемент в списке, тогда вместо этой кнопки на панели будут расположены ползунки, отвечающие за свойства планеты. Итоговая конструкция выглядит следующим образом:

try:

texture = bpy.data.textures[t_name]

object = bpy.data.objects[obj_name]

row.operator("object.apply_operator", icon='ERROR')

split = layout.split()

col = split.column(align=True)

col.label(text="Surface Settings:")

col.prop(texture, "distortion", text='Shape')

col.prop(texture, "noise_scale", text='Noise Scale')

col.prop(texture, "intensity", text='Altitude')

col.prop(texture, "contrast", text='Altitude Difference')

split = layout.split()

col = split.column()

col.prop(object, "scale", text='Planet Size')

except KeyError:

split = layout.split()

row = layout.row()

row.operator("object.add_operator", icon='RNDCURVE')

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

bpy.ops.mesh.primitive_round_cube_add(radius=0.96, size=(0.01, 0.01, 0.01), arc_div=40)

bpy.ops.object.shade_smooth()

global water_name

water_name = bpy.data.objects.keys()[-1]

class AddWater(bpy.types.Operator):

"""Executes the function which creates a planet water"""

bl_idname = "object.add_water_operator"

bl_label = "Add Planet Water"

def execute(self, context):

add_planet_water(context)

return {'FINISHED'}

Из настроек для поверхности воды понадобится только размер сферы, поэтому в def draw прописывается аналогичная конструкция обработки ошибок. Для кнопки создания поверхности воды указывается значок с каплей “MOD_FLUIDSIM”.

try:

water = bpy.data.objects[water_name]

split = layout.split()

col.prop(water, "scale", text='Water Level')

except KeyError:

split = layout.split()

row = layout.row()

row.operator("object.add_water_operator", icon='MOD_FLUIDSIM')

Аналогично создаётся и атмосфера. Для неё указывается радиус 1.1, то есть на 10% больше основной сферы.

def add_planet_atmoshpere(context):

bpy.ops.mesh.primitive_round_cube_add(radius=1.1, size=(0.01, 0.01, 0.01), arc_div=40)

global atmo_name

atmo_name = bpy.data.objects.keys()[-1]

class AddAtmosphere(bpy.types.Operator):

"""Executes the function which creates a planet atmoshpere"""

bl_idname = "object.add_atmosphere_operator"

bl_label = "Add Planet Atmosphere"

def execute(self, context):

add_planet_atmoshpere(context)

return {'FINISHED'}

В def draw также аналогичный скрипт.

def add_planet_atmoshpere(context):

bpy.ops.mesh.primitive_round_cube_add(radius=1.1, size=(0.01, 0.01, 0.01), arc_div=40)

global atmo_name

atmo_name = bpy.data.objects.keys()[-1]

class AddAtmosphere(bpy.types.Operator):

"""Executes the function which creates a planet atmoshpere"""

bl_idname = "object.add_atmosphere_operator"

bl_label = "Add Planet Atmosphere"

def execute(self, context):

add_planet_atmoshpere(context)

return {'FINISHED'}

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

CLASSES = [

AddOperator,

ApplyOperator,

PlanetPanel,

AddWater,

AddAtmosphere,

]

def register():

for another_class in CLASSES:

bpy.utils.register_class(another_class)

def unregister():

for another_class in reverse(CLASSES):

bpy.utils.unregister_class(another_class)

В функции unregister список переворачивается при помощи оператора reverse(). Это делается для того, чтобы не возникло ошибки, когда класс, наследуемый другими классами не отключался перед зависимыми классами. Запускается скрипт с стандартной проверкой является ли запускаемая функция запускаемой вручную.

if __name__ == "__main__":

register()

2.3 Панель в меню и результат работы программы

Итоговая панель аддона находится в меню Properties во вкладке Scene Properties. Она содержит кнопки создания планеты с её ландшафтом, поверхности воды и атмосферы. На рис. 2.1. показана панель до начала работы.

Рис. 2.1. Панель до начала работы

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

Рис. 2.2. Панель после создания ландшафта

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

Рис. 2.3. Создаваемый ландшафт

2.4 Установка аддона

Установка аддонов в Blender очень простая. Если необходимо установить сторонний аддон, не входящий в список предустановленных, тогда сначала нужно скачать аддон на компьютер.

Данный аддон находится по следующей ссылке: https://github.com/CthulhuF/PlanetGenerationAddon/blob/master/main.py

Следующим шагом нужно включить Blender. После чего нужно открыть вкладку Edit в верхнем меню. Затем открыть вкладку Preferences. В левом меню нажать кнопку Add-ons. В открывшемся меню нажать кнопку Install и указать путь к файлу в файловой системе. Затем аддон появится в общем списке аддонов во вкладке Add Mesh. Остаётся только активировать его, нажав галочку в строке с его названием. После этого, меню аддона появится в боковом меню Preferences во вкладке Scene Preferences.

Заключение

Подводя итоги работы, можно заключить, что шум не всегда бывает бесполезен. Существует множество способов с его помощью создать реалистичные случайные структуры, например, ландшафта, дыма, огня и облаков. Накладывая разные шумы друг на друга можно получать различный непредсказуемый результат. Тем не менее, работа с процедурными текстурами очень комплексная и действительно может отнимать большое количество времени. В то время как для новичка в 3D моделировании разобраться с основными принципами работы в этой сфере может быть нелегко. Благодаря созданному аддону легко получить впечатляющий результат даже людям, у которых нет большого количества времени на изучение функционала программы Blender. Но и для профессионалов он может быть полезным, если задача подразумевает создание большого количества различных планет. Его польза заключается в ускорении работы с последовательным созданием геометрии, модификаторов и карт шума. Стоит также отметить, что Blender предлагает очень гибкую систему создания пользовательских дополнений. Это могут быть как полноценные аддоны, так и небольшие скрипты, упрощающие или ускоряющие работу. Благодаря такой системе, Blender стал весьма конкурентоспособной средой моделирования, предлагающей широкие возможности как для программистов, способных кастомизировать существующий функционал программы, так и для пользователей, которым таким образом становится доступным широкий спектр бесплатных, либо весьма недорогих модификаций, упрощающих работу.

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

Список литературы

1. Трехмерное моделирование в современном мире // habr. - URL: https://habr.com/ru/post/451266/ (дата обращения: 04.06.2021).

2. What is coherent noise? // libnoise. - URL: http://libnoise.sourceforge.net/glossary/index.html (дата обращения: 04.06.2021).

3. Шум Перлина // habr. - URL: https://habr.com/ru/post/342906/ (дата обращения: 04.06.2021).

4. White Noise // wikipedia URL: https://en.wikipedia.org/wiki/White_noise (дата обращения: 04.06.2021).

5. Value Noise Lattice Noise // Catlike Coding. - URL: https://catlikecoding.com/unity/tutorials/pseudorandom-noise/value-noise/ (дата обращения: 05.06.2021).

6. Noise // thebookofshaders URL: https://thebookofshaders.com/11/ (дата обращения: 05.06.2021).

7. simplex-noise.js // npm. - URL: https://www.npmjs.com/package/simplex-noise (дата обращения: 05.06.2021).

8. Noise Hardware // umbc. - URL: https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf (дата обращения: 04.06.2021).

9. Диаграмма Вороного и её применения // habr. - URL: https://habr.com/ru/post/309252/ (дата обращения: 04.06.2021).

10. Voronoi Noise // ProgrammerSought. - URL: https://programmersought.com/article/48423820693/ (дата обращения: 05.06.2021).

11. Voronoi and Worley (cellular) noise // godot shaders. - URL: https://godotshaders.com/snippet/voronoi/ (дата обращения: 05.06.2021).

12. worley-noise // npm. - URL: https://www.npmjs.com/package/worley-noise (дата обращения: 05.06.2021).

13. Polygonal Map Generation for Games // Red Blob Games. - URL: http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/ (дата обращения: 04.06.2021).

14. Rendering on the Web // web.dev. - URL: https://web.dev/rendering-on-the-web/ (дата обращения: 04.06.2021).

15. О пайплайне // dtf. - URL: https://dtf.ru/indie/27931-o-payplayne (дата обращения: 04.06.2021).

16. Лаптев Г.Ф. Элементы Векторного Счисления. - 1 изд. - Москва: "Наука" Главная редакция физико-математической литературы, 1975. - 336 с.

17. Rendering on the Web // web.dev. - URL: https://web.dev/rendering-on-the-web/ (дата обращения: 04.06.2021).

18. Ray Casting // wikipedia. - URL: https://en.wikipedia.org/wiki/Ray_casting (дата обращения: 04.06.2021).

19. Что такое PBR? Часть V // render. - URL: https://render.ru/ru/ushakov.cg.channel/post/17368 (дата обращения: 04.06.2021).

20. Blender 3.1 Python API Documentation // Blender. - URL: https://docs.blender.org/api/current/ (дата обращения: 20.05.2021).

Размещено на Allbest.ru

...

Подобные документы

  • Понятие фрактала, принципы создания изображения. Разработка алгоритма и режимов генерации ландшафта. Описание программы FracLandscapes.exe. в среде разработки Delphi 10. Примеры построения ландшафта с использованием различных режимов и количества изгибов.

    курсовая работа [688,9 K], добавлен 04.05.2014

  • Программы для создания 3D моделей, их возможности: blender, 3DsMax. Скелетная анимация или Риггинг. Ragdoll, motioncapture, нейронные сети. Сущность термина "тряпичная кукла". Основное преимущество ragdoll-анимации перед традиционной. Анимация, фреймы.

    реферат [8,5 M], добавлен 21.02.2022

  • Обзор существующих программ трехмерной графики: 3D Studio MAX, iClone, Blender, выявление их возможностей. Анализ истории разработки программ 3D и направлений их дальнейшего развития. Практическое применение программы iClone для создания 3D-анимации.

    курсовая работа [1,8 M], добавлен 20.11.2010

  • Изучение конструкции жидкокристаллического монитора, его основные параметры и принцип работы. Схема создания изображения, описание интерфейсов. Общие подходы к диагностике проблем в данных типах мониторов, способы ремонта и устранения неисправностей.

    курсовая работа [1,8 M], добавлен 14.12.2012

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

    контрольная работа [4,7 M], добавлен 13.01.2012

  • Изучение программы обработки баз данных Microsoft Access. Особенности и принципы создания баз данных, форм для работы с ними, межтабличных связей. Конструирования различных видов отчетов. Создание кнопочной формы с помощью диспетчера, итоговых запросов.

    лабораторная работа [2,1 M], добавлен 11.03.2013

  • C++ как универсальный язык программирования, его сущность, назначение, классы и возможности. Блок-схема и листинг программы KURS.EXE, ее принцип работы, системные требования, возможные неполадки и способы их устранения. Листинг заставки VOVA777.EXE.

    курсовая работа [422,3 K], добавлен 31.05.2010

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

    курсовая работа [450,8 K], добавлен 22.07.2012

  • Использование UDP для экспорта данных в MS Project. Документирование моделей, формирование HTML-отчета. Технология создания SADT модели. Стоимостной анализ (Activity Based Costing). Способы создания диаграммы Ганта с помощью программы Microsoft Project.

    курсовая работа [6,2 M], добавлен 24.09.2013

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

    курсовая работа [65,7 K], добавлен 30.11.2009

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

    контрольная работа [681,9 K], добавлен 13.01.2010

  • Создание отчета как объекта базы данных. Структура отчета в режиме Конструктора, способы его создания. Скоростные характеристики СУБД Access, использование программы в пакете Microsoft Office. Разработка базы данных "Сотрудники ресторана ВасабиКо".

    контрольная работа [17,7 K], добавлен 06.12.2010

  • Написание программы для генерации случайных чисел, в которой реализуются возможности генерации абсолютно случайных чисел. Приложение на языке С/С++. Описание узла, содержащего данные; функций и методов работы; чтения данных из памяти и вывода их на экран.

    курсовая работа [172,4 K], добавлен 23.05.2012

  • Изучение истории развития и становления 3D-технологий с середины XX века до нашего времени. Основные инструменты 3D-программы. Игры как направление современного компьютерного дизайна. Способы применения 3D-технологий в оформлении игровой составляющей.

    курсовая работа [7,3 M], добавлен 14.10.2016

  • Теоретические основы нейминга. Методология создания имени. Алгоритм работы генератора названий и разбиения слова на слоги. Разработка функции деления слова на слоги. Осуществление группировки слогов в слова. Рождение имен. Анализ полученного генератора.

    курсовая работа [35,5 K], добавлен 26.05.2009

  • Изучение базовых понятий объектно-ориентированного программирования. Исследование принципов работы с классами и объектами. Построение системы классов для описания плоских геометрических фигур. Анализ методов создания объектов, перемещения на плоскости.

    лабораторная работа [212,0 K], добавлен 10.03.2013

  • Объектно-ориентированные возможности языка C++. Моделирование системы геометрических фигур, методика проектирования программных комплексов. Анализ предметной области, технология создания объектной модели. Упрощение классов при использовании наследования.

    курсовая работа [668,8 K], добавлен 22.09.2011

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

    курсовая работа [3,5 M], добавлен 22.06.2012

  • Определение, история создания и развития компьютерных вирусов; способы их распространения и борьбы с ними. Классификация вирусов по среде обитания, деструктивным возможностям и особенностям алгоритма работы; резидентные и нерезидентные программы.

    контрольная работа [37,9 K], добавлен 27.04.2014

  • Основные подходы при создании Windows приложений. Изучение навыков работы с 2D графикой в Windows приложениях. Методы генерации псевдослучайных чисел. Разработка игры "Сапер" с расположением мин на основе нескольких методов генерации случайных чисел.

    курсовая работа [63,2 K], добавлен 18.02.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.