Le
Novodex Physics Engine, edité par la société
Ageia est une
librairie C++ permettant d'intégrer la simulation de la physique dans des applications 3D. Quand on parle de physique, il s'agit surtout
des comportements dynamiques comme la gestion de la gravité, la gestion des collisions entre les différents objets de la scène, la
gestion des points de pivots et joints ou encore la déformation des corps.
Un des grands avantages du NovodeX, outre que son intégration dans Demoniak3D s'est faite en très peu de temps, est que les fonctions de
cette librairie peuvent être accélérées par du matériel spécifique (
PPU pour
Physics Processor Unit) qui sera disponible
très prochainement (chez Asus par exemple). Mais on reparlera de cet aspect là lorsque les cartes seront dispo! Ce fonctionnement
est à rapprocher de celui d'OpenGL (ou de Direct3D) et des cartes 3D: pour obtenir un rendu ultra rapide, les fonctionnalités 3D
sont accélérées par la carte graphique.

Au niveau Demoniak3D, le moteur NovodeX est accessible principalement par scripting LUA (librairie HYP_Nx_Physics) et est également
accessible grâce à quelques éléments et attributs dans la description XML de la scène. Dans la version 1.0.0 de Demoniak3D, seul un ensemble réduit de
fonctionnalités du NovodeX a été intégré. Ces fonctionnalités se résument à la gestion des forces, des vitesses, des couples, des collisions,
toutes ces gestions ne s'appliquant qu'à des formes simples: sphère, boîte et plan. Mais avec ces 3 primitives de bases, on arrive à
faire pas mal de choses.
***IMPORTANT pour faire fonctionner les demos Ageia PhysX***: Ageia PhysX Drivers and Demoniak3D
Nous voilà dans la partie la plus intéressante de ce tutor. Mais d'abord, comme il se doit, un screenshot:

fig.1 - La chute des dominos.La but de la démo est très simple: une dizaine de dominos (ou un truc qui y ressemble) sont posé sur un plan et l'appui sur la touche ESPACE
du clavier permet de lancer la boule blanche contre le domino le plus à droite. Ce qui suit est logique: la chute de ce premier domino permet de faire
tomber tous les autres. Le code source de la démo est disponible en download en bas de la page.
La première chose à faire lorsque que l'on veut utiliser les calculs physiques, est d'initialiser le moteur physique au niveau de la scène Demoniak3D.
Ceci se fait à l'aide des attributs
nx_physics_simulation et
nx_collision_detection comme le montre le code suivant:
<scene name="NX_Scene"
nx_physics_simulation="TRUE" nx_collision_detection="TRUE" >
<nx_gravity x="0.0" y="-100.0" z="0.0" />
</scene>L'attribut
nx_physics_simulation permet de démarrer le moteur physique. Petit détail mais qui a son importance: le moteur NovodeX
gère son propre arbre de scène, tout comme le moteur oZone3D gère le sien. Dans le cas d'oZone3D, les noeuds de l'arbre sont appelés
objet (object en uk) et dans le cas de NovodeX, les noeuds sont appelés acteurs (actor en uk). D'où la dénomination de certaines librairies et
fonctions de la host API LUA: HYP_Object, HYP_Nx_Physics.SetActorLinearVelocity() par exemple.
L'attribut
nx_collision_detection permet quant à lui d'activer la gestion des collisions. La plupart du temps la gestion des collisions sera activée.
L'élément
nx_gravity permet de fixer la valeur de la gravité pour toute la scène. La valeur par défaut est de {0.0, -9.81, 0.0} mais les simulations
deviennent réalistes lorsque l'on multiplie par 10 ce vecteur. Il y a surement un bug quelque part dans Demoniak3D que je débusquerai un des ces quatres!
Une fois le moteur de physique initialisé, Il ne reste plus qu'à mettre les objects 3D / acteurs dans la scène. Pour ajouter un acteur dans la
scène du moteur physique, il suffit d'utiliser l'attribut
nx_add_to_physics_engine disponible dans les noeuds mesh ou model ou primitive.
Le code suivant nous fourni un exemple avec le noeud model:
<model name="box08" filename="data/domino/box01.3ds"
lighting="TRUE" texturing="TRUE"
nx_add_to_physics_engine="TRUE" shadow_caster="TRUE" >
<position x="-140.0" y="20.0" z="0.0" />
<orientation yaw="90.0" />
</model>
Pour que les dimensions de l'objet soient bien interprétées par le moteur de physique, il est essentiel que l'objet ait été
centré lors de la phase de modélisation. En clair cela signifie que si la position de l'objet dans Demoniak3D est de {0.0, 0.0, 0.0}, sa
boîte englobante (bounding box) doit être centrer en {0.0, 0.0, 0.0}. L'affichage de la bounding box se fait en utilisant l'attribut
display_bounding_box dans les noeuds mesh ou model.
L'initialisation des 10 dominos et de la boule de fait de manière similaire. Le détail se trouve dans le projet d'accompagnement.
Cette démo nous permet aussi d'avoir un aperçu de l'utilisation de la librairie
HYP_Nx_Physics de la host API LUA.
En effet, l'appui sur la touche ESPACE permet de lancer la boule contre le domino de droite. Mais comment se fait cette lancée?
Et bien tout simplement en affectant un vecteur vélocité à la boule avec la fonction
HYP_Nx_Physics.SetActorLinearVelocity().
Pour éviter que la boule ne pate trop loin, on lui ajoute aussi un facteur d'amortissement de la vitesse avec la fonction
HYP_Nx_Physics.SetActorLinearDamping().
Enfin, pour augmenter le réalisme, une petite rotation avec amortissement est transmise
à la boule à l'aide des fonctions
HYP_Nx_Physics.SetActorAngularVelocity() et
HYP_Nx_Physics.SetActorAngularDamping().
<script name="start_sim_lua" run_mode="ASYNCHRONOUS" >
<raw_data><![CDATA[
HYP_Nx_Physics.SetActorLinearVelocity( "bullet",-200.0,100.0,0.0 );
HYP_Nx_Physics.SetActorLinearDamping( "bullet",2.0 );
HYP_Nx_Physics.SetActorAngularVelocity( "bullet",0.0,0.0,1.0 );
HYP_Nx_Physics.SetActorAngularDamping( "bullet",1.0 );
]]></raw_data>
</script>
Voilà, je pense que l'essentiel pour cette introduction à l'utilisation du moteur de physique NovodeX est dit.
Nous aurons l'occasion d'en reparler prochainement dans d'autres tutoriaux.