Tutoriel ODE n°02 : Vite un exemple !!! « le: 27 Octobre 2005 à 15:24:54 » Bon ... Je vais essayé de faire simple dans la mesure ou ce qui va suivre EST simple Smiley Le source du programme ce trouve en bas de page et étudions le step by step. Ouvrez un nouveau document blitz et sauvez-le dans le répertoire que nous avons précédement crée sous le nom suivant : Code: ODE_Exemple01_Cube.bb Pourquoi un nom si long alors que ODE01.BB aurait pu être utilisé ? Tout simplement parce que je suis un pète couilles Smiley et que pour des raisons pratiques, il vaut mieux un nom long qui veux dire quelque chose, plutot qu'un nom cour qui dans 6 mois ne vous parlera plus Smiley Dans ce nouveau fichier copiez les lignes suivantes : Code: Include "Inc_BlitzODE.bb" Include "Inc_Camera.bb" Include "Inc_Light.bb" Graphics3D 800, 600,32,2 SetBuffer BackBuffer() Proc_CreateCamera() Proc_CreateLight() Plane = CreatePlane() EntityColor Plane, 100, 100, 100 Ces quelques lignes servent à ouvrir un écran et à initialiser quelques trucs comme la camera et les lumieres... Des conneries en somme Smiley Passont à la suite, copiez ces lignes : Code: Global ODE_Plane = True Global ODE_World = ODE_dWorldCreate(ODE_Plane ) ODE_dSetContactMode(dContactBounce + dContactSoftERP + dContactSoftCFM) ODE_dSetBOUNCE(0.1) ODE_dSetSOFT_ERP(1.5) ODE_dSetSOFT_CFM(0.1) Je vais essayer de faire cours sur les details : Code: Global ODE_World = ODE_dWorldCreate(ODE_Plane ) Initialise le 'monde' ODE en specifiant si ce monde doit etre affublé d'un sol virtuel. Code: ODE_dSetContactMode(dContactBounce + dContactSoftERP + dContactSoftCFM) Définit les options de 'contact' grâce à des constantes ODE Nous allons maintenant initialiser : Code: ODE_dSetBOUNCE(1.5) ODE_dSetSOFT_ERP(0.4) ODE_dSetSOFT_CFM(0.8) Pour le moment laissez les paramètres suivant, vous ferez joujou après ... La sa devient plus tendu :)Copiez les lignes suivante dans votre programme : Code: g.TODEGeom = New TODEGeom gbody = ODE_dBodyCreate() ggeom = ODE_dCreateBox(ODE_World, 2.5, 2.5,2.5,4) ODE_dGeomSetBody ggeom, gbody ODE_dBodySetPosition(gbody, 0, 10, 0) ODE_dBodySetRotation(gbody, Rand(-180, 180), Rand(-180, 180), Rand(-180, 180)) gmesh = CreateCube() EntityColor gmesh, 255, 255, 0 EntityShininess gmesh, 0.7 Si vous regardez dans le fichier : Inc_BlitzODE.bb Vous verrez qu'il existe un TYPE permettant de gérer des listes d'objets ODE+Objets blitz. Donc la tout simplement nous déclarons un de ces type Smiley dans le FIELD body nous initialisons un BODY classic ODE : Code: ODE_dBodyCreate() Ensuite à ce BODY nous attachons une boite virtuelle (invisible au rendu) et nous définissont ensuite les paramètres de cette 'boite physique'. Pas la peine de trainer sur : Code: ODE_dBodySetPosition() et ODE_dBodySetRotation() :) Voyons plutôt les paramètres de : Code: ODE_dCreateBox(space%, width#, height#, depth#, mass#). space%=Bin le nom du 'monde ODE' ici c'est ODE_World width#=Dimension de la boite (X) height#=Dimension de la boite (Y) depth#=Dimension de la boite (Z) mass#=Le poid de l'objet ODE Ensuite à ce cube virtuel nous appliquont un mesh simple, un cube :)logique. Code: gmesh = CreateCube() EntityColor gmesh, 255, 255, 0 EntityShininess gmesh, 0.7 Ensuite il y a cette ligne mystérieuse : Code: ODE_UpdateGeoms() C'est une fonction très simple qui permet de recalibrer la position et la rotation du couple d'objet 3d et ODE (les champs BODY et MESH du type). Voici cette fonction : Code: Function ODE_UpdateGeoms() For g.TODEGeom = Each TODEGeom PositionEntity gmesh, ODE_dGeomGetPositionX(ggeom), ODE_dGeomGetPositionY(ggeom), ODE_dGeomGetPositionZ(ggeom) RotateEntity gmesh, ODE_dGeomGetPitch(ggeom), ODE_dGeomGetYaw(ggeom), ODE_dGeomGetRoll(ggeom), 1 Next End Function Cette fonction se trouve dans l'include : Inc_BlitzODE.bb Ensuite nous avons notre boucle machin while truc Smiley classique Smiley Regardons les lignes suivantes. Code: ODE_dWorldQuickStep 0.1 ODE_UpdateGeoms() Pas la peine de re-expliquer l'utilité de ODE_UpdateGeoms() Smiley passont à : Code: ODE_dWorldQuickStep 0.1 Cette ligne indique à ODE de calculer SA physique avec un paramètre de vitesse ! Cette fonction est utile si vous utilisé des routines de delta time pour faire, par exemple, des ralenti ou acceleration !! D'ailleur regardont un truc rigolo... Lancez le programme, vous devriez voir un cube qui tombe Smiley fantastique Smiley Maintenant retournez dans votre programme blitz et changez Code: ODE_dWorldQuickStep 0.1 par ODE_dWorldQuickStep 0.6 et relancez Le cube tombe 6 fois plus vite Smiley maintenant essayez : Code: ODE_dWorldQuickStep 0.02 Et la à vous les effets d'acceleration et de bullet time Smiley Rendez vous pour la suite Smiley Et voici le programme complet : Code: Include "Inc_BlitzODE.bb" Include "Inc_Camera.bb" Include "Inc_Light.bb" Graphics3D 800, 600,32,2 SetBuffer BackBuffer() Proc_CreateCamera() Proc_CreateLight() Plane = CreatePlane() EntityColor Plane, 100,100, 100 Global ODE_Plane = True Global ODE_World = ODE_dWorldCreate(ODE_Plane ) ODE_dSetContactMode(dContactBounce + dContactSoftERP + dContactSoftCFM) ODE_dSetBOUNCE(1.5) ODE_dSetSOFT_ERP(0.4) ODE_dSetSOFT_CFM(0.8) g.TODEGeom = New TODEGeom gbody = ODE_dBodyCreate() ggeom = ODE_dCreateBox(ODE_World, 2.5, 2.5,2.5,4) ODE_dGeomSetBody ggeom, gbody ODE_dBodySetPosition(gbody, 0, 10, 0) ODE_dBodySetRotation(gbody, Rand(-180, 180), Rand(-180, 180), Rand(-180, 180)) gmesh = CreateCube() EntityColor gmesh, 255, 255, 0 EntityShininess gmesh, 0.7 ODE_UpdateGeoms() While Not KeyHit(1) ODE_dWorldQuickStep 0.02 ODE_UpdateGeoms() UpdateWorld RenderWorld Proc_Freelook(Camera_Ent,1.1,0.1) Flip Wend ODE_dCloseODE() End Journalisée "Je crois au moment. S'il n'y a pas le moment, à ce moment-là, il faut arriver à ce moment-là, au moment qu'on veut." JC Vandamme "En 1 semaine, t'as réussit à pourrir quasiment tous les topics et en déterrer des tellement vieux, que même un nécrophile y mettrait pas sa bite." Wako Progi1984 Global Moderator Floodeur ***** Karma: 0 Messages: 934 A vous de choisir WWW Re : Tutorial ODE n°02 : Vite un exemple !!! « Répondre #1 le: 27 Octobre 2005 à 16:00:20 » J'ai enfin compris quelque chose au moteur physique ! Merci ! Vivement la suite Smiley Journalisée Co Créateur de : Développeur PHP de PEAR::SpreadSheet_Excel_Writer ..::Progi1984::.. pedro37 Invité Re : Tutorial ODE n°02 : Vite un exemple !!! « Répondre #2 le: 28 Octobre 2005 à 15:44:57 » fantastique :lol: merci filax Smiley Journalisée Squaredge Invité Re : Tutoriel ODE n°02 : Vite un exemple !!! « Répondre #3 le: 24 Avril 2006 à 12:12:05 » Merci pour l'initiative Filax. Depuis ce matin je matte ton code afin de comprendre un peu mieux ODE et j'ai quelques question qui se posent à moi (les infos sur ODE sont assez difficile à trouver sur le net (à part sur le forum de Blitz3D Fr :p) : Tout d'abord, j'ai recopié (a peu près ton code) afin de comprendre mais un premier problème arrive : Mon objet physique "entre" dans le sol : Code: ; --------------------------; ; INCLUSION DES FONCTIONS ; ; --------------------------; Include "Inc_BlitzODE.bb" Include "Inc_Camera.bb" ;-----------; ; VARIABLES ; ; ----------; ; Résolution de l'écran Const SCRW% = 800 Const SCRH% = 600 ; --------------------; ; PROGRAMME PRINCIPAL ; ; --------------------; ; Initialisations générales Main(SCRW,SCRH) ; Création de la caméra Proc_CreateCamera() ; Création du plan Plane = CreatePlane() EntityColor Plane,255,100,100 ; On initialise le monde ODE (True indique qu'un sol existe) Global Monde = ODE_dWorldCreate(True) ; Création de la gravité terrestre ODE_dWorldSetGravity(0.0, -9.81, 0.0) ; Création d'une géométrie rattachée au monde ODE g.TODEGeom = New TODEGeom gbody = ODE_dBodyCreate() ggeom = ODE_dCreateBox(Monde,1,1,1,1) ; ODE_dCreateBox(space%, width#, height#, depth#, mass#) ODE_dGeomSetBody ggeom, gbody ODE_dBodySetPosition(gbody,0,10,0) gmesh = CreateCube() ; ------------------; ; BOUCLE PRINCIPALE ; ; ------------------; While Not KeyHit(1) ; Mise a jour des géométries ODE_UpdateGeoms() ; Mise a jour de la physique du monde ODE_dWorldQuickStep 0.01 UpdateWorld RenderWorld Flip Wend ; On libére les ressources ODE_dCloseODE() End Function Main(Width,Height) Graphics3D Width,Height,32,2 ; Couleurs 32 bits en mode fenêtre SetBuffer BackBuffer() AntiAlias enable End Function De toute évidence, ODE reconnait l'origine de la scène comme "sol". Le placement du plan que je réalise devrait normalement être sur le meme axe mais il y a toujours ce problème ... Ensuite, si j'ai compris, sous ODE il faut créer un "TODEGeom" à chaque objet que l'on souhaite positionner dans le monde. Il y a donc une entité invisible englobant l'objet visible et qui permet (je suppose) de tester les collisions. Les unités utilisées avec ODE sont les même que sous Blitz ? Par exemple : Code: ggeom = ODE_dCreateBox(Monde,2,2,2,1) gmesh = CreateCube() ScaleEntity gmesh,2,2,2 Les 2 boites sont identiques ? Si non, cela pourrais expliquer le problème décrit dans ma première question. Je sais que ca peut paraitre bidon mais les moteurs physiques c'est quelque chose de tout nouveau et même avec une bonne description du concept comme l'a fait Filax j'ai encore un peu de mal sur les bases, malgrès les recherches que j'ai pu faire ici et là. Merci encore Cheesy Journalisée Canigou Invité Re : Tutoriel ODE n°02 : Vite un exemple !!! « Répondre #4 le: 26 Mai 2006 à 11:29:54 » SquareEdge, la reponse à ta questionj se trouve dans le code de Filax : Tout d'abord, il définit la boite sous ODE : Code: ggeom = ODE_dCreateBox(ODE_World, 2.5, 2.5,2.5,4) puis sous blitz : Code: gmesh = CreateCube() etant donné qu'il y a pas de "ScaleEntity" pour le cube blitz, il est par défaut à 1 donc le rapport ODE/Blitz est d'environ 2.5/1(il est, semble t il, légerement inferieur en fait, car en regardant bien, le cube ne touche pas le sol, il y a un leger interstice entre les 2) Journalisée Squaredge Invité Re : Tutoriel ODE n°02 : Vite un exemple !!! « Répondre #5 le: 23 Juin 2006 à 15:53:49 » Oui merci Canigou. C'est a peu pres cela, les valeurs changent selon le moteur physique utilisé Wink