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.

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 cava è concava. Per definire un oggetto concavo con una singola forma di collisione, è necessario 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 utilizzando il menu Mesh in alto la viewport 3D. L'editor offre due modalità di generazione:

  • Create Single Convex Collision Sibling uses the Quickhull algorithm. It creates one CollisionShape node with an automatically generated convex collision shape. Since it only generates a single shape, it provides good performance and is ideal for small objects.

  • Create Multiple Convex Collision Siblings uses the V-HACD algorithm. It creates several CollisionShape nodes, each with a convex shape. Since it generates multiple shapes, it is more accurate for concave objects at the cost of performance. For objects with medium complexity, it will likely be faster than using a single concave collision shape.

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ù accurata, la segnalazione dei contatti può essere meno precisa rispetto alle forme primitive.

When not using GridMaps for level design, concave shapes are the best approach for a level's collision. That said, if your level has small details, you may want to exclude those from collision for performance and game feel. To do so, you can build a simplified collision mesh in a 3D modeler and have Godot generate a collision shape for it automatically. More on that below

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 utilizzando il menu Mesh in alto la viewport 3D. L'editor offre due opzioni:

  • Create Trimesh Static Body is a convenient option. It creates a StaticBody containing a concave shape matching the mesh's geometry.

  • Create Trimesh Collision Sibling creates a CollisionShape node with a concave shape matching the mesh's geometry.

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 si è limitati a una singola forma di collisione per 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, evitare 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.