Création d'une simulation de corps rigide Bullet

Voici une description des étapes de base de création d'une simulation de corps rigide à l'aide des noeuds Bullet Physics dans MCG.

Créer un univers

Un système Bullet Physics est appelé "univers". L'univers représente ce qui doit être mis en cache et mis à jour au cours de la simulation. Il doit contenir tous les corps rigides participant à la simulation avec leurs contraintes et relations.

Avant de pouvoir ajouter des corps rigides à l'univers, vous devez créer l'univers. Cette opération nécessite une heure initiale, qui est généralement l'heure de début de votre scène. Vous pouvez également définir la gravité de l'univers.

Ajouter un objet dynamique

Les objets dynamiques sont des corps rigides dont les transformations sont mises à jour par le moteur Bullet Physics, contrairement aux autres objets qui servent uniquement d'objets de collision potentielle.

L'ajout d'un objet dynamique à l'univers implique les étapes de base suivantes :
  1. Définissez les propriétés dynamiques d'un corps rigide.

    Pour un objet dynamique, la masse doit être positive et non nulle.

  2. Utilisez les propriétés dynamiques pour créer un corps rigide.
    • Pour un objet dynamique, vous devez définir le port isKinematic sur False.
    • Le maillage convexHull est le maillage utilisé pour la détection de collisions. Il doit être hermétique, et s'il possède des concavités, seule son enveloppe convexe est utilisée. Il ne doit pas nécessairement s'agir du maillage utilisé par la forme rendue de l'objet. Vous pouvez par exemple utiliser un maillage simplifié pour accélérer les calculs de collisions ou un maillage de plus petite taille pour éviter les forces explosives provoquées par les interpénétration d'objets groupés de manière serrée.
  3. Si vous le souhaitez, vous pouvez définir la vitesse initiale de l'objet et créer des contraintes.
  4. Ajoutez l'objet dynamique à l'univers.

Ensuite, vous aurez besoin d'un index d'objets dynamiques pour obtenir la valeur de transformation de l'univers. Il faut donc garder trace du nombre d'objets dynamiques ajoutés à l'univers et leur ordre. Le premier objet ajouté à l'univers a un index de 0 ; le suivant un index de 1, etc.

Ajouter des objets de collision

Le moteur Bullet Physics utilise des objets de collision pour les collisions des objets dynamiques, mais il ne met pas à jour leurs transformations. Elles sont généralement utilisées pour des éléments tels que les sols et les murs, mais elles peuvent également être animées.

L'ajout d'objets de collision est similaire à l'ajout d'objets dynamiques, mais en plus simple :
  • La valeur isKinematic doit être true. Cela ne signifie pas nécessairement que l'objet de collision est animé, mais s'il l'est, votre graphique est responsable de la mise à jour de ses transformations avant l'entrée dans l'univers.
  • La masse est ignorée (toujours égale à zéro).
  • Les vitesse et contrainte ne s'appliquent pas.

Encore une fois, vous pouvez utiliser des réseaux pour ajouter plusieurs objets de collision.

Créer un cache d'univers

Une fois que vous avez ajouté le dernier corps rigide, utilisez la fonction résultante pour définir l'état initial du cache de l'univers.

Mettre à jour le cache de l'univers

Vous devez maintenant définir comment mettre à jour le cache sur chaque image. L'opération peut se faire en deux étapes :
  • Si les objets de collision sont animés, mettez à jour l'univers avec leurs nouvelles transformations.
  • Avancer l'univers dans le temps.

Mettre à jour les transformations d'objet de collision

La mise à jour des transformations des objets de collision consiste à obtenir les matrices de transformation courantes des noeuds INodes dans la scène et à définir les transformations des corps rigides correspondants dans l'univers par index. Comme précédemment, vous pouvez utiliser des réseaux pour plusieurs objets.

Avancer dans le temps

Avancez la simulation, en fonction de la différence entre l'heure courante de la scène et la dernière heure de simulation. Connectez la fonction résultante au port updateFunc du noeud CreateCache.

Obtenir les transformations mises à jour

La dernière étape consiste à importer les valeurs de transformation simulées de l'univers mis en cache par index, et à les utiliser.
  • Pour un contrôleur, vous générez une seule transformation.
  • Pour, par exemple, une géométrie, vous pouvez instancier des copies d'un maillage sur un réseau de transformations.