Прототипирование уровней с помощью CSG

CSG расшифровывается как Constructive Solid Geometry, и представляет собой инструмент для объединения базовых форм или пользовательских сеток для создания более сложных форм. В программах для 3D-моделирования CSG в основном известны как "булевы операторы".

Прототипирование уровней - одно из основных применений CSG в Godot. Эта техника позволяет пользователям создавать простые версии наиболее распространённых форм путём комбинирования примитивов. Внутренние среды могут быть созданы с помощью инвертированных примитивов.

Примечание

Узлы CSG в Godot предназначены, в основном, для создания прототипов. У них нет встроенной поддержки UV-маппинга или редактирования 3D-полигонов (хотя экструдированные 2D-полигоны можно использовать с помощью узла CSGPolygon).

Если вы ищете простой в использовании инструмент проектирования уровней для проекта, возможно, вам стоит воспользоваться Qodot. Он позволяет создавать уровни с помощью TrenchBroom и импортировать их в Godot.

../../_images/csg.gif

Знакомство с узлами CSG

Как и другие функции Godot, CSG поддерживается в виде узлов. Это узлы CSG:

../../_images/csg_nodes.png ../../_images/csg_mesh.png

Особенности инструментов CSG

Каждый узел CSG поддерживает 3 вида булевых операций:

  • Union (объединение): Геометрия обоих примитивов объединяется, пересекающаяся геометрия удаляется.

  • Intersection (пересечение): остаётся только пересекающаяся геометрия, остальное удаляется.

  • Subtraction (вычитание): Вторая фигура вычитается из первой, оставляя вмятину своей формы.

../../_images/csg_operation_menu.png ../../_images/csg_operation.png

CSGPolygоn

Узел CSGPolygon выдавливает полигон, нарисованный в 2D (в координатах X, Y), следующими способами:

  • Depth (глубина): Выдавливается назад на заданную величину.

  • Spin (вращение): Выдавливается, вращаясь вокруг своего источника.

  • Path (путь): Выдавливается вдоль узла Path. Эта операция обычно называется лофтингом.

../../_images/csg_poly_mode.png ../../_images/csg_poly.png

Примечание

Для работы режима Path необходимо предоставить узел Path. В узле Path нарисуйте путь и полигон в CSGPolygon будет выдавливаться по заданному пути.

Пользовательские меши

Для CSGMesh можно использовать любую сетку; сетка может быть смоделирована в другой программе и импортирована в Godot. Поддерживаются несколько материалов. Существуют некоторые ограничения для геометрии:

  • он должен быть закрыт,

  • он не должен самопересекаться,

  • он не должен содержать внутренних граней,

  • каждая грань должна соединяться только с двумя другими гранями.

../../_images/csg_custom_mesh.png

СSGCombiner

Узел CSGCombiner - это пустая форма, используемая для организации (группировки). Он объединяет только дочерние узлы.

Порядок обработки

Каждый узел CSG сначала обрабатывает свои дочерние узлы и их операции: объединение, пересечение или вычитание, в порядке дерева, и применяет их к себе последовательно.

Примечание

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

Прототипирование уровня

Мы создадим прототип комнаты для практического использования инструментов CSG.

Совет

Работа в ортогональной проекции даёт лучший вид при совмещении фигур CSG.

Наш уровень будет содержать эти объекты:

  • комната,

  • кровать,

  • лампу,

  • стол,

  • книжную полку.

Создайте сцену с узлом Spatial в качестве корневого узла.

Совет

Освещение среды по умолчанию не обеспечивает чёткого затенения под некоторыми углами. Измените режим отображения, используя Display Overdraw в меню 3D экрана, или добавьте узел DirectionalLight, чтобы помочь вам видеть чётко.

../../_images/csg_overdraw.png

Создайте CSGBox и назовите его room, включите Invert Faces и измените размеры комнаты.

../../_images/csg_room.png ../../_images/csg_room_invert.png

Затем создайте CSGCombiner и назовите его desk.

Стол имеет одну поверхность и 4 ножки:

  • Создайте 1 дочерний узел CSGBox в режиме Union для поверхности и настройте размеры.

  • Создайте 4 дочерних узла CSGBox в режиме Union для ножек и настройте размеры.

Отрегулируйте их расположение, чтобы они напоминали стол.

../../_images/csg_desk.png

Примечание

CSG-узлы внутри CSGCombiner будут выполнять свои операции только в пределах этой группы. Поэтому CSGCombiners используются для организации CSG-узлов.

Создайте CSGCombiner и назовите его bed.

Наша кровать состоит из 3 частей: кровати, матраса и подушки. Создайте CSGBox и настройте его размеры для кровати. Создайте еще один CSGBox и настройте его размеры для матраса.

../../_images/csg_bed_mat.png

Мы создадим ещё один CSGCombiner с именем pillow как дочерний элемент bed. Дерево сцены должно выглядеть следующим образом:

../../_images/csg_bed_tree.png

Мы объединим 3 узла CSGSphere в режиме Union, чтобы сформировать подушку. Масштабируйте ось Y сфер и включите Smooth Faces.

../../_images/csg_pillow_smooth.png

Выберите узел pillow и переключите режим на Subtraction; объединённые сферы прорежут отверстие в матрасе.

../../_images/csg_pillow_hole.png

Попробуйте повторно привязать узел pillow к корневому узлу Spatial; дыра исчезнет.

Примечание

Это иллюстрирует влияние порядка обработки CSG. Поскольку корневой узел не является узлом CSG, узлы CSGCombiner являются завершением операций; это показывает использование CSGCombiner для организации сцены CSG.

Отмените re-parent после наблюдения за эффектом. Собранная вами кровать должна выглядеть так:

../../_images/csg_bed.png

Создайте CSGCombiner и назовите его lamp.

Лампа состоит из трёх частей: подставки, столба и абажура. Создайте CSGCylinder, включите опцию Cone и сделайте его подставкой. Создайте ещё один CSGCylinder и измените размеры, чтобы использовать его в качестве шеста.

../../_images/csg_lamp_pole_stand.png

Мы будем использовать CSGPolygon для абажура. Используйте режим Spin для CSGPolygon и нарисуйте трапезоид <https://en.wikipedia.org/wiki/Trapezoid> на виде спереди (цифровая клавиатура 1); эта форма будет выдавливаться вокруг центра и формировать абажур.

../../_images/csg_lamp_spin.png ../../_images/csg_lamp_polygon.png ../../_images/csg_lamp_extrude.png

Отрегулируйте расположение 3 частей, чтобы получилась лампа.

../../_images/csg_lamp.png

Создайте CSGCombiner и назовите его bookshelf.

Для книжной полки мы будем использовать 3 узла CSGBox. Создайте CSGBox и настройте его размеры; это будет размер книжной полки.

../../_images/csg_shelf_big.png

Дублируйте CSGBox, уменьшите размеры каждой оси и измените режим на Subtraction (вычитание).

../../_images/csg_shelf_subtract.png ../../_images/csg_shelf_subtract_menu.png

Вы почти построили полку. Создайте ещё один CSGBox для разделения полки на два уровня.

../../_images/csg_shelf.png

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

../../_images/csg_room_result.png

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

Использование прототипов текстур

Godot Spatial Material поддерживает triplanar mapping, который можно использовать для автоматического наложения текстуры на произвольные объекты без искажений. Это удобно при использовании CSG, так как Godot пока не поддерживает редактирование UV карт на узлах CSG. Трипланарное отображение относительно медленное, что обычно ограничивает его использование органическими поверхностями, такими как рельеф. Тем не менее, при создании прототипов его можно использовать для быстрого наложения текстур на уровни на основе CSG.

Примечание

Если вам нужны текстуры для создания прототипов, Кенни сделал набор текстур для прототипов с лицензией CC0.

Существует два способа применения материала к узлу CSG:

  • Применение его к узлу CSGCombiner как переопределение материала (Geometry > Material Override в инспекторе). Это автоматически повлияет на его дочерние элементы, но сделает невозможным изменение материала в отдельных дочерних элементах.

  • Применение материала к отдельным узлам (Material в инспекторе). Таким образом, каждый узел CSG может иметь свой собственный вид. Вычитаемые CSG-узлы будут применять свой материал к узлам, в которых они "копаются".

Чтобы применить трипланарное отображение к узлу CSG, выберите его, перейдите в инспектор, щёлкните по [empty] рядом с текстом Material Override (или Material для отдельных узлов CSG). Выберите New SpatialMaterial. Нажмите на иконку вновь созданного материала, чтобы отредактировать его. Разверните раздел Albedo и загрузите текстуру в свойство Texture. Теперь разверните раздел Uv1 и отметьте Triplanar. Вы можете изменить смещение и масштаб текстуры по каждой оси, играя со свойствами Scale и Offset, указанными выше. Более высокие значения свойства Scale заставят текстуру повторяться чаще.

Совет

Вы можете скопировать SpatialMaterial, чтобы повторно использовать его в узлах CSG. Для этого щёлкните выпадающую стрелку рядом со свойством материала в инспекторе и выберите Copy (копировать). Чтобы вставить материал, выберите узел, к которому вы хотите применить материал, щёлкните выпадающую стрелку рядом со свойством материала и выберите Paste (вставить).