Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

3D-Text

Einführung

In einem Projekt kann es vorkommen, dass Text als Teil einer 3D-Szene und nicht nur im HUD erstellt werden muss. Godot bietet dafür zwei Methoden: den Label3D Node und die TextMesh-Ressource für einen MeshInstance3D-Node.

Zusätzlich ermöglicht Godot die Positionierung von Control-Nodes entsprechend der Position eines 3D-Punktes auf der Kamera. Dies kann als Alternative zu "echtem" 3D-Text in Situationen verwendet werden, in denen Label3D und TextMesh nicht flexibel genug sind.

Siehe auch

Sie können 3D-Text in Aktion sehen, indem Sie das "3D Labels and Texts"-Demoprojekt verwenden.

Diese Seite behandelt nicht, wie man eine GUI-Szene in einer 3D-Umgebung anzeigt. Informationen dazu finden Sie im Demoprojekt GUI in 3D.

Label3D

../../_images/label_3d.png

Label3D verhält sich wie ein Label-Node, aber im 3D-Raum. Anders als der Label-Node erbt dieser Label3D-Node nicht die Propertys eines GUI-Themes. Sein Aussehen bleibt jedoch anpassbar und verwendet dieselbe Schrift-Subresource wie Control-Nodes (einschließlich Unterstützung für MSDF Font-Rendering).

Vorteile

  • Label3D ist schneller zu erzeugen als TextMesh. Während beide einen Caching-Mechanismus verwenden, um neue Glyphen nur einmal zu rendern, wird Label3D immer noch schneller (neu) zu generieren, vor allem für langen Text. Dies kann Stutter während des Spielens auf Low-End-CPUs oder mobilen Geräten vermeiden.

  • Label3D kann Bitmap-Schriftarten und dynamische Schriftarten (mit und ohne MSDF oder Mipmaps) verwenden. Dies macht es in dieser Hinsicht flexibler als TextMesh, insbesondere bei der Darstellung von Schriften mit sich selbst überschneidenden Umrissen.

Siehe auch

Siehe Verwenden von Schriftarten für Richtlinien zur Konfiguration von Font-Importen.

Einschränkungen

Standardmäßig hat Label3D eine begrenzte Interaktion mit einer 3D-Umgebung. Es kann von Geometrie verdeckt und von Lichtquellen beleuchtet werden, wenn das Flag Shaded aktiviert ist. Er wirft jedoch keine Schatten, selbst wenn Schatten werfen in der Property der GeometryInstance3D von Label3D auf An gesetzt ist. Das liegt daran, dass der Node intern ein Quad-Mesh (eine Glyphe pro Quad) mit transparenten Texturen erzeugt und die gleichen Einschränkungen wie Sprite3D hat. Probleme mit der Transparenzsortierung können auch auftreten, wenn sich mehrere Label3Ds überschneiden, insbesondere wenn sie Umrisse haben.

Dies kann durch die Einstellung des Transparenzmodus von Label3D auf Alpha Cut abgemildert werden, allerdings auf Kosten einer weniger glatten Textdarstellung. Der Opaque Pre-Pass-Transparenzmodus kann Text-Glätte bewahren, und es gleichzeitig Label3D erlauben, Schatten zu werfen, aber einige Transparenz-Sortierungsprobleme werden bleiben.

Siehe Transparenzsortierung auf der Seite 3D-Rendering-Einschränkungen für weitere Informationen.

TextMesh

../../_images/text_mesh.png

Die TextMesh-Ressource hat Ähnlichkeiten mit Label3D. Beide stellen Text in einer 3D-Szene dar und verwenden dieselbe Font-Subressource. Anstatt jedoch transparente Quads zu generieren, erzeugt TextMesh eine 3D-Geometrie, die den Konturen der Glyphen entspricht und die Eigenschaften eines Meshs hat. Folglich ist ein TextMesh standardmäßig schattiert und wirft automatisch Schatten auf die Umgebung. Auf ein TextMesh kann auch ein Material angewendet werden (einschließlich benutzerdefinierter Shader).

Hier ist ein Beispiel für eine Textur und wie sie auf das Mesh angewendet wird. Sie können die Textur unten als Referenz für die UV-Map des generierten Meshes verwenden:

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

Vorteile

TextMesh hat einige Vorteile gegenüber Label3D:

  • TextMesh kann eine Textur verwenden, um die Textfarbe für jede Seite zu ändern.

  • Die TextMesh-Geometrie kann eine echte Tiefe haben und Glyphen ein 3D-Aussehen verleihen.

  • TextMesh kann im Gegensatz zu Label3D eigene Shader verwenden.

Einschränkungen

Es gibt einige Einschränkungen bei TextMesh:

  • Im Gegensatz zu Label3D gibt es keine integrierte Unterstützung für Umrisse. Dies kann jedoch mit benutzerdefinierten Shadern simuliert werden.

  • Es werden nur dynamische Schriftarten unterstützt (.ttf, .otf, .woff, .woff2). Bitmap-Schriften in den Formaten .fnt oder .font werden nicht unterstützt.

  • Schriftarten mit sich selbst überschneidenden Umrissen werden nicht korrekt wiedergegeben. Wenn Sie Rendering-Probleme bei Schriftarten feststellen, die von Websites wie Google Fonts heruntergeladen wurden, laden Sie die Schriftart stattdessen von der offiziellen Website des Font-Autors herunter.

Projizierter Label-Node (oder jedes andere Control)

Es gibt eine letzte Lösung, die komplizierter einzurichten ist, aber die größte Flexibilität bietet: die Projektion eines 2D-Nodes in den 3D-Raum. Dies kann mit dem Rückgabewert der Methode unproject_position auf einem Camera3D-Node in der Funktion _process() eines Skripts erreicht werden. Dieser Rückgabewert sollte dann verwendet werden, um die Eigenschaft Position eines Control-Nodes setzen.

Ein Beispiel hierfür finden Sie in der Demo 3D Waypoints.

Vorteile

  • Jeder Control-Node kann verwendet werden, einschließlich Label, RichTextLabel oder sogar Nodes wie Button. Dies ermöglicht leistungsstarke Formatierung und GUI-Interaktion.

  • Der skriptbasierte Ansatz lässt völlige Freiheit bei der Positionierung zu. So ist es beispielsweise wesentlich einfacher, Control-Nodes an den Bildschirmrändern zu fixieren, wenn sie den Bildschirm verlassen (für 3D-Marker im Spiel).

  • Das Theme der Controls wird befolgt. Dies ermöglicht eine einfachere Anpassung, die global für das Projekt gilt.

Einschränkungen

  • Projizierte Controls können in keiner Weise durch 3D-Geometrie verdeckt werden. Sie können einen RayCast verwenden, um das Control vollständig auszublenden, wenn seine Zielposition von einem Collider verdeckt wird, aber dies ermöglicht nicht das teilweise Ausblenden des Controls hinter einer Wand.

  • Das Ändern der Textgröße in Abhängigkeit von der Entfernung durch Anpassen der Property Skalierung des Controls ist möglich, muss aber manuell durchgeführt werden. Label3D und TextMesh erledigen dies automatisch, allerdings auf Kosten einer geringeren Flexibilität (man kann keine minimale/maximale Textgröße in Pixeln festlegen).

  • Änderungen der Auflösung und des Seitenverhältnisses müssen im Skript berücksichtigt werden, was eine Herausforderung darstellen kann.

Sollte ich Label3D, TextMesh oder ein projiziertes Steuerelement verwenden?

In den meisten Fällen wird Label3D empfohlen, da es einfacher einzurichten ist und eine höhere Rendering-Qualität bietet (insbesondere wenn 3D-Antialiasing deaktiviert ist).

Für fortgeschrittene Anwendungsfälle ist TextMesh flexibler, da es die Gestaltung des Textes mit benutzerdefinierten Shadern ermöglicht. Mit benutzerdefinierten Shadern kann die endgültige Geometrie verändert werden, z. B. indem der Text entlang einer Oberfläche gebogen wird. Da es sich bei dem Text um tatsächliche 3D-Geometrie handelt, kann der Text optional Tiefe haben und auch zur globalen Beleuchtung beitragen.

Wenn Sie Featues wie BBCode- oder Control-Theme-Unterstützung benötigen, ist die Verwendung eines projizierten RichTextLabel-Nodes die einzige Möglichkeit.