Texto 3D
Introdução
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.
Além disso, o Godot permite posicionar nós do tipo Control com base na posição de um ponto 3D na câmera. Isso pode ser usado como uma alternativa ao texto 3D "real" em situações onde Label3D e TextMesh não são flexíveis o suficiente.
Ver também
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.
Label3D
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).
Vantagens
Label3D é mais rápido de gerar do que TextMesh. Embora ambos utilizem um mecanismo de cache para renderizar novos glifos apenas uma vez, o Label3D ainda será mais rápido para (re)gerar, especialmente em textos longos. Isso pode evitar travamentos durante a jogabilidade em CPUs de baixo desempenho ou dispositivos móveis.
Label3D pode usar fontes bitmap e fontes dinâmicas (com e sem MSDF ou mipmaps). Isso o torna mais flexível nesse aspecto em comparação ao TextMesh, especialmente para renderizar fontes com contornos auto-intersectantes ou fontes coloridas (emoji).
Ver também
Veja Using Fonts para orientações sobre como configurar a importação de fontes.
Limitações
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.
Isso pode ser mitigado definindo o modo de transparência do Label3D como Alpha Cut, com o custo de uma renderização de texto menos suave. O modo de transparência Opaque Pre-Pass pode preservar a suavidade do texto enquanto permite que o Label3D projete sombras, mas alguns problemas de ordenação de transparência ainda permanecerão.
Veja a seção Ordenação de transparência na página de limitações de renderização 3D para mais informações.
A qualidade da renderização do texto também pode ser prejudicada quando o Label3D é visualizado à distância. Para melhorar a qualidade da renderização do texto, ative mipmaps na fonte ou mude a fonte para usar renderização MSDF.
TextMesh
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).
Aqui está um exemplo de uma textura e como ela é aplicada à malha. Você pode usar a textura abaixo como referência para o mapa UV da malha gerada:
Vantagens
TextMesh possui algumas vantagens em relação ao Label3D:
TextMesh pode usar uma textura para modificar a cor do texto separadamente em cada lado.
A geometria do TextMesh pode ter profundidade real, dando aos glifos uma aparência 3D.
TextMesh pode usar shaders personalizados, ao contrário do Label3D.
Limitações
There are some limitations to TextMesh:
Sem suporte nativo a contorno, ao contrário do Label3D. No entanto, isso pode ser simulado usando shaders personalizados.
Apenas fontes dinâmicas são suportadas (
.ttf,.otf,.woff,.woff2). Fontes bitmap nos formatos.fntou.fontnão são suportadas.Fontes com contornos auto-intersectantes não serão renderizadas corretamente. Se você notar problemas de renderização em fontes baixadas de sites como o Google Fonts, tente baixar a fonte diretamente do site oficial do autor da fonte.
A suavização (antialiasing) da renderização do texto requer que um método de antialiasing de cena completa esteja ativado, como MSAA, FXAA ou antialiasing temporal (TAA). Se nenhum método de antialiasing estiver ativado, o texto aparecerá com granulação, especialmente à distância. Veja 3D antialiasing para mais informações.
Nó Label projetado (ou qualquer outro nó do tipo Control)
Há uma última solução que é mais complexa de configurar, mas oferece a maior flexibilidade: projetar um nó 2D no espaço 3D. Isso pode ser feito utilizando o valor retornado pelo método unproject_position de um nó Camera3D na função _process() de um script. Esse valor retornado deve então ser usado para definir a propriedade position de um nó do tipo Control.
See the 3D waypoints demo for an example of this.
Vantagens
Qualquer nó do tipo Control pode ser usado, incluindo Label, RichTextLabel ou até mesmo nós como Button. Isso permite uma formatação poderosa e interação com a interface gráfica.
A abordagem baseada em script permite total liberdade de posicionamento. Por exemplo, isso torna consideravelmente mais fácil fixar nós Control nas bordas da tela quando eles saem da área visível (para marcadores 3D no jogo).
A temática dos nós Control é respeitada. Isso permite uma personalização mais fácil que se aplica globalmente ao projeto.
Limitações
Controls projetados não podem ser ocultados por geometrias 3D de nenhuma forma. Você pode usar um RayCast para ocultar completamente o controle se sua posição alvo estiver oculta por um colisor, mas isso não permite ocultar parcialmente o controle atrás de uma parede.
Alterar o tamanho do texto dependendo da distância ajustando manualmente a propriedade
scaledo nó Control é possível, mas precisa ser feito manualmente. Label3D e TextMesh cuidam disso automaticamente, com o custo de menor flexibilidade (não é possível definir um tamanho mínimo/máximo do texto em pixels).Lidar com mudanças de resolução e proporção de tela deve ser considerado no script, o que pode ser desafiador.
Devo usar Label3D, TextMesh ou um Control projetado?
Na maioria dos cenários, o Label3D é recomendado, pois é mais fácil de configurar e oferece maior qualidade de renderização (especialmente se o antialiasing 3D estiver desativado).
Para casos de uso avançados, o TextMesh é mais flexível, por permitir estilizar o texto com shaders personalizados. Shaders personalizados permitem modificar a geometria final, como curvar o texto ao longo de uma superfície. Como o texto é uma geometria 3D real, ele pode ter profundidade opcional e também pode contribuir para a iluminação global.
Se você precisa de recursos como suporte a BBCode ou tematização de Control, então usar um nó RichTextLabel projetado é a única opção viável.