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.

Prototipando níveis com CSG

CSG significa Constructive Solid Geometry (Geometria Sólida Construtiva), e é uma ferramenta para combinar formas básicas ou malhas personalizadas para criar formas mais complexas. Em softwares de modelagem 3D, o CSG é mais conhecido como "Operadores Booleanos".

A prototipagem de níveis é um dos principais usos do CSG no Godot. Essa técnica permite aos usuários criar as formas mais comuns combinando primitivas. Ambientes internos podem ser criados usando primitivas invertidas.

Nota

Os nós CSG no Godot são destinados principalmente para prototipagem. Não há suporte integrado para mapeamento UV ou edição de polígonos 3D (embora polígonos 2D extrudados possam ser usados com o nó CSGPolygon3D).

Se você estiver procurando uma ferramenta de design de níveis fácil de usar para um projeto, pode preferir usar o FuncGodot ou o Cyclops Level Builder.

Ver também

Você pode verificar como utilizar nós CSG para construir diversas formas (como escadas ou estradas) utilizando o projeto de demonstração Constructive Solid Geometry demo project.

Introdução aos nós de CSG

Assim como outros recursos do Godot, o CSG é suportado na forma de nós. Estes são os nós CSG:

../../_images/csg_nodes.png ../../_images/csg_mesh.png

Características das ferramentas CSG

Cada nó CSG suporta 3 tipos de operações booleanas:

  • Union: A geometria de ambas as primitivas é combinada, e a geometria que se intersecta é removida.

  • Intersection: Apenas a geometria que se intersecta permanece, o resto é removido.

  • Subtraction: A segunda forma é subtraída da primeira, deixando uma reentrância com o seu formato.

../../_images/csg_operation_menu.png ../../_images/csg_operation.png

PolígonoCSG

O nó CSGPolygon3D faz a extrusão ao longo de um polígono desenhado em 2D (nas coordenadas X, Y) das seguintes maneiras:

  • Depth: Extrudado para trás por uma determinada quantidade.

  • Spin: Extrudado enquanto gira em torno de sua origem.

  • Path: Extrudado ao longo de um nó Path. Esta operação é comumente chamada de lofting.

../../_images/csg_poly_mode.png ../../_images/csg_poly.png

Nota

O modo Path deve receber um nó Path3D para funcionar. No nó Path, desenhe o caminho e o polígono no CSGPolygon3D fará a extrusão ao longo do caminho fornecido.

Malhas personalizadas

Malhas personalizadas podem ser usadas para o CSGMesh3D, desde que a malha seja manifold (variedade topológica). A malha pode ser modelada em outro software e importada para o Godot. Múltiplos materiais são suportados.

Para que uma malha seja usada como uma malha CSG, é necessário:

  • ser fechado

  • que cada aresta se conecte a apenas duas faces

  • que possua volume

E é recomendado evitar:

  • volume negativo

  • auto-interseção

  • faces internas

O Godot usa a biblioteca manifold para implementar as malhas CSG. A definição técnica de "manifold" usada pelo Godot é a seguinte, adaptada da definição de "manifold" daquela biblioteca:

Cada aresta de cada triângulo deve conter os mesmos dois vértices (por índice) que exatamente uma outra aresta de triângulo, e os vértices inicial e final devem trocar de lugar entre essas duas arestas. Os vértices dos triângulos devem aparecer em ordem horária quando vistos do lado de fora da malha manifold do Godot Engine.

../../_images/csg_custom_mesh.png

Tornando uma malha existente manifold com o Blender

Se você tem uma malha existente que ainda não é manifold, pode torná-la manifold usando o Blender.

No Blender, instale e ative o complemento 3D Print Toolbox.

Selecione a malha que deseja tornar manifold. Abra a barra lateral clicando na seta:

../../_images/csg_manifold_step_1.webp

Na aba 3D Print, sob Clean Up, clique no botão Make Manifold:

../../_images/csg_manifold_step_2.webp

A malha agora deve ser manifold e pode ser usada como uma malha personalizada.

Combinador CSG 3D

O nó CSGCombiner3D é uma forma vazia usada para organização. Ele apenas combinará os nós filhos.

Ordem de processamento

Cada nó CSG processará primeiro seus nós filhos e suas operações: união, intersecção ou subtração, na ordem da árvore, e as aplicará a si mesmo uma após a outra.

Nota

No interesse do desempenho, certifique-se de que a geometria CSG permaneça relativamente simples, pois malhas complexas podem demorar um pouco para serem processadas. Se estiver adicionando objetos juntos (como uma mesa e objetos de uma sala), crie-os como árvores CSG separadas. Forçar objetos demais em uma única árvore acabará afetando o desempenho. Use operações binárias apenas onde você realmente precisar delas.

Prototipando um nível

Nós vamos prototipar uma sala para praticar o uso das ferramentas CSG.

Dica

Trabalhar na projeção Orthogonal oferece uma visão melhor ao combinar as formas CSG.

Nosso nível conterá estes objetos:

  • um quarto,

  • uma cama,

  • uma lâmpada,

  • uma mesa,

  • uma estante de livros.

Crie uma cena com um nó Node3D como nó raiz.

Dica

A iluminação padrão do ambiente não fornece um sombreamento claro em alguns ângulos. Mude o modo de exibição usando Display Overdraw no menu da viewport 3D, ou adicione um nó DirectionalLight para ajudar a enxergar claramente.

../../_images/csg_overdraw.png

Crie um CSGBox3D e nomeie-o como room, ative Invert Faces e altere as dimensões da sua sala.

../../_images/csg_room.png ../../_images/csg_room_invert.png

Em seguida, crie um CSGCombiner3D e nomeie-o como desk.

Uma mesa possui uma superfície e 4 pernas:

  • Crie 1 nó filho CSGBox3D no modo Union para a superfície e ajuste as dimensões.

  • Crie 4 nós filhos CSGBox3D no modo Union para as pernas e ajuste as dimensões.

Ajuste o posicionamento deles para se assemelhar a uma mesa.

../../_images/csg_desk.png

Nota

Os nós CSG dentro de um CSGCombiner3D só processarão suas operações dentro do combinador. Portanto, os CSGCombiner3Ds são usados para organizar nós CSG.

Crie um CSGCombiner3D e nomeie-o como bed.

Nossa cama consiste em 3 partes: a cama, o colchão e um travesseiro. Crie um CSGBox3D e ajuste suas dimensões para a cama. Crie outro CSGBox3D e ajuste suas dimensões para o colchão.

../../_images/csg_bed_mat.png

Vamos criar outro CSGCombiner3D chamado pillow como filho de bed. A árvore de cena deve ficar assim:

../../_images/csg_bed_tree.png

Combinaremos 3 nós CSGSphere3D no modo Union para formar um travesseiro. Dimensione o eixo Y das esferas e ative a opção Smooth Faces.

../../_images/csg_pillow_smooth.png

Selecione o nó pillow e mude o modo para Subtraction; as esferas combinadas vão cortar um buraco no colchão.

../../_images/csg_pillow_hole.png

Tente mudar o nó pai de pillow para o nó raiz Node3D; o buraco desaparecerá.

Nota

Isso serve para ilustrar o efeito da ordem de processamento do CSG. Como o nó raiz não é um nó CSG, os nós CSGCombiner3D são o fim das operações; isso mostra o uso do CSGCombiner3D para organizar a cena CSG.

Desfaça a herança depois de observar o efeito. A cama que você construiu deve ter esta aparência:

../../_images/csg_bed.png

Crie um CSGCombiner3D e nomeie-o como lamp.

Uma luminária consiste em 3 partes: a base, o poste e a cúpula. Crie um CSGCylinder3D, ative a opção Cone e faça dele a base. Crie outro CSGCylinder3D e ajuste as dimensões para usá-lo como o poste.

../../_images/csg_lamp_pole_stand.png

Usaremos um CSGPolygon3D para a cúpula da luminária. Use o modo Spin para o CSGPolygon3D e desenhe um trapézio enquanto estiver na Front View (teclado numérico 1); essa forma fará a extrusão em torno da origem e formará a cúpula.

../../_images/csg_lamp_spin.png ../../_images/csg_lamp_polygon.png ../../_images/csg_lamp_extrude.png

Ajuste o posicionamento das 3 partes para que pareça com uma luminária.

../../_images/csg_lamp.png

Crie um CSGCombiner3D e nomeie-o como bookshelf.

Usaremos 3 nós CSGBox3D para a estante de livros. Crie um CSGBox3D e ajuste suas dimensões; esse será o tamanho da estante.

../../_images/csg_shelf_big.png

Duplique o CSGBox3D, encurte as dimensões de cada eixo e altere o modo para Subtraction.

../../_images/csg_shelf_subtract.png ../../_images/csg_shelf_subtract_menu.png

Você quase construiu uma estante. Crie mais um CSGBox3D para dividir a estante em dois níveis.

../../_images/csg_shelf.png

Posicione seus móveis em seu quarto como quiser e sua cena deve ficar assim:

../../_images/csg_room_result.png

Você prototipou com sucesso um nível de sala com as ferramentas CSG no Godot. As ferramentas CSG podem ser usadas para projetar todos os tipos de níveis, como um labirinto ou uma cidade; explore suas limitações ao projetar seu jogo.

Usando texturas protótipo

O Material 3D Padrão e Material ORM 3D do Godot suporta mapeamento triplanar, que pode ser usado para aplicar automaticamente uma textura a objetos arbitrários sem distorção. Isso é útil ao usar CSG, já que o Godot ainda não suporta a edição de mapas UV em nós CSG. O mapeamento triplanar é relativamente lento, o que geralmente restringe seu uso a superfícies orgânicas como terrenos. Ainda assim, ao criar protótipos, ele pode ser usado para aplicar texturas rapidamente a níveis baseados em CSG.

Nota

Se você precisar de algumas texturas para prototipagem, o Kenney fez um conjunto de texturas de protótipo com licença CC0.

Há duas maneiras de aplicar um material a um nó CSG:

  • Aplicá-lo a um nó CSGCombiner3D como uma sobreposição de material (Geometry > Material Override no Inspetor). Isso afetará seus filhos automaticamente, mas tornará impossível alterar o material em filhos individuais.

  • Aplicar um material a nós individuais (Material no Inspetor). Dessa forma, cada nó CSG pode ter sua própria aparência. Nós CSG subtrativos aplicarão seu material aos nós nos quais estão "cavando".

Para aplicar o mapeamento triplanar a um nó CSG, selecione-o, vá até o Inspetor, clique no texto [empty] ao lado de Material Override (o Material para nós CSG individuais). Escolha New StandardMaterial3D. Clique no ícone do material recém-criado para editá-lo. Abra a seção Albedo e carregue uma textura na propriedade Texture. Agora, abra a seção Uv1 e marque Triplanar. Você pode alterar o deslocamento (offset) e a escala da textura em cada eixo mexendo nas propriedades Scale e Offset logo acima. Valores mais altos na propriedade Scale farão com que a textura se repita com mais frequência.

Dica

Você pode copiar um StandardMaterial3D para reutilizá-lo em outros nós CSG. Para fazer isso, clique na seta do menu suspenso ao lado de uma propriedade de material no Inspetor e escolha Copy. Para colá-lo, selecione o nó ao qual deseja aplicar o material, clique na seta do menu suspenso ao lado de sua propriedade de material e escolha Paste.

Convertendo para MeshInstance3D

Desde o Godot 4.4, você pode converter um nó CSG e seus filhos em um nó MeshInstance3D.

Isso possui vários benefícios:

  • Gerar lightmaps (baking), já que o UV2 pode ser gerado em um MeshInstance3D.

  • Gerar occlusion culling (baking), já que o processo de geração de occlusion culling só leva em consideração MeshInstance3D.

  • Tempos de carregamento mais rápidos, já que a malha CSG não precisa mais ser reconstruída quando a cena é carregada.

  • Melhor desempenho ao atualizar a transformação (transform) do nó se você estiver usando a malha dentro de outro nó CSG.

Para converter um nó CSG em um nó MeshInstance3D, selecione-o e escolha CSG > Bake Mesh Instance na barra de ferramentas. O nó MeshInstance3D será criado como um nó irmão. Note que o nó CSG usado para a geração não é ocultado automaticamente, então lembre-se de ocultá-lo para evitar que sua geometria se sobreponha à do MeshInstance3D recém-criado.

Você também pode criar uma forma de colisão trimesh usando CSG > Bake Collision Shape. O nó CollisionShape3D gerado deve ser um filho de um nó StaticBody3D ou AnimatableBody3D para ser eficaz.

Dica

Lembre-se de manter o nó CSG original na árvore da cena, para que você possa realizar alterações na geometria posteriormente, se necessário. Para modificar a geometria, remova o nó MeshInstance3D e torne o nó CSG raiz visível novamente.

Exportando como glTF

Pode ser útil estruturar um nível usando CSG e depois exportá-lo como um modelo 3D para importá-lo em um software de modelagem 3D. Você pode fazer isso selecionando Scene > Export As... > glTF 2.0 Scene.

../../_images/export_as_gltf.webp