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...
Forme di collisione (3D)
Questa guida spiega:
I tipi di forme di collisione disponibili in 3D in Godot.
Utilizzo di una mesh convessa o concava come forma di collisione.
Considerazioni sulle prestazioni riguardo le collisioni 3D.
Godot offre diversi tipi di forme di collisione, con differenti compromessi di prestazioni e di precisione.
È possibile definire la forma di un PhysicsBody3D aggiungendo uno o più CollisionShape3D come nodi figli diretti. I nodi figli indiretti (ovvero i figli dei nodi figli) saranno ignorati e non saranno utilizzati come forme di collisione. Inoltre, si noti che è necessario aggiungere una risorsa Shape3D ai nodi della forma di collisione nel pannello Ispettore.
Nota
Quando si aggiungono più forme di collisione a un singolo PhysicsBody, non c'è da preoccuparsi quando si sovrappongono. Non si "scontreranno" tra loro.
Forme primitive di collisione
Godot fornisce i seguenti tipi di forme primitive di collisione:
È possibile rappresentare la collisione della maggior parte degli oggetti più piccoli utilizzando una o più forme primitive. Tuttavia, per oggetti più complessi, come una grande nave o un intero livello, potrebbero essere necessarie forme convesse o concave. Maggiori dettagli in seguito.
Per gli oggetti dinamici, consigliamo di preferire le forme primitive come RigidBody e CharacterBody, in quanto il loro comportamento è il più affidabile. Spesso offrono anche prestazioni migliori.
Forme convesse di collisione
Le forme convesse di collisione sono un compromesso tra le forme primitive di collisione e quelle concave. Possono rappresentare forme di qualsiasi complessità, ma con un'importante condizione. Come suggerisce il nome, una singola forma può rappresentare solo una forma convessa. Ad esempio, una piramide è convessa, ma una scatola vuota è concava. Per definire un oggetto concavo con una singola forma di collisione, bisogna utilizzare una forma concava di collisione.
A seconda della complessità dell'oggetto, è possibile ottenere prestazioni migliori utilizzando più forme convesse anziché una forma concava di collisione. Godot consente di usare la decomposizione convessa per generare forme convesse che corrispondono più o meno a un oggetto cavo. Si noti che questo vantaggio sulle prestazioni non si applica più dopo un certo numero di forme convesse. Per oggetti grandi e complessi, come un intero livello, si consiglia di utilizzare forme concave.
È possibile generare una o più forme convesse di collisione dall'editor selezionando un MeshInstance3D e accedendo al menu Mesh in alto la viewport 3D. L'editor offre due modalità di generazione:
Create Single Convex Collision Sibling utilizza l'algoritmo Quickhull. Crea un nodo CollisionShape con una forma di collisione convessa generata automaticamente. Poiché genera una sola forma, offre buone prestazioni ed è ideale per piccoli oggetti.
Create Multiple Convex Collision Siblings utilizza l'algoritmo V-HACD. Crea diversi nodi CollisionShape, ognuno con una forma convessa. Poiché genera più forme, è più preciso per gli oggetti concavi a scapito delle prestazioni. Per oggetti di media complessità, sarà probabilmente più veloce di usare una singola forma di collisione concava.
Forme concave (o trimesh) di collisione
Le forme concave di collisione, dette anche forme trimesh di collisione, possono assumere qualsiasi forma, da pochi triangoli a migliaia di triangoli. Le forme concave sono l'opzione più lenta ma anche la più precisa in Godot. È possibile utilizzare le forme concave solo all'interno dei StaticBody. Non funzioneranno con CharacterBody o RigidBody a meno che la modalità del RigidBody non sia Static.
Nota
Sebbene le forme concave offrano la collisione più precisa, la segnalazione dei contatti può essere meno precisa rispetto alle forme primitive.
Quando non si utilizzano le Gridmap per progettare livelli, le forme concave sono l'approccio migliore per le collisioni di un livello. Detto questo, se un livello ha piccoli dettagli, potrebbe essere opportuno escluderli dalle collisioni per ottimizzazione e fluidità di gioco. Per farlo, è possibile creare una mesh di collisione semplificata in un modellatore 3D e lasciare che Godot generi automaticamente una forma di collisione corrispondente. Maggiori informazioni di seguito
Si noti che, a differenza delle forme primitive e convesse, una forma concava di collisione non ha un vero e proprio "volume". È possibile posizionare oggetti sia all suo esterno sia al suo interno.
È possibile generare una forma concava di collisione dall'editor selezionando un MeshInstance3D e accedendo al menu Mesh in alto la viewport 3D. L'editor offre due opzioni:
Create Trimesh Static Body è un'opzione pratica. Crea un corpo statico contenente una forma concava che corrisponde alla geometria della mesh.
Create Trimesh Collision Sibling crea un nodo CollisionShape con una forma concava che corrisponde alla geometria della mesh.
Vedi anche
Consulta Importare Scene 3D per informazioni su come esportare modelli per Godot e generare automaticamente le forme di collisione all'importazione.
Avvertimenti sulle prestazioni
Non sei limitato a una singola forma di collisione per ogni PhysicsBody. Tuttavia, consigliamo di mantenere il numero di forme il più basso possibile per migliorare le prestazioni, soprattutto per oggetti dinamici come RigidBody e CharacterBody. Oltretutto, evita di traslare, ruotare o ridimensionare le CollisionShape per beneficiare delle ottimizzazioni interne del motore di fisica.
Quando si utilizza una singola forma di collisione non trasformata in uno StaticBody, l'algoritmo broad phase ("fase ampia") del motore può scartare i PhysicsBody inattivi. La narrow phase ("fase ristretta") dovrà quindi tenere conto solo delle forme dei corpi attivi. Se uno StaticBody ha molte forme di collisione, la broad phase fallirà. La narrow phase, che è più lenta, dovrà quindi effettuare una verifica di collisione su ciascuna forma.
Se si riscontrano problemi di prestazioni, potrebbe essere necessario fare compromessi in termini di precisione. La maggioranza dei giochi non garantisce una collisione precisa al 100%. Trovano modi creativi per nasconderla o renderla impercettibile durante il normale gameplay.