3D текст

Введение

В проекте могут возникнуть ситуации, когда текст должен быть создан как часть 3D-сцены, а не только в HUD. Godot предоставляет 2 способа сделать это: узел Label3D и ресурс TextMesh для узла MeshInstance3D.

Кроме того, Godot позволяет позиционировать узлы управления в соответствии с позицией 3D-точки на камере. Это можно использовать как альтернативу «истинному» 3D-тексту в ситуациях, когда Label3D и TextMesh недостаточно гибки.

См. также

Вы можете увидеть 3D-текст в действии с помощью демо-проекта 3D Labels and Texts.

Эта страница не охватывает отображение GUI-сцены в 3D-среде. Для информации о том, как этого достичь, смотрите демо-проект GUI in 3D.

Label3D

../../_images/label_3d.png

Label3D ведёт себя как узел Label, но в 3D-пространстве. В отличие от узла Label, этот узел Label3D не наследует свойства темы GUI. Однако его внешний вид остаётся настраиваемым и использует те же подресурсы шрифтов, что и узлы Control (включая поддержку рендеринга шрифтов MSDF).

Преимущества

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

  • Label3D может использовать растровые шрифты и динамические шрифты (с и без MSDF или mip-текстур). Это делает его более гибким в этом отношении по сравнению с TextMesh, особенно для рендеринга шрифтов с самопересекающимися контурами или цветных шрифтов (эмодзи).

См. также

Инструкции по настройке импорта шрифтов см. в Using Fonts.

Ограничения

По умолчанию Label3D имеет ограниченное взаимодействие с 3D-средой. Он может быть перекрыт геометрией и освещён источниками света, если включён флаг Shaded. Однако он не будет отбрасывать тени, даже если Cast Shadow установлен в On в свойствах GeometryInstance3D Label3D. Это происходит потому, что узел внутренне генерирует квадратную сетку (один глиф на квадрат) с прозрачными текстурами и имеет те же ограничения, что и Sprite3D. Проблемы сортировки прозрачности также могут стать заметными, когда несколько Label3D перекрываются, особенно если у них есть контуры.

Это можно смягчить, установив режим прозрачности Label3D на Alpha Cut, ценой менее плавной визуализации текста. Режим прозрачности Opaque Pre-Pass может сохранить гладкость текста, позволяя Label3D отбрасывать тени, но некоторые проблемы с сортировкой прозрачности останутся.

Дополнительную информацию см. в разделе Сортировка прозрачности на странице ограничений 3D-рендеринга.

Качество отрендереного текста может страдать при просмотре Label3D на удалении. Чтобы улучшить качество, можно воспользоваться следующими инструкциями: enable mipmaps on the font или switch the font to use MSDF rendering.

TextMesh

../../_images/text_mesh.png

Ресурс TextMesh имеет сходство с Label3D. Оба отображают текст в 3D-сцене и используют те же подресурсы шрифтов. Однако вместо генерации прозрачных квадратов TextMesh создаёт 3D-геометрию, представляющую контуры глифов и имеющую свойства сетки. В результате TextMesh по умолчанию затеняется и автоматически отбрасывает тени на окружение. TextMesh также может иметь применённый к нему материал (включая пользовательские шейдеры).

Вот пример текстуры и того, как она применяется к сетке. Вы можете использовать текстуру ниже в качестве справочного материала для UV-карты сгенерированной сетки:

../../_images/text_mesh_texture.png ../../_images/text_mesh_textured.png

Преимущества

TextMesh имеет несколько преимуществ перед Label3D:

  • TextMesh может использовать текстуру для изменения цвета текста на каждой стороне отдельно.

  • Геометрия TextMesh может иметь реальную глубину, придавая символам трехмерный вид.

  • В отличие от Label3D, TextMesh может использовать пользовательские шейдеры.

Ограничения

У TextMesh есть некоторые ограничения:

  • В отличие от Label3D, нет встроенной поддержки контуров. Но их можно симулировать с помощью пользовательских шейдеров.

  • Поддерживает только динамические шрифты (.ttf, .otf, .woff, .woff2). Растровые шрифты в форматах .fnt или .font не поддерживаются.

  • Шрифты с самопересекающимися контурами будут отображаться неправильно. Если вы заметили проблемы с отображением шрифтов, загруженных с таких веб-сайтов, как Google Fonts, попробуйте загрузить шрифт с официального сайта его автора.

  • Для сглаживания текста, необходимо разрешить какой-нибудь метод сглаживания для сцены: например, MSAA, FXAA и временное сглаживание (TAA). Если метод сглаживания не включен, текст будет выглядеть зернистым, особенно на расстоянии. Подробнее: 3D сглаживание.

Проецируемый узел Label (или другой Control)

Есть последнее решение, которое сложнее настроить, но обеспечивает наибольшую гибкость: проецирование 2D-узла на 3D-пространство. Этого можно добиться с помощью возвращаемого значения метода unproject_position на узле Camera3D в функции _process() скрипта. Это возвращаемое значение затем следует использовать для установки свойства position узла Control.

Пример этого можно посмотреть в демо 3D waypoints.

Преимущества

  • Можно использовать любой узел, наследующий Control, включая Label, RichTextLabel и даже Button. Это обеспечивает мощное форматирование и взаимодействие с графическим интерфейсом.

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

  • Тематика управления соблюдается. Это позволяет упростить настройку, которая глобально применяется к проекту.

Ограничения

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

  • Изменение размера текста в зависимости от расстояния путем настройки свойства scale элемента управления возможно, но это нужно делать вручную. Label3D и TextMesh автоматически заботятся об этом, ценой меньшей гибкости (невозможно установить минимальный/максимальный размер текста в пикселях).

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

Стоит ли использовать Label3D, TextMesh или спроецированный Control?

В большинстве случаев рекомендуется использовать Label3D, поскольку его проще настроить и он обеспечивает более высокое качество рендеринга (особенно если отключено 3D-сглаживание).

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

Если вам нужны такие функции, как поддержка тем BBCode или Control, то использование спроецированного узла RichTextLabel — единственный выход.