FurMark
Current Version: 1.8.2
»FurMark
»Benchmark Submissions

GPU Caps Viewer
Current Version: 1.8.9
»GPU Caps Viewer
»GPU DB Submissions

PhysX FluidMark
Current Version: 1.2.0
»PhysX FluidMark
»Benchmark Submissions

Blogs
»Demoniak3D Blog
»JeGX's Infamous Lab

Link to Us

oZone3D.Net 100% Realtime 3D

»All Site's Network
 
Introduction au Moteur de Physique NovodeX

Par Jérôme 'JeGX' GUINOT
jegx [at] ozone3d [dot] net - The oZone3D Team

Version initiale: 9 Novembre 2005




1 - Introduction

2 - Intégration dans Demoniak3D

3 - La démo de test

4 - Downloads




1 - Introduction


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.







2 - Intégration dans Demoniak3D


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.


3 - La démo de test


***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.


4 - Downloads



Téléchargez le projet d'accompagnement
Mise à jour: 10 Nov 2005






Langue:

3D Graphics Search Engine:

The Geeks Of 3D





Geeks3D News


HackLAB News

Demoniak3D
Current Version: 1.23.0
»Demoniak3D
»Download
»Libraries and Plugins
»Demos
»Online Help - Reference Guide
»Codes Samples


Misc
»Texture DataPack #1
»Asus Silent Knight CPU Cooler
Page generated in 0.083746910095215 seconds.