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.
Checking the stable version of the documentation...
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.).
If you are going to draw the same object many times, it can be helpful to use a MultiMesh with a MultiMeshInstance3D. MultiMeshInstance3Ds draw meshes thousands of times very cheaply by taking advantage of hardware instancing. The drawback with using a MultiMeshInstance3D is that each of your mesh's surfaces are limited to one material for all instances. It uses an instance array to store different colors and transformations for each instance, but all the instances of each surface use the same material.
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 is more limited than both ArrayMesh and SurfaceTool. However, if you need the geometry to change every frame anyway, it provides a much easier interface that can be slightly faster than generating an ArrayMesh every frame.
The MeshDataTool is not fast, but it gives you access to all kinds of properties of the mesh that you don't get with the others (edges, faces, etc.). It is incredibly useful when you need that sort of data to transform the mesh, but it is not a good idea to use it if that extra information is not needed. The MeshDataTool is best used if you are going to be using an algorithm that requires access to the face or edge array.