Texto 3D

Introducción

In a project, there may be times when text needs to be created as part of a 3D scene and not just in the HUD. Godot provides 2 methods to do this: the Label3D node and the TextMesh resource for a MeshInstance3D node.

Adicionalmente, Godot hace posible posicionar nodos de control de acuerdo con la posición de punto 3D en la cámara. Esto puede ser usado como una alternativa a texto 3D real en situaciones donde Label3D y TextMesh no son lo suficientemente flexibles.

Ver también

You can see 3D text in action using the 3D Labels and Texts demo project.

This page does not cover how to display a GUI scene within a 3D environment. For information on how to achieve that, see the GUI in 3D demo project.

Etiqueta 3D

../../_images/label_3d.png

Label3D behaves like a Label node, but in 3D space. Unlike the Label node, this Label3D node does not inherit properties of a GUI theme. However, its look remains customizable and uses the same font subresource as Control nodes (including support for MSDF font rendering).

Ventajas

  • Label3D es más rápido en generar que TextMesh. Mientras que ambos usan un mecanismo de almacenamiento en caché para renderizar los glifos nuevos solo una vez, Label3D aún será más rápido en (re)generar, especialmente para textos largos. Esto puede evitar el trastabilleo durante el gameplay en CPUs de gama baja o móviles.

  • Label3D can use bitmap fonts and dynamic fonts (with and without MSDF or mipmaps). This makes it more flexible on that aspect compared to TextMesh, especially for rendering fonts with self-intersecting outlines or colored fonts (emoji).

Ver también

Mira Using Fonts para saber que pautas seguir configurando las importaciones de las fuentes.

Limitaciones

By default, Label3D has limited interaction with a 3D environment. It can be occluded by geometry and lit by light sources if the Shaded flag is enabled. However, it will not cast shadows even if Cast Shadow is set to On in the Label3D's GeometryInstance3D properties. This is because the node internally generates a quad mesh (one glyph per quad) with transparent textures and has the same limitations as Sprite3D. Transparency sorting issues can also become apparent when several Label3Ds overlap, especially if they have outlines.

Esto se puede mitigar configurando el modo de transparencia de Label3D en Alpha Cut, a costa de una representación del texto menos fluida. El modo de transparencia Opaque Pre-Pass puede preservar la suavidad del texto y al mismo tiempo permitir que Label3D proyecte sombras, pero persistirán algunos problemas de clasificación de transparencia.

Mira la sección Transparency sorting en el la página de limitaciones del renderizado 3D para más información.

La calidad de la representación del texto también puede verse afectada cuando Label3D se ve a distancia. Para mejorar la calidad de la representación del texto, habilite los mapas MIP en la fuente o cambie la fuente para usar la representación MSDF.

TextMesh

../../_images/text_mesh.png

The TextMesh resource has similarities to Label3D. They both display text in a 3D scene, and will use the same font subresource. However, instead of generating transparent quads, TextMesh generates 3D geometry that represents the glyphs' contours and has the properties of a mesh. As a result, a TextMesh is shaded by default and automatically casts shadows onto the environment. A TextMesh can also have a material applied to it (including custom shaders).

Aquí hay un ejemplo de una textura y cómo se aplica a la malla. Puedes usar la textura de abajo como una referencia para el mapa de coordenadas UV generado:

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

Ventajas

TextMesh tiene unas pocas ventajas sobre Label3D:

  • TextMesh puede usar una textura para modificar el color del texto por cada lado.

  • La geometría de TextMesh puede tener profundidad, dándole a los grifos una apariencia 3D.

  • TextMesh puede usar shaders personalizados, no como Label3D.

Limitaciones

TextMesh tiene algunas limitaciones:

  • No hay soporte integrado para esquemas, a diferencia de Label3D. Sin embargo, esto se puede simular utilizando sombreadores personalizados.

  • Sólo se admiten fuentes dinámicas (.ttf, .otf, .woff, .woff2). Las fuentes de mapa de bits en los formatos .fnt o .font no son compatibles.

  • Las fuentes con contornos que se cruzan entre sí no se representarán correctamente. Si nota problemas de representación en fuentes descargadas de sitios web como Google Fonts, intente descargar la fuente desde el sitio web oficial del autor de la fuente.

  • El suavizado de la representación de texto requiere que se habilite un método de antialiasing de escena completa, como MSAA, FXAA y antialiasing temporal (TAA). Si no se habilita ningún método de suavizado, el texto aparecerá granulado, especialmente a distancia. Véase 3D antialiasing para obtener más información.

Nodo Label proyectado (o cualquier otro nodo Control)

Existe una última solución que es más compleja de configurar, pero que proporciona la mayor flexibilidad: proyectar un nodo 2D en un espacio 3D. Esto se puede lograr usando el valor de retorno del método unproject_position en un nodo Camera3D en la función _process() de un script. Este valor de retorno debe usarse para establecer la propiedad posición de un nodo de Control.

See the 3D waypoints demo for an example of this.

Ventajas

  • Se puede utilizar cualquier nodo de control, incluidos Label, RichTextLabel o incluso nodos como Button. Esto permite un formato potente y una interacción con la interfaz gráfica de usuario.

  • El enfoque basado en scripts permite una total libertad de posicionamiento. Por ejemplo, esto hace que sea mucho más fácil fijar los controles en los bordes de la pantalla cuando se salen de ella (para los marcadores 3D del juego).

  • Se respeta la temática de control, lo que permite una personalización más sencilla que se aplica globalmente al proyecto.

Limitaciones

  • Los controles proyectados no pueden quedar ocultos por la geometría 3D de ninguna manera. Puedes usar un RayCast para ocultar completamente el control si su posición de destino está oculta por un colisionador, pero esto no permite ocultar parcialmente el control detrás de una pared.

  • Es posible cambiar el tamaño del texto en función de la distancia ajustando la propiedad scale del control, pero debe hacerse manualmente. Label3D y TextMesh se encargan de esto automáticamente, a costa de una menor flexibilidad (no se puede establecer un tamaño de texto mínimo/máximo en píxeles).

  • El manejo de los cambios en la resolución y el ratio de aspecto debe tenerse en cuenta en el código, lo cual puede resultar complejo.

¿Debo utilizar Label3D, TextMesh o un control proyectado?

En la mayoría de los escenarios, se recomienda Label3D ya que es más fácil de configurar y proporciona una mayor calidad de renderizado (especialmente si el antialiasing 3D está deshabilitado).

Para casos de uso avanzados, TextMesh es más flexible, ya que permite aplicar estilo al texto con sombreadores personalizados. Los sombreadores personalizados permiten modificar la geometría final, como curvar el texto a lo largo de una superficie. Dado que el texto es geometría 3D real, el texto puede tener profundidad opcionalmente y también puede contribuir a la iluminación global.

Si necesitas funciones como BBCode o compatibilidad con temas de control, utilizar un nodo RichTextLabel proyectado es la única opción.