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.

Geometria procedurale

Ci sono numerosi modi per generare geometria proceduralmente in Godot. In questa serie di tutorial, ne esploreremo alcuni. Ogni tecnica ha i suoi vantaggi e svantaggi, quindi è meglio comprenderle tutte e capire come servirebbero in una determinata situazione.

Nota

Tutti i metodi di generazione procedurale di geometria qui descritti vengono eseguiti sulla CPU. Godot non supporta ancora la generazione di geometria sulla GPU.

Che cos'è la geometria?

La geometria è un termine elegante per indicare una forma. Nella computergrafica, la geometria è tipicamente rappresentata da una serie di posizioni chiamate "vertici". In Godot, la geometria è rappresentata da mesh.

Che cos'è una Mesh?

Molti oggetti in Godot hanno la parola mesh nel loro nome: Mesh, ArrayMesh, ImmediateMesh, MeshInstance3D, MultiMesh e MultiMeshInstance3D. Sebbene siano tutti correlati, hanno usi leggermente diversi.

Mesh e ArrayMesh sono risorse disegnate tramite un nodo MeshInstance3D. Risorse come Mesh e ArrayMesh non si possono aggiungere direttamente alla scena. Un nodo MeshInstance3D rappresenta un'istanza di una mesh nella scena. È possibile riutilizzare una singola mesh in più nodi MeshInstance3D per disegnarla in diverse parti della scena, con materiali o trasformazioni differenti (scala, rotazione, posizione, ecc.).

Se si prevede di disegnare lo stesso oggetto più volte, può essere utile usare una MultiMesh con una MultiMeshInstance3D. Le MultiMeshInstance3D disegnano mesh migliaia di volte con minimo impatto, sfruttando l'istanziazione hardware. Lo svantaggio di usare una MultiMeshInstance3D è che ciascuna superficie della mesh è limitata a un solo materiale per tutte le istanze. Essa utilizza un array di istanze per memorizzare colori e trasformazioni diversi per ogni istanza, ma tutte le istanze di ciascuna superficie utilizzano lo stesso materiale.

Cosa è una Mesh

Una Mesh è composta da una o più superfici. Una superficie è un array composto da più sotto-array contenenti vertici, normali, UV, ecc. Normalmente, il processo di costruzione di superfici e mesh è nascosto all'utente nel RenderingServer, ma con ArrayMesh, l'utente può costruire una mesh manualmente passando un array contenente le informazioni riguardo le superfici.

Superfici

Ogni superficie ha il suo materiale. In alternativa, è possibile sostituire il materiale per tutte le superfici nella Mesh quando si utilizza una MeshInstance3D attraverso la proprietà material_override.

Array di superfici

L'array di superfici è un array di lunghezza ArrayMesh.ARRAY_MAX. Ogni posizione nell'array è riempita con un sotto-array contenente informazioni per ogni vertice. Ad esempio, l'array situato in ArrayMesh.ARRAY_NORMAL è un PackedVector3Array di normali di vertici. Vedere Mesh.ArrayType per ulteriori informazioni.

L'array di superfici può essere indicizzato o non indicizzato. Creare un array non indicizzato è tanto semplice quanto non assegnare un array all'indice ArrayMesh.ARRAY_INDEX. Un array non indicizzato memorizza informazioni univoche sui vertici per ogni triangolo, il che significa che quando due triangoli condividono un vertice, il vertice è duplicato nell'array. Un array di superfici indicizzato memorizza solo le informazioni sui vertici per ogni vertice univoco e poi memorizza anche un array di indici che mappa come costruire i triangoli dall'array di vertici. In generale, usare un array indicizzato è più veloce, ma significa che è necessario condividere i dati sui vertici tra i triangoli, il che non è sempre gradito (ad esempio, quando c'è bisogno di normali per ogni faccia).

Strumenti

Godot offre diversi modi per accedere e lavorare con la geometria. I prossimi tutorial forniranno maggiori informazioni su ciascuno di essi.

ArrayMesh

La risorsa ArrayMesh estende Mesh per aggiungere qualche funzione ausiliare e, cosa più importante, l'abilità di costruire una superficie Mesh tramite script.

Per ulteriori informazioni sull'ArrayMesh, consulta il tutorial ArrayMesh.

MeshDataTool

Il MeshDataTool è una risorsa che converte i dati di Mesh in array di vertici, facce e spigoli che si possono modificare in fase di esecuzione.

Per maggiori informazioni su MeshDataTool, consulta il tutorial MeshDataTool.

SurfaceTool

La classe SurfaceTool consente la creazione di Mesh attraverso un'interfaccia in stile "immediate mode" di OpenGL 1.x.

Per maggiori informazioni su SurfaceTool, consulta il tutorial SurfaceTool.

ImmediateMesh

L'ImmediateMesh è una mesh che utilizza un'interfaccia in stile "immediate mode" (simile a SurfaceTool) per disegnare oggetti. La differenza tra ImmediateMesh e SurfaceTool è che ImmediateMesh è disegnata direttamente con codice dinamicamente, mentre SurfaceTool è utilizzato per generare una mesh con cui è possibile fare ciò che si desidera.

ImmediateMesh è utile per la prototipazione grazie alla sua API intuitiva, ma è lento perché la geometria è ricostruita ogni volta che si apporta una modifica. È particolarmente utile per aggiungere geometrie semplici per il debug visivo (ad esempio, disegnando linee per visualizzare raycast fisici, ecc.).

Per ulteriori informazioni su ImmediateMesh, consultare il Tutorial ImmediateMesh.

Quale dovrei usare?

L'approccio da adottare dipende da cosa si vuole fare e dal tipo di procedura con cui ci si sente a proprio agio.

Entrambi SurfaceTool e ArrayMesh sono eccellenti per generare geometrie statiche (mesh) che non cambiano nel tempo.

Usare un ArrayMesh è leggermente più veloce rispetto a un SurfaceTool, ma l'API è un po' più complessa. Inoltre, SurfaceTool offre alcuni comodi metodi ausiliari, come generate_normals() e index().

ImmediateMesh è più limitato rispetto ad entrambi ArrayMesh e SurfaceTool. Tuttavia, se la geometria deve comunque cambiare a ogni frame, offre un'interfaccia molto più semplice e può risultare leggermente più veloce rispetto alla generazione di un ArrayMesh a ogni frame.

Il MeshDataTool non è veloce, ma permette di accedere a ogni sorta di proprietà della mesh che non sono disponibili con gli altri strumenti (bordi, facce, ecc.). È incredibilmente utile quando serve questa sorta di dati per trasformare la mesh, ma non è consigliabile usarlo se queste informazioni in più non sono necessarie. Il MeshDataTool è meglio usato se intendi utilizzare un algoritmo che richiede l'accesso all'array di facce o bordi.