Formes de collision (3D)

Ce guide explique :

  • Les types de formes de collision disponibles en 3D dans Godot.
  • Utilisation d'un maillage convexe ou concave comme forme de collision.
  • Considérations de performance concernant les collisions 3D.

Godot fournit de nombreux types de formes de collision, avec différents compromis de performance et de précision.

Vous pouvez définir la forme d'un PhysicsBody en ajoutant un ou plusieurs CollisionShapes comme nœuds enfants. Notez que vous devez ajouter une resource Shape aux nœuds forme de collision dans le dock Inspecteur.

Note

Lorsque vous ajoutez plusieurs formes de collision à un seul PhysicsBody, vous n'avez pas à vous soucier de leur chevauchement. Elles ne se "heurteront" pas les unes les autres.

Formes primitives de collision

Godot fournit les types de formes de collision primitives suivants :

Vous pouvez représenter la collision de la plupart des petits objets en utilisant une ou plusieurs formes primitives. Cependant, pour les objets plus complexes, comme un grand navire ou un niveau entier, vous pouvez avoir besoin de formes convexes ou concaves à la place. Plus d'informations à ce sujet ci-dessous.

Nous recommandons de privilégier les formes primitives pour les objets dynamiques tels que les RigidBodies et KinematicBodies car leur comportement est le plus fiable. Elles offrent souvent aussi de meilleures performances.

Formes de collision convexes

Les formes de collision convexes sont un compromis entre les formes de collision primitives et les formes de collision concaves. Elles peuvent représenter des formes de n'importe quelle complexité, mais avec une mise en garde importante. Comme leur nom l'indique, une forme individuelle ne peut représenter qu'une forme convexe. Par exemple, une pyramide est convexe, mais une boîte creuse est concave. Pour définir un objet concave avec une forme de collision unique, vous devez utiliser une forme de collision concave.

Selon la complexité de l'objet, vous pouvez obtenir de meilleures performances en utilisant plusieurs formes convexes au lieu d'une forme de collision concave. Godot vous permet d'utiliser la décomposition convexe pour générer des formes convexes qui correspondent approximativement à un objet creux. Notez que cet avantage de performance ne s'applique plus après un certain nombre de formes convexes. Pour les objets volumineux et complexes tels qu'un niveau entier, nous recommandons d'utiliser des formes concaves à la place.

Vous pouvez générer une ou plusieurs formes de collision convexes à partir de l'éditeur en sélectionnant un MeshInstance et en utilisant le menu Mesh en haut de la vue 3D. L'éditeur expose deux modes de génération :

  • Create Single Convex Collision Sibling utilise l'algorithme Quickhull. Il crée un nœud CollisionShape avec une forme de collision convexe générée automatiquement. Comme il ne génère qu'une seule forme, il offre de bonnes performances et est idéal pour les petits objets.
  • Create Multiple Convex Collision Siblings utilise l'algorithme V-HACD. Il crée plusieurs nœuds CollisionShape, chacun ayant une forme convexe. Comme il génère des formes multiples, il est plus précis pour les objets concaves au prix de la performance. Pour les objets de complexité moyenne, il sera probablement plus rapide que l'utilisation d'une seule forme de collision concave.

Formes de collision concaves ou trimesh

Formes de collision concaves, aussi appelées formes de collision trimesh, peuvent prendre n'importe quelle forme, de quelques triangles à des milliers de triangles. Les formes concaves sont l'option la plus lente mais sont aussi les plus précises dans Godot. Vous ne pouvez utiliser que des formes concaves dans les StaticBodies. Elles ne fonctionneront pas avec les KinematicBodies ou les RigidBodies, sauf si le mode de ces derniers est Static.

Note

Même si les formes concaves offrent la collision la plus précise, les rapports de contact peuvent être moins précis que ceux des formes primitives.

Lorsqu'on n'utilise pas les GridMaps pour la conception des niveaux, les formes concaves sont la meilleure approche pour la collision d'un niveau. Cela dit, si votre niveau comporte de petits détails, vous voudrez peut-être les exclure de la collision pour des raisons de performances et de sensations de jeu. Pour ce faire, vous pouvez construire un maillage de collision simplifié dans un modeleur 3D et demander à Godot de générer automatiquement une forme de collision pour celui-ci. Plus d'informations à ce sujet ci-dessous

Notez que contrairement aux formes primitives et convexes, une forme de collision concave n'a pas de "volume" réel. Vous pouvez placer des objets aussi bien à l'extérieur de la forme que à l'intérieur.

Vous pouvez générer une forme de collision concave à partir de l'éditeur en sélectionnant un MeshInstance et en utilisant le menu Mesh en haut de la vue 3D. L'éditeur présente deux options :

  • Create Trimesh Static Body est une option pratique. Elle crée un StaticBody contenant une forme concave correspondant à la géométrie du maillage.
  • Create Trimesh Collision Sibling crée un nœud CollisionShape avec une forme concave correspondant à la géométrie du maillage.

Note

Supposons que vous ayez besoin de faire glisser un RigidBody sur une forme de collision concave. Dans ce cas, vous remarquerez peut-être que parfois, le RigidBody va se soulever. Pour résoudre ce problème, ouvrez Projet > Paramètres du projet et activez Physics > 3d > Smooth Trimesh Collision.

Une fois que vous avez activé smooth trimesh collision, assurez-vous que la forme concave est la seule forme de votre StaticBody et qu'elle est située à son origine sans aucune rotation. De cette façon, le RigidBody devrait parfaitement glisser sur le StaticBody.

Voir aussi

Godot peut générer automatiquement des formes de collision pour vos scènes 3D importées. Voir Conseils pour l'importation dans la documentation pour plus d'informations.

Mises en garde relatives aux performances

Vous n'êtes pas limité à une seule forme de collision par PhysicsBody. Néanmoins, nous recommandons de garder le nombre de formes aussi bas que possible pour améliorer les performances, en particulier pour les objets dynamiques comme RigidBodies et KinematicBodies. En outre, évitez de déplacer, de faire tourner ou de mettre à l'échelle les formes de collision pour bénéficier des optimisations internes du moteur physique.

Lorsque l'on utilise une forme de collision unique non transformée dans un StaticBody, l'algorithme broad phase du moteur peut éliminer les PhysicsBodies inactifs. La narrow phase ne devra alors prendre en compte que les formes des corps actifs. Si un StaticBody a de nombreuses formes de collision, la broad phase échouera. La narrow phase, qui est plus lente, doit alors effectuer un contrôle de collision avec chaque forme.

Si vous rencontrez des problèmes de performance, vous devrez peut-être faire des compromis en termes de précision. La plupart des jeux n'ont pas une précision de collision de 100 %. Ils trouvent des moyens créatifs de la cacher ou de la rendre inaperçue pendant le gameplay normal.