Узлы окклюдера

В дополнение к окклюзии с помощью :ref: doc_rooms_and_portals, Godot также имеет возможность обеспечить базовую окклюзию с помощью простых геометрических узлов Occluder. Это геометрические фигуры, которые отображаются в редакторе с помощью gizmos, но невидимы во время выполнения.

Любой объект, который полностью закрыт формой (позади или в некоторых случаях внутри), будет обрезан во время выполнения. Они разработаны так, чтобы быть простыми в использовании и недорогими во время выполнения, но компромисс заключается в том, что они могут быть не такими эффективными при отбраковке, как :ref: doc_rooms_and_portals. Тем не менее, в некоторых ситуациях они все еще могут значительно повысить производительность.

Примечание

Важно понимать, что геометрические окклюдеры работают путем тестирования выровненной по оси граничной области (AABB) окклюдируемого объекта против окклюдера. При этом AABB должна быть полностью окклюдирована, чтобы быть отсеянной. Следствием этого является то, что небольшие объекты с большей вероятностью будут эффективно отсеяны, чем крупные, а крупные окклюдеры, как правило, гораздо более эффективны, чем мелкие.

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

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

Сам узел окклюдер является держателем ресурса ОкклюдерСферы, который определяет функциональность. Чтобы начать, добавьте узел Окклюдер в дерево сцены.

Совет

Вы увидите желтый предупреждающий треугольник, предупреждающий, что вы должны установить OccluderShape (фигуру преграды) из инспектора, прежде чем Occluder (преграда) заработает.

OccluderShapeSphere (Сферическая форма окклюдера)

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

После того, как вы добавили OccluderNode и выбрали добавление новой OccluderShapeSphere в инспекторе, щелкните OccluderShapeSphere в инспекторе, чтобы открыть параметры.

../../_images/occluder_shape_sphere_inspector.png

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

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

../../_images/occluder_shape_sphere_terrain.png

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

Хотя вы можете изменить положение сферы с помощью преобразования Occluder Node в инспекторе, это перемещает * весь массив* сфер. Если вы хотите использовать несколько сфер в одном occluder, эту работу выполняют ручки. Чтобы разрешить позиционирование в 3D, gizmo будет перемещать 3D-положение только по двум основным осям в зависимости от точки обзора в редакторе. Вам легче освоиться с этим, попробовав, чем объяснив.

Совет

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

Во время выполнения, сферы можно включать и выключать, изменяя видимость Occluder node , а Узел можно перемещать, масштабировать, поворачивать и т.д.

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

OccluderShapePolygon (Полигон формы ограничителя)

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

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

Примечание

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

Редактирование и детали

Полигоны преград редактируются как список точек, определяющих выпуклый полигон на одной плоскости, точки определяются в 2D-пространстве, а не в 3D. Вместо этого ориентация, положение и масштаб полигона берутся из преобразования узла Occluder.

../../_images/occluder_shape_polygon_inspector.png

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

../../_images/occluder_shape_polygon.png

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

  • Редактор автоматически очистит ваши точки, чтобы сформировать выпуклый многоугольник. Если вы перетащите точку в положение, которое образовало бы вогнутый многоугольник, она будет проигнорирована.

  • В общем, чем меньше ребер (и, следовательно, точек), тем быстрее многоугольник будет работать во время выполнения. Многоугольник с 6 ребрами должен будет выполнить вдвое больше вычислений, чем многоугольник с 3 ребрами. В большинстве случаев 4 ребер достаточно.

../../_images/occluder_shape_polygon2.png

Отверстия

Уровни игры в реальном мире не всегда имеют большие непрерывные области, которые должны быть закрыты. Часто в стенах есть дверь или окна, в пещерах есть вход и т. д. В некоторых случаях нам приходится обходиться размещением вокруг такого отверстия нескольких OccluderShapePolygon (полигонов формы ограничителей), но у полигонов ограничителей есть еще один козырь в рукаве — они могут иметь "дыры" ("отверстия").

В инспекторе вы заметите, что помимо набора точек для полигона, у полигона есть набор точек для одной «дыры». Если вы добавите 3 или 4 к вашему полигону, вы увидите, что они появляются в редакторе в виде ручек небольшого размера. Вы можете перетаскивать их так же, как ручки многоугольника, чтобы сформировать выпуклое отверстие.

../../_images/occluder_shape_polygon_hole.png

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

  • Если отбрасываемый объект полностью скрыт полигоном, он проверяет, виден ли он сквозь отверстие. Если объект касается отверстия, он не отбрасывается, но если он скрыт полигоном и не виден через отверстие, он отбрасывается.

Примечание

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

Ограничения отверстий

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

  • Располагайте два отверстия в одном большом (если они расположены близко друг к другу).

  • Используйте два и больше полигонов ограничителей (OccluderPolygons).

Совет

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

Сколько полигонов ограничителей необходимо?

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

Некоторые идеи:

  • Создавайте свои уровни с использованием ограничений.

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

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

  • Не бойтесь расширять полигоны ограничителей далеко за края видимой геометрии, чтобы отсечь больше объектов — например, далеко в землю или небо.

Используйте динамические полигоны

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

Некоторые рекомендации:

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

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

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