[C# - Irrlicht.net - ODE.net] Intégrer de la physique dans Irrlicht !

Proposé par kedu

le 08 October 2006 à 22h 39mn 32s

16676 visualisations



Ce tuto s'adresse aux débutants avant tout ; le but étant de montrer une manière d'intégrer la physique avec votre moteur graphique favori !
Vous trouverez à la fin l'ensemble du code source en rapport avec cette petite scène. Les dll d'ODE et D'Irrlicht s'y trouvent volontairement au cas où vous ayez besoin de les remettre en réfèrences du projet.


L'objectif de ce tutorial est de mettre au point une petite scène constituée d'un sol, d'un mur de brique et d'une balle ! Un bouton permettra d'appliquer une force à la balle afin que cette dernière percute le mur de brique. Tout un programme !



I) La partie graphique

Rien de difficile ici, nous faisons juste appel au passage à une fenêtre qui nous permet de recueillir les souhaits pour le paramétrage du driver d'Irrlicht. (choix de la résolution, du type de driver, etc.)

Je vous laisse vous reporter au contenu de cette "SetupDriverDialog" qui est on ne peut plus basique.

Code:

//Initialisation du driver video
SetupDriverDialog DriverDialog = new SetupDriverDialog();
DriverDialog.ShowDialog();

Voyons maintenant quelque chose de plus intéressant : nous avons initialisé la 3D, il serait peut être temps de penser à la physique !

Code:

//Initialisation et lancement de la physique
maPhysique = new Physique();
monThreadDeRenduPhysique = new Thread(new ThreadStart (maPhysique.PhysiqueRenderLoop));
monThreadDeRenduPhysique.Start();

Nous détaillerons dans la partie suivante cette classe qui gère notre physique. Néanmoins on voit ici que l'exécution de cette physique se fait dans un thread à part.

Voici les raisons qui expliquent ce choix :
- Nous évitons ici de calculer la physique dans notre boucle de rendu 3D d'Irrlicht. Cela n'est pas innocent ; ainsi une mauvaise performance dans le rendu 3D n'influera pas dans le calcul de notre physique. (et l'inverse est aussi vrai)
- Une autre raison réside dans le fait que nous devons bénéficier d'une "unité de temps" pour notre scène. (vous trouverez l'explication à cela dans la seconde partie)

Pour clore cette première partie, il nous reste à peupler notre scene d'un sol, d'un mur de cubes, d'une balle. A titre d'exemple voici le code de notre mur de cubes :

Code:

int NbsCubeSceneNode=0;
for (float y=0.0f;y<=40.0f;y+=5.0f)
{
  for(float x=-40f+y;x<=40f-y;x+=5f)
  {
  CubeSceneNode[NbsCubeSceneNode] = device.SceneManager.AddCubeSceneNode(5,null,-1,new vector3d(x,y+2.5f,0));
  CubeSceneNode[NbsCubeSceneNode].SetMaterialTexture(0, device.VideoDriver.GetTexture("cube.jpg"));CubeSceneNode[NbsCubeSceneNode].SetMaterialFlag(MaterialFlag.LIGHTING, false);
  NbsCubeSceneNode++;
  }
}

Rien de bien compliqué, il suffit juste d'apprécier la magie d'Irrlicht...

II) La physique

C'est bien entendu ici que réside la difficulté... Par où commencer ? Et bien nous avons deux choses à mettre en place rapidement. Il faut d'ailleurs comprendre que ces deux choses sont indépendantes pour ODE, notre librairie physique.
Il s'agit des "collisions" et des "corps".

a) Les collisions

Ces dernières peuvent se présenter sous la forme d'une boîte, d'une sphere par exemple ou bien d'un regroupement de Meshs. Dans l'espace de nom d'ODE, il s'agit des Geoms. Nous nous servirons donc de ODE.Geoms.Box et de ODE.Geoms.Sphere pour notre scène.

b) Les corps

Les corps sont plus complexes ; ils ont la charge de représenter toutes les propriétés physiques de nos objets dynamiques. (Nos cubes et notre balle dans le cas présent)

c) La création de notre physique - collisions & corps en action !

Dans la partie précédente nous avons créé nos cubes 3D à l'aide d'Irrlicht, nous devons donc créer maintenant les collisions & corps correspondants à ces cubes !

Code:

//81 cubes
int oNbsCube=0;
for (float y=0.0f;y<=40.0f;y+=5.0f)
{
  for(float x=-40f+y;x<=40f-y;x+=5f)
  {
  oBody[oNbsCube] = new Body(oWorld);
  oBody[oNbsCube].Mass = Mass.BoxTotal(5f,5,5,5);
  oBody[oNbsCube].Position = new Vector3(x,y+2.5f,0);
  oBody[oNbsCube].AutoDisable=true;
                    
  oGeomBox[oNbsCube] = new Box(5,5,5);
  oGeomBox[oNbsCube].RigidBody = oBody[oNbsCube];
  oSpace.Add(oGeomBox[oNbsCube]);
  oBody[oNbsCube].Enabled=false;
  oNbsCube++;
  }
}

d) La boucle de rendu de la physique

Il faut se poser ici les bonnes questions ; A quelle fréquence re calculer la physique ? Comment faire pour que la vitesse de jeu soit équivalente sur n'importe quel pc ?

Il n'y a pas qu'une unique et bonne façon de faire mais cela étant nous pouvons comprendre facilement que rien n'oblige à aligner la fréquence du rendu graphique avec celui de la physique. Rappelons nous que l'illusion du mouvement se produit à partir de 25 images/secondes. D'un autre côté avec une boucle rapide, la physique et les collisions seront de qualité. Il s'agit donc de tester et de choisir le meilleur compromis.

Voici notre boucle de rendu physique :

Code:

while (1 == 1)
{
  Stopwatch stopWatch = Stopwatch.StartNew();    
        
  oSpace.Collide();            
                
  oWorld.QuickStep(0.10f,10);

  oCollider.ClearContactJoints();

  if ( (vitesseBoucle - stopWatch.ElapsedMilliseconds) > 0)
  {
    try
    {
    System.Threading.Thread.Sleep((vitesseBoucle - Convert.ToInt16(stopWatch.ElapsedMilliseconds)));
    }
    catch  {}
  }

 }

Il faut comprendre à partir de ce code qu'ODE "déroule" les calculs liés à la physique étape par étape. Cela se produit avec la méthode : oWorld.QuickStep(0.10f,10);

Etant donné que nous souhaitons dérouler ces étapes de manière universelle (quelque soit le pc qui exécutera cette boucle) nous veillons à la régularité de la boucle qui s'exécutera ainsi à la fréquence précisée par la variable vitesseBoucle.

III) Conclusions et remerciements

Pour aller plus loin, il apparaitrait utile de se fabriquer une classe qui "encapsulerait" à la fois le mesh 3D d'Irrlicht, la géométrie de collision et les corps d'ODE. Avis aux codeurs intéressés ;-)

Un grand merci à Copland pour ce travail d'équipe qui nous permet de vous proposer ici ce petit tutorial qui je l'espère vous servira pour vos réalisations personnelles.

Le source du projet : cliquer ici !


#1 

09-10-2006 12:58:03

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

très bon tuto, merci beaucoup !
DeusXL, à quand l'intégration d'ode dans irrlicht .NET CP ? smile


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#2 

09-10-2006 18:37:55

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

Si tu veux dire *directement* dans Irrlicht .NET CP, à toi de l'écrire, moi j'ai repris les cours en force donc je me concentre surtout sur la tonne de bugfixes à faire (rien qu'à voir la révision 32 ou 33, une trentaine de fichiers modifiés pour des bugfixes) big_smile

Sinon, comme Irrlicht .NET CP marche *mieux* que le wrapper officiel, aucun problème pour utiliser ODE avec.

Bon sinon excellent tutoriel en effet smile moi je me tournais plus vers Newton mais je suis vraiment indécis sur le choix du moteur physique.
Par contre, ODE.NET c'est du C++/CLI ou du P/Invoke ? (en gros, c'est multiplateforme ou non ? tongue)


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#3 

09-10-2006 21:53:31

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Houla tu me poses une colle pour ODE.Net - Et pourtant c'est important ^^ Car ça serait dommage de perdre la portabilité d'Irrlicht avec une librairie physique non-mutliplateforme.

J'ai posé la question à Copland qui mènera l'enquête dès qu'il en aura la possibilité ^^ Affaire à suivre donc...

Pour ce qui est de la comparaison ODE/Newton, je ne sais pas trop lequel est le plus indiqué. Ne connaissant Newton que par ses démos, je n'ai pas assez d'éléments pour juger. Mais ils m'ont l'air tous deux de qualité ; d'autant plus que leurs développements respectifs semblent apporter régulièrement des améliorations/corrections intéressantes.

(Et bon courage/remerciemment à DeusXL pour son boulot de bugFixing ;-))

Hors ligne


#4 

10-10-2006 03:23:11

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Hello,
Un peu en retard mais j'ai pris le temps de tester ...
Ode se compile merveilleusement bien sous linux et les samples fonctionnent à vitesse grand V.
Donc je pense pouvoir dire qu'il est multiplateforme smile.
Voilou @++


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#5 

10-10-2006 12:46:30

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

même ode.net ?


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#6 

10-10-2006 13:33:03

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Bein pour le .Net par contre il doit falloir faire un wrapper, mais je sais pas du tout comment fonctionne le .Net sous linux...


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#7 

10-10-2006 15:46:13

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

J'ai regardé la source d'ODE.NET et bien sûr, ils ont écouté les recommandations de Microsoft : c'est du C++/CLI sad donc pas cross-platform.

Heureusement qu'on a pensé à nous sur Newton et que quelqu'un a fait (cf forum "Projects Announcement" d'Irrlicht) un wrapper P/Invoke de Newton.


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#8 

14-10-2006 19:06:55

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Woaw super nouvelle DeusXL ! J'aimerais bien pouvoir faire le même tuto en remplaçant ODE par Newton et ce wrapper en P/Invoke pour voir un peu les différences, ça pourrait être sympa.

A voir quoi ^^

Hors ligne


#9 

18-10-2006 09:45:33

Yosashi
Membre
Date d'inscription: 18-10-2006
Messages: 10

Merci pour le tutorial smile

j'utilisais pas trop la physique jusque maintenant , mais j'essaierai m'y mettre.
Ce qui manque c'est un peu ou outil comme dans Newton permettant de définir l'enveloppe
physique des objets et leurs propriétés pour ensuite les utiliser dans un jeu.

Hors ligne


#10 

26-10-2006 20:47:18

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Oui effectivement, ça manque cette histoire d'enveloppe ; comme le fait de n'avoir pas l'équivalent de ce qu' à fait DeusXL pour ODE ou Newton. Ce qui fait qu'actuellement on perd le côté multiplateforme dès qu'on veut mettre de la physique dans son application/jeu.

Espérons que cela puisse évoler ! :-)

Hors ligne


#11 

27-10-2006 10:33:40

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

Comme je l'ai dit, quelqu'un l'avait fait pour Newton mais le projet semble avoir été abandonné (et le lien est mort)... Fort triste car si je me souviens bien, ça marchait pas trop mal... J'essayerai de retrouver chez moi les anciennes sources.

PS : Honnêtement, wrapper newton en C# c'est de la blague... Deux jours de boulot tout au plus.


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#12 

28-10-2006 09:40:20

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Oui, d'où mon post de désespoir après avoir constaté les liens cassés. :-(

Je n'ai malheureusement pas les compétences pour faire un wrapper réellement multi plateforme. Je guetterai donc la moindre initiative en ce sens qui plus est si les Objets de type Matrix, Vector3, quaternion & co du wrapper physique seraient ceux d'Irrlicht... "I have a dream..." lol

Hors ligne


#13 

28-10-2006 11:15:01

Dekron
Membre
Lieu: Orléans
Date d'inscription: 21-10-2006
Messages: 46
Site web

Il faut comprendre à partir de ce code qu'ODE "déroule" les calculs liés à la physique étape par étape. Cela se produit avec la méthode : oWorld.QuickStep(0.10f,10);


Petite question qui concerne davantage irrlicht que ce moeur physique en particulier : on utilise souvent le format "nombref, nombre", ici par exemple : 0.10f,10. Ceci par exempel pour les positions spaciales de mesh ou de camera.

Que représente le "f" ici ? A quoi sert-il ? Il y a une tite surcharge dessus ??


Visitez Arcis : MMORPG ammateur utilisant irrlicht !
Etudiant ingénieur, maitrise C++, connaissances python & php.

Hors ligne


#14 

28-10-2006 11:26:08

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

(le f ajouté est juste là pour enlever toute ambiguïté sur le type de la valeur ; ainsi le compilo comprend qu'il doit l'interprêter comme un float)

Hors ligne


#15 

28-10-2006 16:36:04

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

kedu :

Oui, d'où mon post de désespoir après avoir constaté les liens cassés. :-(

Je n'ai malheureusement pas les compétences pour faire un wrapper réellement multi plateforme. Je guetterai donc la moindre initiative en ce sens qui plus est si les Objets de type Matrix, Vector3, quaternion & co du wrapper physique seraient ceux d'Irrlicht... "I have a dream..." lol


http://deusxl.free.fr/Newton.cs

Ce wrapper n'est pas de moi (c'est celui dont je parlais) mais il fonctionne à merveille wink

Si tu veux un exemple je peux t'en uploader un aussi.

Par contre, l'aspect multi-plateforme est très très compromis par le fait que Newton est distribué sous Linux sous la forme d'une librairie statique (donc linkée avec l'exécutable) -extension .a-, et non d'une "shared library" -extension .so- qui serait exploitable par du P/Invoke. Et bien sûr, Newton n'est pas Open-Source.
Donc en gros, tant que personne ne pourra convaincre l'auteur de nous envoyer le .so (ça ne lui prendrait que deux minutes), on peut toujours courrir pour le voir marcher sous linux (à moins que quelqu'un ait une idée, je suis preneur alors).


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#16 

28-10-2006 17:32:44

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Sympa, j'vais pouvoir faire mumuse avec ça !

Ca va me permettre de voir la différence d'utilisation par rapport à ODE/ODE.net, merci ;-)

Hors ligne


#17 

06-12-2006 23:10:15

hydropix
Membre
Date d'inscription: 06-12-2006
Messages: 17
Site web

Kedu où en es-tu avec ton comparatif ?

Je dois me décider pour choisir un moteur de physique, Newton m'avait un peu plus impressionné grace à ses demos (playground) et je n'ai pas vu grande chose d'ODE, en dehors de l'exemple de ce tutoriel qui est séduisant de simplicité en ce qui concerne son implémentation. Mais, les tremblotement des cubes après le passage du projectile m'inquiète un peu, existe-t-il un moyen de régler ce problème par des réglages ? ou bien ODE en est incapable (j'en doute, mais je préfère poser la question) ?

Merci d'avance

Hors ligne


#18 

09-12-2006 04:57:20

hydropix
Membre
Date d'inscription: 06-12-2006
Messages: 17
Site web

Je vais me répondre, si jamais ça intéresse une autre personne qui passera par ici wink
Il faut ajouter un seuil de désactivation de la physique sur certain objets lorsqu'ils ne bougent presque plus. Il faut ajuster les valeurs de AutoDisableAngularThreshold et de AutoDisableLinearThreshold sur les objets Body. On peut aussi jouer sur les valeurs de World.QuickSted, j'obtiens quelque chose d'intéressant avec :

                    oBody[oNbsCube].AutoDisableAngularThreshold = 0.1f;
                    oBody[oNbsCube].AutoDisableLinearThreshold = 0.1f;

et

                    oWorld.QuickStep(0.1f,10);

Pour en revenir au Tuto, j'en redemande ! c'est vraiment pratique pour commencer. Merci de nous l'avoir partagé !

Dernière modification par hydropix (09-12-2006 05:14:21)

Hors ligne


#19 

12-12-2006 00:49:00

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Ooops j'avais zapé ce thread ; et bien oui comme tu l'as trouvé par toi-même, il ne faut pas hésiter à paufiner les réglages.

Pour ce qui en est du comparatif ODE / Newton ; Pour ce que j'en ai vu ce sont deux bons moteurs physique, c'est très difficile de les départager (le faut-il vraiment au final ?)

Pour me mouiller un peu, je préfère ODE sur deux points :

- La hiérarchie des classes qui me semble mieux ordonnée
- Le fait qu'il soit Open Source

Je crois surtout qu'il faut faire son choix et s'y tenir ; que ça soit Ode et Newton... ce qui fera la différence c'est la manière de les utiliser.

N'hésite pas à poster tes travaux dans ce domaine, hydropix  ;-)

Hors ligne


#20 

07-01-2007 17:54:04

N10
Membre
Date d'inscription: 27-10-2006
Messages: 46

En parlant de Newton j'ai une petite question pourai-savoir ou trouver des tutos ou exemple de newton en C# je n'en trouve pas ??? :s ???

Hors ligne


#21 

07-01-2007 19:25:23

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

http://www.irrlicht.fr/index.php?/telec … p;cat=libs

Si tu souhaites demander des précisions sur ce wrapper ou indiquer tes impressions sur ce dernier n'hésite pas à créer un nouveau sujet ;-)

Hors ligne


#22 

23-01-2007 11:51:41

Carou
Petit nouveau
Date d'inscription: 22-01-2007
Messages: 1

salut a tous.

Je redécouvre irrlicht grâce a Irrlicht .NET CP, je l'avais quitté a la version 0.6 parce que le C++ me rebute quelque peu ;-). Ce petit tutorial est vraiment cool pour se remettre dans la bain et découvrir Ode.

Ma petite question : ou trouve t'on de la documentation convenable pour Ode.net. J'aimerai rajouter une force de frottement sur la balle afin que celle-ci s'arrête au bout d'un moment. Y a plein de fonctions qui ont l'air intéressantes pour faire ça dans Ode mais je me tate. Votre avis??

Merci d'avance

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
10 invités en ligne
Aucun membre connecté
RSS Feed