Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

3D текст

Вступ

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

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

Дивись також

Ви можете побачити 3D-текст у дії за допомогою демонстраційного проекту 3D Labels and Texts.

Ця сторінка не описує, як відобразити сцену GUI у 3D-середовищі. Щоб отримати інформацію про те, як цього досягти, перегляньте демонстраційний проект GUI у 3D.

Вузол Label3D

../../_images/label_3d.png

Label3D поводиться як вузол Label, але в 3D-просторі. На відміну від вузла Label, цей вузол Label3D не успадковує властивості теми GUI. Однак його зовнішній вигляд залишається настроюваним і використовує той самий підресурс шрифту, що й контрольні вузли (включно з підтримкою відтворення шрифтів MSDF).

Переваги

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

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

Дивись також

Дивіться Використання шрифтів для вказівок щодо налаштування імпорту шрифтів.

Обмеження

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

Це можна пом’якшити, встановивши режим прозорості Label3D на Alpha Cut ціною менш плавного відтворення тексту. Режим прозорості Opaque Pre-Pass може зберегти гладкість тексту, дозволяючи Label3D відкидати тіні, але деякі проблеми з сортуванням прозорості залишаться.

Додаткову інформацію див. у розділі Сортування прозорості на сторінці обмежень 3D-візуалізації.

Якість відтворення тексту також може погіршитися, якщо Label3D дивитися на відстань. Щоб покращити якість відтворення тексту, увімкніть mipmaps для шрифту або змініть шрифт на використання відтворення MSDF.

TextMesh

../../_images/text_mesh.png

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

Ось приклад текстури та її застосування до сітки. Ви можете використовувати наведену нижче текстуру як еталон для згенерованої УФ-карти сітки:

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

Переваги

TextMesh має кілька переваг перед Label3D:

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

  • Геометрія TextMesh може мати реальну глибину, надаючи гліфам тривимірний вигляд.

  • TextMesh може використовувати власні шейдери, на відміну від Label3D.

Обмеження

У TextMesh є деякі обмеження:

  • Немає вбудованої підтримки структури, на відміну від Label3D. Однак це можна імітувати за допомогою спеціальних шейдерів.

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

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

  • Щоб згладжувати відтворення тексту, потрібно ввімкнути метод повного згладжування, наприклад MSAA, FXAA та тимчасове згладжування (TAA). Якщо жоден метод згладжування не ввімкнено, текст виглядатиме зернистим, особливо на відстані. Перегляньте 3D згладжування для отримання додаткової інформації.

Вузол Projected Label (або будь-який інший елемент керування)

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

Перегляньте демонстрацію 3D waypoints для прикладу цього.

Переваги

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

  • Підхід на основі сценаріїв забезпечує повну свободу позиціонування. Наприклад, це значно полегшує прикріплення елементів керування до країв екрана, коли вони виходять за межі екрана (для 3D-маркерів у грі).

  • Контрольна тематика дотримується. Це дає змогу легше налаштовувати проект у глобальному масштабі.

Обмеження

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

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

  • Обробка роздільної здатності та зміни співвідношення сторін має бути врахована в сценарії, що може бути складним завданням.

Чи варто мені використовувати Label3D, TextMesh чи проектований елемент керування?

У більшості сценаріїв рекомендується використовувати Label3D, оскільки його легше налаштувати та забезпечує вищу якість візуалізації (особливо якщо 3D-згладжування вимкнено).

Для складних випадків використання TextMesh є більш гнучким, оскільки дозволяє стилізувати текст за допомогою спеціальних шейдерів. Користувальницькі шейдери дозволяють змінювати кінцеву геометрію, наприклад викривляти текст уздовж поверхні. Оскільки текст є справжньою 3D-геометрією, текст може додатково мати глибину, а також може сприяти глобальному освітленню.

Якщо вам потрібні такі функції, як підтримка BBCode або Control, тоді використання спроектованого вузла RichTextLabel — єдиний шлях.