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.

Prototipazione dei livelli con CSG

CSG è l'acronimo di Constructive Solid Geometry ed è un mezzo che permette di combinare forme di base o mesh personalizzate per creare forme più complesse. Nei software di modellazione 3D, CSG è generalmente noto come "Operatori booleani".

La prototipazione dei livelli è uno degli usi principali di CSG in Godot. Questa tecnica permette agli utenti di creare le forme più comuni combinando primitive. Gli ambienti interni si possono creare usando primitive invertite.

Nota

I nodi CSG in Godot sono concepiti principalmente per la prototipazione. Non è previsto alcun supporto integrato per la mappatura UV o la modifica di poligoni 3D (sebbene sia possibile utilizzare poligoni 2D estrusi con il nodo CSGPolygon3D).

Se stai cercando uno strumento per progettare livelli facile da usare per un progetto, potresti voler usare FuncGodot o Cyclops Level Builder in alternativa.

Vedi anche

È possibile scoprire come utilizzare i nodi CSG per costruire varie forme (ad esempio scale o strade) attraverso il progetto demo Constructive Solid Geometry.

Introduzione ai nodi CSG

Come le altre funzionalità di Godot, il CSG è supportato tramite nodi. Questi sono i nodi CSG:

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

Funzionalità degli strumenti CSG

Ogni nodo CSG supporta 3 tipi di operazioni booleane:

  • Union: la geometria di entrambe le primitive è unita, la geometria intersecante è rimossa.

  • Intersection: solo la geometria intersecante rimane, il resto è rimosso.

  • Subtraction: la seconda forma è sottratta dalla prima, lasciando un'indentazione con la sua forma.

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

CSGPolygon

Il nodo CSGPolygon3D estrude lungo un poligono disegnato in 2D (nelle coordinate X, Y) nei seguenti modi:

  • Depth: estruso indietro di una quantità specificata.

  • Spin: estruso ruotando attorno la sua origine.

  • Path: estruso lungo un nodo Path. Questa operazione è comunemente detta "lofting".

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

Nota

La modalità Percorso deve essere fornita con un nodo Path3D per funzionare. Nel nodo Path, disegna il percorso e il poligono in CSGPolygon3D sarà estruso lungo il percorso specificato.

Mesh personalizzate

È possibile utilizzare mesh personalizzate per CSGMesh3D purché la mesh sia manifold. La mesh può essere modellata in altri software e importata in Godot. Sono supportati più materiali.

Affinché sia possibile utilizzare una mesh come mesh CSG, è necessario che:

  • sia chiusa

  • ogni bordo sia connesso a sole due facce

  • abbia volume

Si raccomanda inoltre di evitare:

  • un volume negativo

  • auto-intersezioni

  • Facce interiori

Godot usa la libreria manifold per implementare le mesh CSG. La definizione tecnica di "manifold" usata da Godot è la seguente, adattata dalla definizione di "manifold" di tale libreria:

Ogni bordo di ogni triangolo deve contenere gli stessi due vertici (per indice) di esattamente un altro bordo di triangolo, e i vertici iniziale e finale devono scambiarsi di posto tra questi due bordi. I vertici del triangolo devono apparire in senso orario se visti dall'esterno della mesh manifold del Godot Engine.

../../_images/csg_custom_mesh.png

Rendere una mesh esistente manifold con Blender

Se hai una mesh esistente che non è già manifold, è possibile renderla manifold attraverso Blender.

In Blender, installa e abilita l'addon 3D Print Toolbox.

Seleziona la mesh che vuoi rendere manifold. Apri la barra laterale cliccando sulla freccia:

../../_images/csg_manifold_step_1.webp

Nella scheda 3D Print, sotto Clean Up, clicca sul pulsante Make Manifold:

../../_images/csg_manifold_step_2.webp

La mesh dovrebbe ora essere manifold, e si può usare come mesh personalizzata.

CSGCombiner3D

Il nodo CSGCombiner3D è una forma vuota usata per organizzazione. Combinerà solo i nodi figli.

Ordine di elaborazione

Ogni nodo CSG elaborerà prima i suoi nodi figli e le loro operazioni: unione, intersezione o sottrazione, in ordine ad albero, e le applicherà a se stesso una dopo l'altra.

Nota

Nell'interesse di ottimizzare le prestazioni, assicurati che la geometria CSG rimanga relativamente semplice, poiché per elaborare mesh complesse ci potrebbe volere un po'. Se unisci oggetti (come tavoli e stanze), creali come alberi CSG separati. Inserire troppi oggetti in un singolo albero finirà per influire sulle prestazioni. Usa le operazioni binarie solo quando sono effettivamente necessarie.

Prototipazione di un livello

Creeremo un prototipo di una stanza per mettere in pratica gli strumenti CSG.

Suggerimento

Lavorare nella proiezione ortogonale offre una vista migliore per combinare le forme CSG.

Il nostro livello conterrà questi oggetti:

  • una stanza,

  • un letto,

  • una lampada,

  • una scrivania,

  • una libreria.

Crea una scena con un nodo Node3D come nodo radice.

Suggerimento

L'illuminazione predefinita dell'ambiente non fornisce un'ombreggiatura chiara da alcune angolazioni. Cambia la modalità di visualizzazione tramite Display Overdraw nel menu della viewport 3D oppure aggiungi un nodo DirectionalLight per vedere meglio.

../../_images/csg_overdraw.png

Crea un oggetto CSGBox3D e chiamalo room, abilita Invert Faces e cambia le dimensioni della stanza.

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

Successivamente, crea un CSGCombiner3D e dagli il nome desk.

Una scrivania ha una superficie e 4 gambe:

  • Crea 1 nodo figlio CSGBox3D in modalità Union per la superficie e regola le dimensioni.

  • Crea 4 nodi figli CSGBox3D in modalità Union per le gambe e regola le dimensioni.

Regola la loro posizione per farli assomigliare a una scrivania.

../../_images/csg_desk.png

Nota

I nodi CSG dentro un CSGCombiner3D elaboreranno le loro operazioni esclusivamente entro il combinatore. Pertanto, i CSGCombiner3D servono per organizzare i nodi CSG.

Crea un CSGCombiner3D e dagli il nome bed.

Il nostro letto è composto da 3 parti: il letto, il materasso e un cuscino. Crea un CSGBox3D e regola le sue dimensioni per il letto. Crea un altro CSGBox3D e regola le sue dimensioni per il materasso.

../../_images/csg_bed_mat.png

Creeremo un altro CSGCombiner3D con il nome pillow come figlio di bed. L'albero di scene dovrebbe apparire così:

../../_images/csg_bed_tree.png

Combineremo 3 nodi CSGSphere3D in modalità Union per formare un cuscino. Scaleremo l'asse Y delle sfere e abiliteremo Smooth Faces.

../../_images/csg_pillow_smooth.png

Seleziona il nodo pillow e cambia la modalità in Subtraction; le sfere combinate taglieranno un foro nel materasso.

../../_images/csg_pillow_hole.png

Prova a riassegnare il nodo pillow come figlio del nodo radice Node3D; il buco scomparirà.

Nota

È per illustrare l'effetto dell'ordine di elaborazione di CSG. Poiché il nodo radice non è un nodo CSG, i nodi CSGCombiner3D sono la fine delle operazioni; ciò mostra l'uso di CSGCombiner3D per organizzare la scena CSG.

Annulla la riassegnazione dopo aver osservato l'effetto. Il letto che hai costruito dovrebbe apparire così:

../../_images/csg_bed.png

Crea un CSGCombiner3D e dagli il nome lamp.

Una lampada è composta da 3 parti: la base, il palo e il paralume. Crea un oggetto CSGCylinder3D, abilita l'opzione Cone e rendilo la base. Crea un altro oggetto CSGCylinder3D e regola le dimensioni per usarlo come palo.

../../_images/csg_lamp_pole_stand.png

Useremo un CSGPolygon3D per il paralume. Usa la modalità Spin per il CSGPolygon3D e disegna un trapezio mentre sei in Vista frontale (tasto numerico 1); questa forma sarà estrusa attorno all'origine e formerà il paralume.

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

Aggiusta la disposizione delle 3 parti così da farle assomigliare a una lampada.

../../_images/csg_lamp.png

Crea un CSGCombiner3D e dagli il nome bookshelf.

Utilizzeremo 3 nodi CSGBox3D per la libreria. Crea un nodo CSGBox3D e regola le sue dimensioni; queste corrisponderanno alle dimensioni della libreria.

../../_images/csg_shelf_big.png

Duplica il CSGBox3D, riduci le dimensioni di ciascun asse e cambia la modalità in Subtraction.

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

Hai quasi costruito una mensola. Crea un altro CSGBox3D per dividere la mensola in due livelli.

../../_images/csg_shelf.png

Disponi i mobili nella stanza come preferisci e la scena dovrebbe assomigliare a questa:

../../_images/csg_room_result.png

Sei riuscito a creare un prototipo di una stanza tramite gli strumenti CSG di Godot. Gli strumenti CSG possono servire per progettare livelli di ogni tipo, come labirinti o città; esplora i loro limiti durante la progettazione del tuo gioco.

Utilizzare texture prototipiche

Il Standard Material 3D and ORM Material 3D di Godot supporta la mappatura triplanare, che può servire per applicare automaticamente una texture a oggetti arbitrari senza distorsioni. È utile per CSG, poiché Godot non supporta ancora la modifica delle mappe UV sui nodi CSG. La mappatura triplanare è relativamente lenta, il che di solito ne limita l'uso a superfici organiche come il terreno. Nonostante ciò, in fase di prototipazione, può servire per applicare rapidamente texture a livelli basati su CSG.

Nota

Se hai bisogno di texture per la prototipazione, Kenney ha creato un insieme di texture prototipiche con licenza CC0.

Ci sono due modi per applicare un materiale a un nodo CSG:

  • Applicandolo a un nodo CSGCombiner3D come materiale sostitutivo (Geometry > Material Override nell'Ispettore). Questo influenzerà automaticamente i suoi figli, ma renderà impossibile cambiare il materiale nei singoli figli.

  • Applicando un materiale ai singoli nodi (Material nell'Ispettore). In questo modo, ogni nodo CSG può avere il proprio aspetto. I nodi CSG sottrattivi applicheranno il loro materiale ai nodi in cui "scavano".

Per applicare la mappatura triplanare a un nodo CSG, selezionalo, vai sull'Ispettore, clicca sul testo [vuoto] accanto a Material Override (o Material per i singoli nodi CSG). Scegli Nuovo StandardMaterial3D. Clicca sull'icona del materiale appena creato per modificarlo. Espandi la sezione Albedo e carica una texture nella proprietà Texture. Ora, espandi la sezione Uv1 e seleziona Triplanar. Puoi cambiare l'offset e la scala della texture su ciascun asse tramite le proprietà Scale e Offset appena sopra. Valori più alti nella proprietà Scale faranno ripetere la texture più spesso.

Suggerimento

È possibile copiare un StandardMaterial3D per riusarlo in diversi nodi CSG. Per farlo, clicca sulla freccia a discesa accanto alla proprietà del materiale nell'Ispettore e scegli Copia. Per incollarlo, seleziona il nodo a cui vuoi applicare il materiale, clicca sulla freccia a discesa accanto alla sua proprietà di materiale e scegli Incolla.

Convertire in MeshInstance3D

Dalla versione 4.4 di Godot, è possibile convertire un nodo CSG e i suoi figli in un nodo MeshInstance3D.

Ciò ha diversi vantaggi:

  • Preparare le lightmap, dato che è possibile generare le UV2 su un MeshInstance3D.

  • Precalcolare l'occlusion culling, poiché il precalcolo dell'occlusion culling prende in considerazione solo i MeshInstance3D.

  • Tempi di caricamento più rapidi, poiché la mesh CSG non si deve più ricostruire al caricamento della scena.

  • Prestazioni migliori quando si aggiorna la trasformazione del nodo se la mesh è utilizzata all'interno di un altro nodo CSG.

Per convertire un nodo CSG in un nodo MeshInstance3D, selezionalo e poi scegli CSG > Bake Mesh Instance nella barra degli strumenti. Il nodo MeshInstance3D verrà creato come nodo fratello. Tieni presente che il nodo CSG utilizzato per il precalcolo non viene nascosto automaticamente, quindi ricorda di nasconderlo manualmente per evitare che la sua geometria si sovrapponga al MeshInstance3D appena creato.

Puoi anche creare una forma di collisione trimesh tramite CSG > Bake Collision Shape. Il nodo CollisionShape3D generato deve essere un figlio di un nodo StaticBody3D o AnimatableBody3D per poter funzionare.

Suggerimento

Ricorda di mantenere il nodo CSG originale nell'albero di scene, così da poter apportare modifiche alla geometria più tardi, se necessario. Per apportare modifiche alla geometria, rimuovi il nodo MeshInstance3D e rendi nuovamente visibile il nodo CSG radice.

Esportare come glTF

Può essere utile buttare giù idee per un livello tramite CSG, poi esportarlo come modello 3D per importarlo in un software di modellazione 3D. Puoi farlo selezionando Scena > Export as ... > glTF 2.0 Scene.

../../_images/export_as_gltf.webp