Первые шаги с Комнатами и Порталами

RoomManager

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

Преобразование комнаты

Это преобразование должно выполняться каждый раз, когда вы хотите активировать систему. Он не сохраняет room graph в вашем проекте (для гибкости и экономии памяти). Вы можете либо запустить его, нажав кнопку Convert Rooms на панели инструментов редактора (которая также имеет сочетание клавиш), либо вызвать метод rooms_convert() в RoomManager. Этот последний метод будет тем, что вы будете использовать в игре. Обратите внимание, что в целях безопасности лучше всего вызывать rooms_clear() перед выгрузкой или изменением уровней.

../../../_images/convert_rooms_button.png

Если вы конвертируете уровень во время работы редактора, система выбраковки порталов заменит обычную выбраковку фрустума Godot, что может помешать работе редактора. Чтобы обойти это, вы можете включать и выключать выборку порталов, используя либо переключатель View Portal Culling в меню View на панели инструментов редактора (который также имеет комбинацию клавиш), либо параметр Active в узле RoomManager.

Примечание

Чтобы использовать RoomManager, вы должны указать ему, где находятся комнаты в вашем дереве сцены, или в некоторых случаях - где находится узел RoomList. Этот RoomList является родительским для ваших room - см. ниже. Если RoomList не задан, преобразование завершится ошибкой, и вы увидите диалоговое окно с предупреждением.

../../../_images/room_manager.png

Список комнат (RoomList)

Прежде чем создавать комнаты, необходимо создать узел, который будет являться родителем всех статических объектов, комнат, групп комнат и т.д. на нашем уровне. Этот узел называется ``RoomList''.

../../../_images/roomlist_node.png

Примечание

Список комнат не является специальным типом узла - он может быть обычным пространственным узлом.

Вам нужно будет назначить узел списка комнат в RoomManager, чтобы RoomManager знал, где найти комнаты.

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

Often you will end up completely replacing the roomlist branch at runtime in your game as you load and unload levels.

Комнаты

Что такое комната?

Rooms are a way of spatially partitioning your level into areas that make sense in terms of level design. Rooms often quite literally are rooms (like in a building). Ultimately though, as far as the engine is concerned, a room represents a non-overlapping convex volume in which you typically place most of your objects that fall within that area.

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

Почему выпуклый?

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

Выпуклая оболочка. Корпус определяется как ряд плоскостей, обращенных наружу. Если точка находится позади всех плоскостей, то она находится внутри корпуса.

../../../_images/convex_hull.png

Почему непересекающиеся?

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

Если случайно будут созданы перекрывающиеся комнаты - редактор предупредит вас об этом при конвертировании, пометив перекрытие красной зоной.

../../../_images/room_overlap.png

The system does attempt to cope with overlapping rooms as best as possible by making the current room "sticky". Each object remembers which room it was in during the previous frame and stays within it as long as it does not move outside the convex hull room bound. This can result in some hysteresis in these overlapping zones.

There is one exception, however, for internal rooms. You do not have to worry about these to start with.

Как создать комнату?

A:ref:Room<class_Room> - это тип узла, который может быть добавлен в дерево сцены, как и любой другой. Вы можете размещать объекты внутри комнаты, делая их дочерними и внучатыми по отношению к узлу Комнаты.

Как мне определить форму и положение выпуклого корпуса моей комнаты?

Поскольку определение границ помещения является наиболее важным аспектом системы, для определения формы помещения в Godot доступны ТРИ метода:

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

  2. Manually edit the points that define the convex hull in the room inspector or drag the points around using the editor gizmo (see Редактирование точки помещения).

  3. Provide a manual bound. This is a MeshInstance in the room that has geometry in the shape of the desired bound, with a name with the postfix -bound. This is something you might choose to do if you create your levels in Blender or similar (see Создание систем помещений в Blender (или других инструментах моделирования)).

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

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

A simple pair of rooms. The portal margin is shown with translucent red, and the room hulls are shown with green wireframe.

../../../_images/simple_room.png

Порталы

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

Порталs — это специальные выпуклые полигоны, которые вы размещаете над проемами между комнатами, чтобы система могла видеть между ними. Вы можете создать узел портала прямо в редакторе. Портал по умолчанию имеет 4 точки и ведет себя как плоскость MeshInstance. Вы можете добавлять или удалять точки с помощью инспектора. Для работы портала требуется как минимум 3 точки — это потому, что он должен формировать полигон, а не точку или линию.

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

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

../../../_images/portal_inspector.png

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

Привязка портала

There are two ways to specify which room the portal should link to:

  • Оставьте поле Связанная комната в инспекторе пустым. Система попытается автосвязать портал с ближайшей соседней комнатой во время преобразования. В большинстве случаев это работает нормально.

  • Явно укажите комнату, установив Linked Room в инспекторе.

Примечание

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

Trying it out

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

../../../_images/simple_scenetree.png

Теперь вы освоили основные принципы работы системы.

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