Exemple ODE : Le lâché de balle


Sommaire

[modifier] Objectif

Le but cet article est d'apprendre à utiliser les fonctionnalités de base de la librairie ODE.

Nous verrons tout au long de ce document les différentes fonctions C++ de base qui permettent d'insérer des volumes 3D dans un monde et de les faire entrer en collision.


[modifier] Configuration du projet de compilation/édition des liens

Quelque soit l'environnement de développement utilisé (en ligne de commande, avec Cbuilder, avec Visual C++, etc.) et quelque soit votre système d'exploitation (Windows, MaC, Solaris, Linux, etc.), vous devez paramètrer votre projet pour pouvoir fabriquer votre application. Vous devez tout d'abord inclure dans les options de compilation le chemin du répertoire contenant les fichiers d'entêtes d'ODE (fichiers avec l'extention .h). Finalement , vous devez ajouter le nom de la bibliothèque ODE dans les options de l'éditions des liens : "ode.lib".


[modifier] Entêtes

Afin d'utiliser les fonctions de la bibliothèque ODE, vous devez nécessairement inclure le fichier d'entête :

 #include <ode/ode.h>

Sans cela, tous les types /objets et les méthodes définis par ODE seront totalement inconnus pour votre compilateur.


[modifier] Initialiser ODE

Dans le cas ou vous voulez définir un univers où évoluent des volumes géométriques qui peuvent entrer en collision, vous devez paramètrer les deux moteurs internes de la bibliothèque : le premier moteur gère la dynamique des mouvements mécaniques des corps rigides et le second moteur gère uniquement les calculs de collision.

On va créer tout d'abord un monde dans lequel vont évoluer des coprs rigides :

dWorldID identifiantWorld = dWorldCreate();

La méthode dWorldCreate() va générer un monde pour stocker les corps physiques et retourne un numéro identifiant unique que l'on va stocker dans la variable identifiantWorld.

On va ensuite associer de la gravité à notre monde : tous les corps contenus dans notre monde seront soumis par défaut à cette gravité :

dWorldSetGravity(identifiantWorld, 0.0f, -9.81f, 0.0f);

On applique une gravité sur le monde associé à au numéro unique "identifiantWorld". On applique une force sur l'axe des Y de -9,81 m/s² (gravité sur notre bonne vieille terre). Pour une simulation dans l'espace, il suffit de donner une gravité nulle.

Il faut ensuite créer un espace pour accueillir l'ensemble des formes géométriques. Cet espace ne sert uniquement qu'au moteur de gestion des collisions. Sur le même concept que l'entité "monde", l'espace n'est juste qu'un conteneur de formes géométrique. Il n'a qu'un simple but : simplifier les calculs des collisions entres formes géométriques :

identifiantSpace = dHashSpaceCreate(0);

La méthode "dHashSpaceCreate(int space)" permet de créer un espace( un univers) pour stocker les formes géométriques et retourne un numéro identifiant unique sur cet espace. On va bien sûr stocker ce numéro généré dans la variable identifaintSpace.

Note : il existe 3 méthodes de création d'espaces. Pour plus d'information, veuillez consulter le manuel officiel de ODE ou bien le tutoriel de présentation générale de ODE dans ce WIKI.

[modifier] Quitter ODE

Avant de quitter votre application, vous devez libérer les ressources utilisées par ODE.

Tout d'abord, vous devez détruire le monde créé précédemment. Le fait de le détruire va automatiquement détruire tous les coprs rigides qui le composent. Il faut passer le numéro du monde à détruire en paramètre de fonction :

 dWorldDestroy(identifiantWorld);


Ensuite, détruisez l'espace qui contient les formes géométriques. Il faut passer en paramètre de fonction le numéro de l'espace à supprimer. Note : les formes géométriques peuplants l'espace désigné seront elles aussi supprimées :

 dSpaceDestroy(identifiantSpace);

Finalement, il faut désallouer la mémoire utilisée par ODE :

 dCloseODE();


[modifier] Captures d'écran

Des captures d'écran de l'application de test :