Gestion de détails en milieu urbain - Ikooko Studio
Transcription
Gestion de détails en milieu urbain - Ikooko Studio
Gestion de détails en milieu urbain DEMAY Nicolas Etranges Libellules R&D Outils Tuteur : AYMARD Cyril Rapport de Stage IMAC 2 Du 11/06 au 14/09 Année Scolaire 2006-2007 Résumé Ce rapport de stage retrace mon expérience vécue au sein de l’entreprise Etranges Libellules au cours de l’été 2007. Le but de ce stage était de réaliser la gestion de détails en milieu urbain. Les notions abordées sont principalement la physique des fluides et des solides avec les équations de Navier-Stokes et la physique de Newton. Je vous présenterai aussi ma solution basée sur un solveur de type « Stable Fluid » développé par Jos Stam. Ce rapport vous présentera aussi les diverses technologies utilisées par l’entreprise et plus principalement K et Kal. Vous y trouverez également les diverses idées ainsi que les choix techniques que j’ai réalisés au cours de ce stage. Mais aussi les diverses conclusions que j’ai faites que ce soit au niveau technique ou humain. Abstract This report of training course recalls my experiment lived within the company Etranges Libellules during the summer 2007. The goal of this training course be to carry out the management of details in urban environment. The concepts approached are mainly the physics of the fluids and the solids with the Navier-Stokes equations and the physics of Newton. I would present also my solution based on a solver of the type “Stable Fluid” developed by Jos Stam. This report will present also various technology used by the company and more mainly K and Kal. You will find in this report various ideas as well as the technical choices which I carried out during training course. But also various conclusions which I made that is at the technical or human level. Sommaire Résumé Abstract Sommaire Introduction 1.Présentation de l’entreprise 1.1. Historique 1.2. Organisation Interne 1.2.1. Déroulement des étapes de production d’un jeu-vidéo (exemple Astérix) 1.3. Secteur d’activité 1.4. Outils Logiciel : K et KAL 2. Gestion de détails : état de l’art 2.1. Introduction à la gestion de détails 2.2. Présentation de K et Kal et de leurs fonctionnalités 2.2.1. Concept généraux de Kal 2.2.2. KCore 2.2.3. Outils utiles dans Kal 2.3. Etat de l’art et orientation du stage 3. Cahier des charges et planning 4. Premières idées et premiers essais 4.1. Le système météo : le vent 4.1.1. Principe et idées générales 4.1.2. Implémentation de l’exemple 4.2. Idées et algorithmes en vrac 4.2.1. Déformations d’objets 4.2.2. Pluie, son et lumière 5.1.1. Navier-Stokes 5.1.2. “Stable Fluid” 5.1.3. Physique Mécanique 5. La dynamique des fluides, la physique mécanique et Kal 5.1. Théorie et Algorithme 5.2. Implémentation 5.2.1. Modèle de classe 5.2.2. IHM et objets implémentés 5.3. Résultats, limites et avenir 6.2. Humain 6. Bilan 6.1. Technique Conclusion Bibliographie Annexes I.Chaîne de Production II. Image de la Démo ATI ToyShop III. Simulation avec une force temporelle IV. Evolution de la FluidBox au cours du développement 1 2 2 2 3 6 7 10 10 11 11 11 12 13 15 17 17 17 19 20 21 22 23 23 23 24 26 27 27 30 32 36 36 37 38 39 41 42 43 44 45 Introduction Je souhaitais trouver un stage dans le domaine du jeu vidéo ou du cinéma d’animation afin de me rapprocher de ce qui me plaît le plus dans la formation à savoir l’imagerie numérique composée plus particulièrement de la 3D et du temps réel. Si je me suis orienté vers l’IMAC, c’est principalement pour pouvoir faire du développement de jeu vidéo ou du développement dans la R&D1 pour le cinéma d’animation. Mes expériences précédentes se sont toujours déroulées dans le milieu du Web (stage assistant chef de projet Web chez Skandia en 2006, stage infographiste chez Maïdo Production en 2005 etc.) et je souhaitais vraiment changer et apporter à mon CV une autre expérience professionnelle que celle offerte dans le domaine du Web. En effet les stages dans ce domaine relèvent plus de la production et n’ont pas d’autres intérêts que l’approche humaine du travail en entreprise. C’est pour cela que je souhaitais intégrer une équipe de R&D afin d’entrer dans un tout nouveau milieu et d’apprendre de nouvelles compétences. Malheureusement il est très difficile de trouver un stage dans ce domaine pour une durée maximum de 3 mois et demi. Mais la société Etranges Libellules proposait un stage en R&D outil et a bien voulu m’accueillir pour une durée de 3 mois. L’intitulé du stage est donc gestion de détail en milieu urbain en R&D outils. Ce terme signifie que le but est de développer un outil utilisable par l’entreprise pour ensuite l’intégrer dans différents jeux. La gestion de détail concerne la possibilité de faire bouger et réagir divers petits ou moyens objets du décor en fonction de divers événements. Tout au long de ce rapport, je vous expliquerai les différentes idées ainsi que la solution que j’ai mise en œuvre pour gérer ces détails. Ce rapport suivra le plan suivant, nous vous présenterons tout d’abord l’entreprise qui m’a accueillie, à savoir Etranges Libellules. Puis, nous ferons un état de l’art sur les différentes technologies approchées. Pour ensuite voir le planning et les premières idées ainsi que l’implémentation, à proprement parlé, de notre système. Enfin nous ferons le bilan de ce stage avant de conclure. 1 Recherche et Développement 0 1 1. Présentation de l’entreprise 1.1. Historique Etranges Libellules a été fondée en 1994 et se concentre sur la création graphique. Elle participe alors au succès de nombreux titres tels la série des Alone in The Dark, VRally, Need For Speed, Devil Inside, Arx Fatalis. En 1997, Etranges Libellules se tourne vers le développement de jeux et lance la collection Gunul et Cléo en 1999. Kirikou -PSX PC- en 2001 ; La Panthère Rose – PSX PC- en 2002 en Europe et en 2003 USA et Japon. Suivent Astérix XXL sur PS2, Game Cube et PC en 2003 et 2004 puis Astérix XXL2 : Mission Las Vegum PS2 et PC en 2005. En 2006, Etranges Libellules a été choisie par Luc Besson pour réaliser les jeux vidéo basés sur son film d’Animation Arthur et les Minimoys. Pour l’occasion Etranges Libellules a installé un studio à Paris et travaille en étroite collaboration avec les équipes du film. Aujourd’hui Etranges Libellules prépare d’autres jeux encore confidentiels sur DS, PSP (PlayStation Potable), Xbox360, Wii, PS3, PS2 et PC. La grande force d’Etranges Libellules est d’avoir su mettre en place une chaîne de production efficace pour produire des titres de très grande qualité sur les plateformes actuelles et à venir. Etranges Libellules est dirigée par Jean Marie Nazaret, fondateur de la société et par Edith Protière qui dirigea pendant 10 ans un studio de production au sein d’Infogrames / Atari. 1.2. Organisation Interne Un studio de développement de jeu vidéo est composé de multiples corps de métier que l’on peut regrouper en 3 parties. Tout d’abord les graphistes. Ce sont eux qui prennent en charge la réalisation de tous les objets que l’on voit à l’écran, à savoir les décors, les personnages, les interfaces ou encore les vidéos. 0 2 Il y a aussi les codeurs et designer. Ce sont les personnes qui « design » le jeu et les niveaux (on parle de game-designer et de level-designer). On parle aussi de « codeur scénarique » car ce sont eux qui créent l’histoire à l’intérieur du jeu. Ils développent les comportements des ennemis et du personnage, les mécanismes de jeu, les bonus, etc. Ils ont pour responsabilité toute la partie «Gameplay2» qu’ils codent grâce au logiciel et aux plug-ins développés par les programmeurs. Nous avons donc enfin les programmeurs qui, quant à eux, doivent développer les outils nécessaires aux codeurs pour réaliser le ou les jeux. En effet, les programmeurs développent des outils qui seront communs à différents projets et d’autres qui seront bien spécifiques à un seul jeu. Il y a évidemment différents postes à l’intérieur de ces 3 domaines comme par exemple ceux qui réalisent les vidéos, ceux qui s’occupent des animations des personnages, les graphistes qui s’occupent de réaliser les textures, les level-designer, les programmeurs en R&D et bien d’autres encore. Mais ces 3 domaines sont les plus importants avec bien évidemment le dernier qui est le domaine administratif, RH, comptabilité, administration réseau et secrétariat. Cela fait donc beaucoup de monde pour réaliser un jeu vidéo. Les domaines sont très variés puisqu’ils passent par l’enregistrement de son, le montage vidéo, le codage en langage de programmation, l’utilisation d’outils graphiques 2D et 3D ainsi que la réalisation du jeu sous le logiciel adéquat. 1.2.1. Déroulement des étapes de production d’un jeu-vidéo (exemple Astérix). La première étape pour réaliser un jeu vidéo est de réunir les idées. En effet, il faut imaginer l’univers (décors, personnages, monstres) ainsi que les phases de gameplay (niveau sous-marins, aérien, nouveau style de combats). Durant cette étape du développement, toutes les équipes peuvent participer et fournir des idées. Elles seront ensuite validées par le réalisateur du jeu vidéo comme pour un film. Une fois l’univers validé, il faut passer des illustrations et des schémas 2D aux personnages 3D. Il faut aussi commencer à développer les outils pour gérer les différentes phases de gameplay. 2 D’après la définition des Cahiers du cinéma, « concept omniprésent dans le monde du jeu vidéo, le game play est la manière dont un jeu implique celui qui s’y adonne. D’un jeu très beau mais peu prenant, on dira que ses concepteurs en ont négligé le gameplay ». Ou ailleurs : « le moteur d’un film, ce sont les images. Dans un jeu vidéo, le moteur émotionnel qui fait que le joueur reste devant le jeu c’est le gameplay, qui est déjà un scénario en soi : il propose un objectif, vous donne les moyens de l’atteindre et place des obstacles devant votre route ». 0 3 Les graphistes ont donc la charge de créer, texturer et animer les personnages ainsi que les décors. Tandis que les programmeurs développent des outils tels que les potions, les comportements des romains ou encore les divers mécanismes du jeu. C’est alors aux codeurs d’entrer en action. Ils font les réglages sous le logiciel de développement (régler les niveaux des potions, le pathfinding3 des romains et les liaisons entre les différents mécanismes.) Ils construisent littéralement les niveaux en ajoutant les personnages dans les décors en créant les différentes étapes de jeu. Une fois ces étapes réalisées, le jeu passe en phase de débogage. Cela signifie qu’il va être testé par les testeurs internes mais aussi par l’éditeur et par les différentes équipes afin de trouver les divers bugs et améliorations que l’on pourrait apporter. Vous trouverez ci-dessous une représentation schématique de la chaîne de production d’un jeu vidéo chez Etranges Libellules. Le schéma suivant vous montre clairement comment un jeu vidéo est produit. 0 4 3 La recherche de chemin, couramment appelée pathfinding, est un problème de l’intelligence artificielle. Il consiste à trouver comment se déplacer dans un environnement entre un point de départ et un point d’arrivée en prenant en compte différentes contraintes. 0 5 Chaine de Production d’un jeu vidéo 1.3. Secteur d’activité Le secteur du jeu vidéo regroupe principalement 2 types d’entreprises principalement. Les studios de développement qui conçoivent et réalisent les jeux. Leur production est un exemplaire unique, le master, qu’ils vendent avec les droits associés à un éditeur. Les studios sont à la fois des entreprises de création et des centres de recherche-développement. Ils sont généralement des PME (de 5 à 200 personnes), indépendantes ou intégrées à des sociétés éditrices. Les éditeurs sont chargés de la production (au sens du cinéma : initiative, financement, détention des droits de propriété intellectuelle), du marketing et de la promotion. C’est leur label (Electronic Arts, Ubisoft) qui figure sur les jeux. Il y a aussi les fabricants de consoles qui sont d’abord des industriels de l’électronique. Ils conçoivent un système informatique dédié au jeu vidéo, le font fabriquer (Microsoft) ou le fabriquent eux-mêmes (Sony), en assurent le marketing et la distribution. Ils exercent de plus une activité d’éditeur. 4 ELB est un développeur de jeux vidéo, la plupart de ces titres ont été édités par Atari. Mon stage s’inscrit donc dans le domaine du jeu vidéo mais plus particulièrement dans le secteur R&D. En effet, il ne s’agissait pas d’aider à la conception d’un jeu vidéo en particulier mais bien d’aider à développer de nouveaux outils pour réaliser des jeux vidéo. La tâche n’est donc pas la même. La R&D du jeu vidéo se compose aussi en 2 pôles. Un pôle de développement d’outils logiciels ou plug-in pour aider à la production comme par exemple le développement de plug-in pour Maya ou d’outils de compression de fichier. Le deuxième pôle, lui, est consacré au développement de ce que l’on appelle « le moteur » du jeu vidéo. Ce moteur va donner tous les outils et permettre de créer le monde du jeu (graphisme, mécanisme de jeux, physique, son, etc.…). Ce moteur a aussi pour tâche de faire fonctionner le jeu sur les différentes plateformes. (Les plateformes, ce sont les consoles sur lesquelles est commercialisé le jeu.) Or, 3 nouvelles plateformes sont sorties ces 2 dernières années et elles demandent donc un nouveau moteur. Cela signifie qu’il y a beaucoup de travail dans le domaine de la R&D dans les jeux vidéo en ce moment. 4 ELB : Etranges Libellules 0 6 1.4. Outils Logiciel : K et KAL ELB a développé sa propre chaîne de production. C’est-à-dire que l’entreprise a elle-même développé son moteur et son éditeur respectivement appelés « K » et « KAL ». Ce dernier est donc à première vue un logiciel de création de jeux vidéo permettant d’importer, modifier, configurer des personnages et d’autres objets 3D. Le but est de simplifier l’intégration et le suivi des ressources graphiques, sonores et scénariques. L’idée est simple, l’éditeur scénarique fonctionne “sur” le moteur de jeu en utilisant et paramétrant toutes ses fonctionnalités en temps réel. Cette architecture rend beaucoup plus souple le réglage du jeu. Elle permet de coder/tester/régler tout en jouant. Lorsque le jeu est en édition, l’éditeur scénarique (KAL) est directement branché sur le moteur du jeu (K). L’interface graphique de KAL permet d’éditer intuitivement les paramètres du moteur (K) et ce alors même que le jeu est en train de “tourner”. Le moteur (K) et son éditeur (KAL) peuvent accueillir des extensions (plugins). A chaque K-plugin correspond un KAL-plugin permettant l’édition intuitive de ses paramètres. KAL intègre aussi des outils de retouches simples (édition d’objets, de faces, de vertex d’UVs, etc.) pour éviter de trop fréquents “aller-retour” avec les logiciels de création de ressources graphiques et sonores. Le but n’est pas de réinventer un logiciel de création 3D ou sonore mais encore une fois d’optimiser et d’assouplir la chaîne de production. Le schéma ci-après vous montre le comportement de K et Kal en mode édition. 0 7 K et Kal en mode édition 0 8 Lorsque le jeu tourne sur une plateforme, l’éditeur scénarique (KAL) et ses plugins sont tout simplement “débranchés”. Le moteur du jeu (K) et ses plug-ins continuent de fonctionner normalement. 0 K en mode runtime K et Kal sont donc les outils principaux de réalisation au sein de l’entreprise ELB. Mais bien évidemment d’autres logiciels de création 3D ou 2D sont utilisés tel que Maya, Photoshop ou encore After Effect. Il y a aussi des logiciels de création sonore comme CoolEdit et SoundForge. En ce qui concerne la programmation, c’est Visual C++ qui est utilisé. Les postes de travail sont équipés en Windows Xp et en réseau. Les serveurs sont gérer avec Unix Debian et pour des raisons de confidentialité, les postes utilisateurs n’ont pas accès à internet, seul 5 postes spécifiques et en libre service ont accès au web en plus de ceux des chefs d’équipe. Maintenant que nous avons vu l’environnement technique et humain de l’entreprise nous allons passer plus en détail sur déroulement du stage, c’est-à-dire les différentes recherches et les développements réalisés. 9 2. Gestion de détails : état de l’art 2.1. Introduction à la gestion de détails Le stage s’intitule donc gestion de détails en milieu urbain. Il faut donc séparer et analyser ce qu’est la gestion de détails et ce qui correspond au milieu urbain. Tout d’abord, la gestion des détails, c’est la gestion du comportement de tous ces objets de petite ou moyenne taille qui font partie du décor et qui rendent la scène plus réaliste et convaincante. Le milieu urbain est là pour caractériser et mieux définir ces objets. En effet, ici nous aurons principalement des objets comme des canettes, des feuilles, des poubelles, des arbres, des fontaines, etc. Le but de ce stage est donc de pouvoir configurer le comportement du décor, de l’environnement pour le rendre plus dynamique, plus réaliste pour le joueur. La question est donc de savoir comment configurer cet environnement ou plutôt configurer cet environnement par rapport à quoi ? A quelles valeurs ? La solution est d’utiliser un système physique qui pourrait simuler divers événements auxquelles réagiraient ces objets. Celui-ci pourrait être spécifié en un système météo où les événements seraient le vent, les précipitations et la température. Mais un tel système demande que chaque objet ait un comportement bien différent (l’écoulement et les jets d’eau d’une fontaine, les différents types d’éclairage pour les enseignes, les mouvements d’un drapeau sous l’effet du vent.) Les compétences pour mettre en place un tel système sont très diverses et variées. On retrouve la géographie, la physique, l’aérodynamique, la biologie. Pour la suite du stage, nous allons principalement nous attarder sur les domaines liés à la physique et à l’aérodynamique. Nous avons aussi une contrainte supplémentaire qui est le fait que nous développons pour le domaine du jeu vidéo et que cette gestion de l’environnement a pour vocation de pouvoir s’effectuer en temps réel. De nombreux aspects de cette gestion de détail ne seront pas présentés dans ce rapport car nous n’avons pas pu tout essayer. Mais ces aspects ne sont pas à négliger et des fonctions telle que la gestion de l’éclairage ou encore la gestion des bruitages peuvent apporter beaucoup de réalisme et de dynamisme à ces petits objets du décor. 1 0 2.2. Présentation de K et Kal et de leurs fonctionnalités 2.2.1. Concept généraux de Kal Voici les termes couramment utilisés dans KAL : Les objets : ce sont tout simplement tous les éléments visibles par le joueur, c’est tout ce qui possède une représentation graphique dans Kal : les personnages, les objets du décor, les items, etc. Les vies : ce sont les comportements que l’on peut attribuer à un objet afin qu’il puisse effectuer des actions au cours du jeu. Ces vies peuvent avoir de multiples fonctions : déplacer l’objet (le héros, les ennemis), modifier un objet en temps réel (un émetteur de particules), etc. Les groupes : ils permettent de regrouper des objets afin de pouvoir effectuer des actions communes sur l’ensemble de ces objets, ou plus généralement de regrouper les objets par zones dans l’espace afin de pouvoir effectuer des traitements par lots plus facilement (dans le cas des collisions par exemple). Les entités: chaque entité est une façon de percevoir un projet Kal. Les entités les plus courantes sont : - L’entité objet : l’entité par défaut qui permet de travailler sur les objets et les vies. - L’entité vertex5 : permet de travailler sur les vertex des géométries des objets. Dans ce mode, on peut créer/supprimer/modifier des vertex - L’entité face et l’entité edge : Même chose que pour l’entité vertex 2.2.2. KCore KCore est le noyau de K. Il s’occupe de la boucle de jeu et introduit les notions de modules, services, groupes, vies, Hooks et composants. Il contient toutes les briques qui permettront d’ajouter des fonctionnalités à K que ce soit sous la forme de modules multiplateformes ou de plugins de vies ou de groupes. Le module est une brique sur laquelle s’appuie K pour fonctionner. Ces modules implémentent la gestion des autres notions telles que les services, le graphisme, les sons, les interactions de l’utilisateur et bien sur la boucle de jeu. 5 Un sommet dans le langage infographique 1 1 Le service permet d’avertir un objet qui s’est référencé auprès de lui d’un changement. Tous les objets de KCore ont aussi la possibilité de faire des requêtes directes au service. Les services seront par exemple : le service collision, le service déclenchement, etc. Les groupes ont pour but de ranger les Hooks et de définir quelles sont les vies que l’on peut attacher aux Hooks du groupe. Les groupes sont organisés de manière hiérarchique, assimilable à une dérivation. C’est à dire qu’un groupe « hérite » des propriétés de son parent. Les vies ont pour but d’animer, de déplacer, d’interagir, bref de rendre vivant l’objet auquel elles sont attachées. Elles peuvent être appliquées aux groupes et aux Hooks. Le Hook peut être vu comme un point d’accroche dans K. Cette accroche permet de faire une association entre les différentes entités qui le composent : les composants et la vie qui lui est associés Un composant peut être considéré comme une entité élémentaire de données réutilisables et partageables. Un composant, peut par exemple, être un objet graphique ou un paramètre de collision. Il existe des composants pour les vies, les Hooks ainsi que les groupes. 2.2.3. Outils utiles dans Kal Pour l’instant la gestion de détail se fait principalement avec les outils Fx (qui se trouvent dans le module graphique de K). Parmi ces outils Fx nous retrouvons : FxRain, FxClouds, FxTrail, FxParticle, etc. Ces outils permettent de simuler un mouvement d’un objet, une flamme qui bouge sous le vent ou même des feuilles qui tombent d’un arbre. En ce qui concerne un véritable service physique, il n’est pour l’instant qu’en phase de recherche et n’est pas du tout utilisé en production. Le service physique permet pour l’instant de créer 2 types d’objets (cinétique ou solide) et de voir les collisions entre ces objets ainsi que l’effet de la gravité. Voici les principales pistes de développement qui m’étaient fourni par Kal. 1 2 2.3. Etat de l’art et orientation du stage L’état de l’art va se décomposer en plusieurs parties. Une partie concernera les différents documents liés à la simulation de l’environnement réaliste (gestion de pluie, gestion de poussière, de vent). Une seconde partie est composée de documents sur la simulation de mouvement de tissu et sur la physique et à la dynamique de fluides. Dans la première partie de cet état de l’art, j’ai pu découvrir de nombreuses réalisations visant à simuler l’environnement dans lequel nous vivons. Ce domaine est en pleine expansion grâce à la puissance des nouvelles machines. Mais justement ce domaine (la simulation de l’environnement) est un domaine très « gourmand » en ressource et en temps de calcul, il est donc non temps réel pour la plupart. Parmi ces réalisations, on peut citer la vidéo ToyShop d’ATI (2006) ou la méthode « Dynamic Modeling and Rendering of Grass Wagging in Wind » (2005) ou encore le papier « Real-Time Simulation of Dust Behavior Generated by a Fast Traveling Vehicle » (1999). Toutes ces réalisations utilisent des données et des formules physiques pour simuler l’environnement. ATI essaie d’optimiser les temps de calcul en utilisant à la fois le matériel mais aussi en simplifiant les algorithmes. Dans cette deuxième partie, nous allons justement nous attarder sur ces formules physiques et sur les méthodes afin de les simplifier pour essayer de les rendre temps réel. Le document « Physically Based Real-time Animation of Curtains » présenté par Microsoft en 2000 explique l’utilisation d’un système masse-ressort pour simuler le rideau et un système d’émission de particule pour simuler le vent. Le point critique dans cette simulation est l’émission de particule pour simuler le vent. En effet, c’est cette méthode qui est la plus coûteuse et la moins adaptée au temps réel. Actuellement, c’est la méthode la plus utilisée pour simuler le vent, on la retrouve dans de nombreuses réalisations. Le vent peut être assimilé à un fluide et j’ai donc décidé de m’orienter dans cette direction, en cherchant s’il n’existait pas de solution de simulation de fluide en temps réel. La technique de Jos Stam - « Real-Time Fluid Dynamics for Games » présenté en 2003 propose un solveur simple et efficace pour la simulation de fluide en temps réel. 1 3 Cet état de l’art présente brièvement le chemin de raisonnement que j’ai suivi tout au long de ce stage. Le but était de trouver une solution pour gérer les détails en milieu urbain. Nous avons fait le choix en début de stage de ne pas s’orienter vers la gestion de la lumière et du son mais principalement vers le mouvement de ces objets et éventuellement leurs déformations. C’est dans cet esprit qu’a été fait cet état de l’art, afin de trouver comment appliquer un mouvement et une déformation à des objets du décor urbain. La phase de recherche a duré pendant plusieurs semaines afin de trouver la méthode que j’allais utiliser. Cependant, au cours du développement, il y a eu des phases de recherche principalement en ce qui concerne la physique (des fluides ou mécanique). Durant les premières semaines et donc en même temps que cet état de l’art, j’ai développé un petit exemple de ce que pourrait faire ma solution. 1 4 3. Cahier des charges et planning Le stage a été prévu par ELB de la manière suivante. Le sujet est donné puis le stagiaire dispose entre 3 et 4 semaines pour faire des recherches sur ce sujet et proposer une idée d’amélioration ou d’ajout dans le logiciel Kal et/ou le moteur K. Puis le stagiaire présente ses recherches à l’équipe qui l’oriente et le conseille. La suite du stage concerne le développement de la solution. Voici le planning prévisionnel qui a été fait avant la présentation de mes recherches. - Apprentissage environnement KAL (test sur les fonctionnalités existantes). - Apprentissage environnement de développement Visual C++. - Implémentation d’un petit exemple de simulateur de vent sur un objet. (Modification des valeurs du vent avec une visualisation temps réel des transformations de l’objet.) - Implémentation du modèle météo. - Implémentation d’un exemple de vent et un objet de type tissu - Implémentation d’un exemple de pluie utilisant ParticleNodeFx - Implémentation d’un exemple de poussière/fumée utilisant ParticleNodeFx. - Implémentation d’un objet fixe test. (En fonction du temps) - Implémentation d’un objet mobile test. (En fonction du temps) - Implémentation d’un rideau de pluie (gestion de la lumière et effet de droplet.) - Implémentation de plusieurs objets mixtes avec occlusion. - Test de performance sur environnement à grande échelle. Après la présentation, le choix de travailler principalement avec la technique de gestion des fluides et principalement avec les équations de Navier-Stokes a changé le planning. 1 5 Diagramme de Gantt du planning final 1 6 4. Premières idées et premiers essais 4.1. Le système météo : le vent 4.1.1. Principe et idées générales Comme dit précédemment, l’environnement prend en compte de nombreux éléments dont le vent. Le vent est l’élément que l’on retrouve partout et le plus souvent, il influe sur la plupart des objets, a lui seul, il sait donner une dynamique, un réalisme à une scène. C’est pour cela, alors même que mes recherches n’étaient pas encore terminées, que je me suis intéressé au vent. L’idée était donc de développer un plug-in K/KAL pouvant gérer le vent. Celui-ci serait limité à un seul objet afin de simplifier la tâche. En effet, la réalisation complète de ce modèle aurait demandé diverses implémentations comme un Z-buffer6 (afin de déterminer la position des objets face au vent), un système de détection d’occlusion (pour simuler le fait qu’un objet soit caché par un autre ou non), ainsi qu’un système de déformation de l’objet (c’est cette partie qui a été implémenté dans notre exemple). 1 7 Différentes étapes de réalisation d’un système de vent 6 En infographie, le Z-buffer ou tampon de profondeur est une méthode employée dans le cadre de l’affichage d’une scène 3D. Le Z-Buffer permet de gérer le problème de la visibilité qui consiste à déterminer quels éléments de la scène doivent être rendus, lesquels sont cachés par d’autres et dans quel ordre l’affichage des primitives doit se faire. Cette chaîne de réalisation se devait d’être temps-réel mais aussi réaliste. Il fallait donc optimiser les algorithmes comme le z-buffer et l’occlusion afin d’avoir le plus de temps possible pour les déformations (qui coutent le plus de temps de calcul car elles doivent être réalistes). De plus, La déformation des objets n’est pas la même pour tous les objets. En effet, il y aura les objets non déformables mais friables, les objets poreux, les objets qui peuvent se courber. La solution était que chacun de ces objets possède sa propre liste de comportement et dans ce cas, le système météo (de vent dans notre exemple) jouerait le rôle de machine à état que l’utilisateur configurerait à sa guise. 1 8 Machine à état du système météo 4.1.2. Implémentation de l’exemple Notre exemple sera un plug-in K/Kal permettant de charger un objet et de lui appliquer des déformations en fonction du vent. Le vent sera paramétré directement par l’utilisateur. Il a donc fallu créer un plug-in K constitué des classes suivantes : - CKGrpWind pour créer le groupe - CKHkWind pour créer le Hook Il a aussi fallu créer le plug-in Kal correspondant avec les classes : - CKalGrpWindDesc pour décrire le groupe - CKalHkWindDesc pour décrire le Hook Le but de ce plug-in est de déformer un objet. Il faut donc tout d’abord le charger. Les objets graphiques utilisés par K et Kal sont des .kif . On utilise donc les méthodes de chargement qui existe au sein de Kal. Ces objets .kif sont composés de bones7, de géométries et de textures. Les bones sont utilisés pour les animations, tandis que les géométries définissent l’objet graphique (comparable à son enveloppe) et les textures s’appliquent sur les géométries. La solution qui a été choisie pour réaliser ces déformations et de les appliquer directement sur la géométrie de l’objet. Code GetKGLObject()->GetGeometryList->GetElement(ui32CurrentGeomet ryElement)->GetVertices(); La déformation d’objet directement au niveau des géométries est quelque chose qui n’est pas souvent fait dans Kal. En effet cela demande beaucoup de temps de calcul puisqu’il faut parcourir tous les vertex de l’objet. Pour le moment, la déformation d’objet comme pour l’herbe sous le vent est gérée principalement avec une méthode de deshortogonalisation du repère. C’est à dire que l’on fait osciller Y. Ainsi les objets se retrouvant à Y=0 ne subissent pas d’oscillation mais plus Y est grand, plus l’objet est soumis à l’oscillation. Cette méthode n’est pas la plus réaliste mais permet d’avoir un rendu beaucoup plus rapide. 7 Signifie os. En infographie on utilise des bones pour animer des objets de la même façon que nos os.. 1 9 Interface Kal et déformation de notre objet 2 0 4.2. Idées et algorithmes en vrac Durant cette phase de recherche, j’ai émis différentes hypothèses et idées pour réaliser la gestion de l’environnement. Mais bien évidemment je n’ai pu explorer toutes ces pistes, cela ne veut pas dire que ce sont de mauvaises pistes ou des pistes moins intéressantes. C’est simplement dû à un choix ainsi que par les différentes contraintes comme la durée du stage ainsi que le contexte du jeu-vidéo et donc du temps réel. Cette partie est donc dédiée à toutes ces idées qui n’ont pas été approfondie par la suite. Nous pourrions aussi voir différents éléments visant à rendre les scènes plus réalistes au niveau de l’environnement. Nous pourrions donc développer différents éléments tels que le vent, la pluie, les nuages afin d’avoir plusieurs « briques » et différentes images pour rendre le stage plus concret. Il y a de nombreuses solutions pour améliorer le rendu de l’environnement dans les jeux vidéo. Il va donc falloir faire un choix sur ceux que nous pouvons développer durant la période du stage. Le vent sera notre cible privilégiée mais nous aborderons aussi la pluie avec la gestion des « splashes8 »ainsi que de l’éclairage en temps réel. 4.2.1. Déformations d’objets En ce qui concerne les déformations des objets en temps réel, plusieurs possibilités s’offraient à moi. L’algorithme de « Free-Form Deformation (FFD) » par exemple, ou encore l’algorithme de déformation des vertex en fonction de leurs normales (qui a été utilisé dans notre plug-in exemple). Cet algorithme déforme les vertex ou plutôt leur affecte une rotation en fonction de la direction du vent et de leurs normales. La résistance des objets à subir une déformation a été testée avec un algorithme de bounding volume (boîte englobante). Cela signifie que chaque vertex ne pouvait se déplacer hors d’une certaine boîte englobante. Cet algorithme est une version très simplifiée d’un système « masse ressort » qui aurait pu être utilisé dans ce cas. Un autre algorithme de déformations, plutôt orienté pour les tissus, est le « free-ends » qui constitue le fait de trouver les extrémités d’un tissu (bouts libres) puis d’utiliser un algorithme récursif pour appliquer le mouvement au reste de l’objet. Il y avait aussi la possibilité de modifier les bones plutôt que les géométries. Mais il aurait fallu que les bones soient adaptés aux déformations que nous voulions faire subir à l’objet et surtout que la modification des bones puisse directement être faite dans Kal. 4.2.2. Pluie, son et lumière Cette partie regroupe des idées plus globales qui n’ont pas été implémentées dans notre système au final. Tout d’abord, les lumières n’ont pas été implémentés du tout, et pourtant l’ajout de lumière contribue beaucoup à l’ambiance d’une scène. L’ajout d’une gestion de la lumière pour des objets de type détails comme des panneaux lumineux ou des réverbères serait très intéressant. On peut imaginer un éclairage dynamique produit par ces objets qui bougeraient en fonction du vent ou d’autres paramètres. 8 Impact de gouttes d’eau 2 1 En ce qui concerne le son, je pense que c’est une bonne solution pour avoir une scène encore plus réaliste et immerger le joueur. En effet, donner un son à chaque élément de détail et de pouvoir modifier ce son en fonction de paramètre comme le vent, l’écrasement de cet objet ou son déplacement rajouterait du réalisme à la scène. La pluie, quant à elle, n’est pas un élément de détail mais plutôt un événement qu’il serait bon d’intégrer dans une gestion de détails. Il est rare dans les jeux vidéo que la pluie soit un élément important, elle est souvent simplement représentée par des traits tombant devant l’écran et cela suffit souvent aux joueurs pour comprendre qu’il y a de la pluie. Mais une gestion plus approfondie de cet événement en rajoutant l’effet d’un sol mouillé, que certaines zones sont protégées par des parapluies ou des arbres apporterait plus de réalisme. 2 2 Exemple de pluie modélisé avec un FxParticle9 La solution qui a été retenue est la dynamique des fluides. En effet, ce système est global, c’est-à-dire qu’il s’applique à n’importe quel type d’objets avec n’importe quel paramètre. Il nous permet de simuler des forces comme la gravité ou le vent, mais il permet de mettre ces objets dans différents milieu, comme un milieu aérien ou aquatique. Pour simuler des fluides et leur mouvement en informatique, la technique la plus utilisée est la résolution des équations de Navier-Stokes. 9 Le réalisme de la pluie aurait pu être amélioré avec l’application de la texture d’environnement sur chaque particule ainsi que le rajout d’animation de type « splash » des gouttes au contact d’un objet. 5. La dynamique des fluides, la physique mécanique et Kal 5.1. Théorie et Algorithme 5.1.1. Navier-Stokes Les équations de Navier-Stokes permettent de décrire le mouvement d’un fluide. Elles gouvernent par exemple les mouvements de l’air, de l’atmosphère, les courants océaniques, l’écoulement de l’eau dans un tuyau et de nombreux autres phénomènes d’écoulement de fluides. Il existe de multiples façons de noter ces équations. Mais dans notre cas, il y a 2 notations qui nous intéressent particulièrement. 2 3 La première nous donne l’évolution des vélocités et la seconde l’évolution de la densité. En effet, ce sont ces 2 valeurs qui nous intéressent le plus dans notre cas. La vélocité représente un champ de vecteur qui associe un vecteur direction à chaque point de l’espace. La densité, quant à elle représente la quantité de fluide à chaque point. Bien évidemment ces équations peuvent être complexifiées afin de réaliser des modèles beaucoup plus complexes comme l’aérodynamisme des ailes d’un avion ou d’un pont. Mais ici, ces 2 notations nous suffisent surtout que l’on souhaite utiliser ces équations en temps réel. De plus, la forme de ces équations nous intéresse car nous allons pouvoir faire directement une analogie avec notre algorithme. 5.1.2. “Stable Fluid” Pour implémenter ces équations et les traduire en un algorithme temps réel, nous avons utilisé la méthode de Jos Stam « Stable Fluid » présentée dans son papier intitulé : « Real-Time Fluid Dynamics for Games ». Stam conseil de commencer le développement par la mise en place de l’algorithme pour résoudre l’équation de la densité (la deuxième). En informatique, on est obligé de discrétiser, on ne peut pas représenter chaque particule de l’espace. C’est pour cela que la première étape consiste à voxeliser l’espace (le discrétiser en voxel10). Il faut prendre soin de bien diviser l’espace dans le bon ordre, afin de pouvoir rapidement accéder au voisin de chaque voxel. Revenons à notre équation de densité (la deuxième) cette équation dit que la densité à un instant t dépend de 3 choses : - Le premier terme de l’équation signifie que la densité suit un champ de vélocité. - Le deuxième terme de l’équation signifie que la densité se diffuse. - Le dernier terme signifie que la densité augmente avec les sources de fluide (comme par exemple une cigarette ou une cheminée). Schéma de résolution du solveur de densité Comme vous pouvez le voir sur ce schéma, nous allons implémenter l’équation dans l’ordre inverse de sa notation. 10 Le voxel (contraction de « volumetric pixel ») est un pixel en 3D 2 4 Passons maintenant à l’équation de vélocité (la première). Comme pour la phase de densité nous pouvons voir que la vélocité à un instant dépend de 3 choses : - Le fait que la vélocité bouge autour d’elle-même (« Self-Advection »). - Le fait que la vélocité se diffuse (la viscosité). - Le fait que la vélocité augmente avec les sources (mouvement d’objets par exemple). Mais il y a une étape en plus pour implémenter cette équation, il faut qu’il y est conservation de la masse (propriété des fluides réel). L’implémentation est donc simplifiée par le fait de pouvoir réutiliser les fonctions développées lors de la phase de densité pour la phase de vélocité. Il ne reste plus maintenant qu’à initialiser les fonctions avec des valeurs données par l’utilisateur et l’algorithme produira un fluide avec un mouvement réaliste. Mais nous ne nous arrêtons pas là. En effet, le but est de pouvoir gérer des détails (des objets) et non du fluide. Le fluide est juste un moyen pour gérer ces objets. Pour cela, on utilisera une propriété importante de l’algorithme de Stam, à savoir les collisions ou plus particulièrement le fait qu’un voxel soit occupé par du fluide ou non. Cette propriété va nous permettre de pouvoir placer des objets au milieu du fluide et de voir d’une part le comportement du fluide mais dans un autre temps le comportement de ces objets. 2 5 Schéma de représentation de l’algorithme de notre solution Pour que nos objets réagissent au mouvement du fluide, il faut qu’il récupéré les valeurs de mouvement de ce fluide mais aussi qu’il ait des paramètres pour caractériser leurs déplacements. Ces paramètres proviennent de la physique mécanique. 5.1.3. Physique Mécanique La physique mécanique, ou la physique de Newton, nous donne les formules qui décrivent le déplacement d’un objet au cours du temps. Dans notre cas, nous cherchons à déplacer ces objets avec un minimum de paramètre mais tout en gardant le plus de réalisme possible. Regardons la loi de Newton : Cette équation signifie que la somme des forces appliquées à un objet est égale à sa masse multipliée par son accélération. Dans notre cas, les forces qui s’appliquent à notre objet sont le poids, la force de frottement avec le fluide ainsi que la poussée d’Archimède. De plus, dans notre cas l’objet subit aussi une force de pression du fluide. Le problème avec la physique et le mouvement dans le jeu vidéo est les contraintes de FPS11 et le fait que le temps entre 2 frames consécutives puisse être différent (ralentissement ou autre). De ce fait, les formules vues précédemment ne peuvent être applicables littéralement. Les formules m’ont principalement aidé pour connaître les paramètres nécessaires à déplacer un objet et comment ces paramètres influent sur le mouvement (diminution ou augmentation.) Schéma de modélisation des forces sur un objet dans le fluide 11 Frame par Second : Images affichées par seconde en français. 2 6 Toute la difficulté réside dans le fait de trouver la bonne approche pour que l’utilisateur puisse configurer les paramètres de l’objet simplement et obtenir le mouvement souhaité, tout en s’inspirant des lois de la physique mais en les détournant pour le jeu vidéo. Voilà, nos objets peuvent se déplacer maintenant mais nous avons voulu rajouter le fait de pouvoir leur faire faire une rotation. En effet, un arbre va réagir au fluide non pas en se déplaçant mais bien en se courbant (rotation). Là aussi, il existe un outil physique : le moment d’une force . Avec M le moment, F la force et d la distance entre le pivot et le point d’application de la force. Or dans notre cas il n’y a pas de point d’application à proprement dit. C’est plus une zone d’application, on ne peut donc pas appliquer non plus les équations du moment à notre modèle mais nous allons nous en inspirer. Maintenant que nous avons fait tous ces rappels théoriques et algorithmiques, nous allons entrer dans le vif du sujet, à savoir l’implémentation et les choix que j’ai fait par rapport au modèle physique. 2 7 5.2. Implémentation 5.2.1. Modèle de classe Il a donc fallu réaliser un plug-in K ainsi que son plug-in Kal correspondant pour implémenter ce système. Notre plug-in est donc constitué d’un groupe (CKGrpFluidBox pour K et CKalGrpFluidBoxDesc pour Kal). Ce groupe contient 3 Hooks (CKHkFluidBox, CKHkForce et CKHkPhysicObject). A termes, ce plug-in serait transformé en un service auquel les différents objets pourraient souscrire ou non. Mais pour des raisons de simplicité et de contrôle, le choix d’un plug-in a été préférable. En effet, toutes les fonctionnalités peuvent être faites au travers d’un plug-in et la création d’un nouveau service aurait été plus une perte de temps qui ne nous était pas permise (la durée du stage n’est que de 3 mois.) Revenons à nos classes à proprement parlé, le groupe est là pour pouvoir créer les différents Hooks mais aussi pour assurer la communication entre ces Hooks (la FluidBox a besoin de recevoir les informations des Forces tout comme les Objets physiques doivent recevoir les informations de la FluidBox). 12 Le moment d’une force est l’aptitude d’une force à faire tourner un système mécanique autour d’un point donné, qu’on nommera aussi pivot. La FluidBox permet de gérer les fluides, c’est ici que les équations de Navier-Stokes sont calculées. Elle possède aussi les fonctions afin de communiquer avec les autres classes du groupe (forces et objets physiques). Cette classe est la plus importante de toutes : elle permet de définir l’espace de travail ainsi que les conditions initiales. De plus, toutes les informations passent par cette classe. CKHkForce permet de créer et de gérer les forces. Les forces donnent un mouvement au fluide. En effet, ici les forces n’agissent pas directement sur les objets mais agissent d’abord sur le fluide. Dans cette classe, on retrouvera les différents types de forces implémentées (3 pour le moment). La classe Physic Object permet de créer les objets qui vont réagir avec notre boite de fluide. C’est aussi ici que l’on utilise la physique mécanique pour simuler les mouvements de ces objets. Cette classe est aussi très importante car c’est dans celle-ci que l’on effectue tous les calculs pour faire bouger, déformer, translater l’objet. Pour l’instant, il n’y a que 2 types d’objets possibles (déplaçable et non déplaçable) mais par la suite une multitude d’objet pourrait être rajouté. La classe Physic Object est typiquement une classe qui serait implémentée par le GameProgramming. En effet, pour chaque jeu, il y aurait de nouveaux objets qui auraient besoin d’utiliser les FluidBox et le GameProgramming serait en charge de développer ces classes. Dans notre cas cette classe a été faite afin de pouvoir illustrer l’utilisation de notre outil. 2 8 Schéma des classes des plug-ins K et Kal FluidBox Maintenant que nous avons vu l’organisation au niveau des classes, nous allons descendre d’un niveau et regarder l’organisation au niveau des fonctions. Tous ces objets sont des Hooks et possèdent donc les fonctions communes à tous les Hooks, à savoir l’enregistrement, l’initialisation, la destruction ainsi que les fonctions permettant de gérer la vie rattachée au Hooks (start, stop et update). K possède aussi un système permettant de sauvegarder l’état d’un objet, c’est à dire de sauvegarder les valeurs des variables de l’objet. Ces fonctions m’ont été très utiles afin de pouvoir réaliser mes diverses démonstrations. Voilà en ce qui concerne les fonctions communes à toutes nos classes. Passons maintenant aux fonctions spécifiques. Tout d’abord, dans la classe FluidBox, on retrouvera toutes les fonctions liées à la résolution des équations de Navier-Stokes. Ces fonctions sont principalement mathématiques et ne sont accessibles que par la classe. Si dans le futur d’autres systèmes avaient besoin de ces fonctions, nous pourrions les intégrer à la classe KMath qui est un annuaire des fonctions mathématiques disponibles dans K. On retrouve aussi dans la classe KMath les fonctions permettant de savoir si un objet est à l’intérieur d’une FluidBox ou si une Force est à l’intérieur d’un FluidBox. Ensuite dans la classe Force, on retrouve les fonctions permettant de créer nos types de forces (3 pour le moment). Cette classe est principalement dédiée à l’interface, puisque c’est l’utilisateur qui va paramétrer la force comme il le souhaite. Les calculs seront faits au niveau de la FluidBox. Et enfin, la classe Physic Object possède des fonctions spécifiques. En effet, à l’intérieur de cette classe, il y a une machine à état qui définit si un objet est dans une boîte de fluide ou non. On retrouve donc dans cette classe les fonctions qui permettent de gérer cette machine à état. On retrouve aussi les fonctions qui nous permettent d’appliquer un mouvement à un objet (translation et rotation).Ces fonctions sont aussi d’ordre mathématique puisqu’elles s’inspirent de la physique, mais nous ne pourrions pas les intégrer dans KMath car elles sont spécifiques au mouvement d’objet à l’intérieur d’un fluide. De plus, elles sont très liées aux paramètres que nous avons choisi d’utiliser pour définir nos objets physiques. Ces paramètres sont la masse, le volume et la porosité13. Ces paramètres sont suffisants pour la modélisation que nous voulons faire mais surtout ils ne demandent pas trop de temps à être configuré par l’utilisateur. En effet, le volume se calcule automatiquement, la masse est quelque chose de concret, il ne reste que la porosité à vraiment régler pour l’utilisateur. On retrouve aussi les fonctions permettant de gérer les collisions entres les différents objets physiques. 13 Capacité d’un objet de laisser passer ou non un fluide 2 9 Bien évidemment toutes ces classes possèdent aussi des fonctions afin de gérer leur IHM14 correspondantes. Nous allons maintenant regarder le fonctionnement et la mise en place par l’utilisateur de ces classes. 5.2.2. IHM et objets implémentés Commençons tout d’abord par une explication du fonctionnement de notre plug-in. Tout d’abord, il faut placer les FluidBox là où nous en avons besoin, par exemple, dans une rue pour simuler le vent ou dans un couloir. Ensuite, il faut positionner les forces là où nous voulons qu’elles agissent. Pour le moment, nous n’avons que 3 types de force (sphérique, linéaire et temporelle) : - sphérique signifie que la force sera émise dans toutes les directions avec la même puissance. - linéaire c’est-à-dire que l’utilisateur choisit une seule direction pour sa force. - temporelle donne la possibilité à l’utilisateur de configurer la direction et la puissance de sa force en fonction du temps. Une fois que l’utilisateur a positionné ses forces, il doit les paramétrer. Enfin, l’utilisateur peut maintenant placer ses objets où il le souhaite. Il ne reste plus qu’à configurer ces objets et lancer la simulation. Bien évidemment, pour réaliser cela le plus simplement possible il faut créer une IHM intuitive pour que l’utilisateur puisse accéder et modifier rapidement les informations qu’il souhaite. En ce qui concerne la FluidBox, elle est représentée par une boîte divisée en voxels. De plus, l’utilisateur peut en modifier la taille, le nombre de division en x,y,z, la densité et la viscosité. Il peut aussi choisir s’il veut un affichage en fil de fer ou plein ou encore pas d’affichage du tout de sa FluidBox. Ensuite pour les Forces, il faut pouvoir choisir le type de la force. En fonction du type de force choisie, l’IHM est différente. Si la force est sphérique, alors l’utilisateur ne pourra modifier que la puissance de cette force. Si elle est linéaire, il pourra choisir une puissance différente en x,y,z et si elle est temporelle, il pourra modifier, via une courbe, la puissance de la force en x,y,z en fonction du temps. De plus, chaque force a la possibilité d’émettre du fluide (remplir la FluidBox). L’outil force est vraiment celui avec lequel l’utilisateur pourra modifier le plus de chose. Cela lui permettra de réaliser des effets à sa guise comme par exemple du vent grâce à la Force de type temporelle. 14 Interface Homme Machine 3 0 Il reste enfin les Physic Objects qui ont comme paramètres leur masse et leur porosité mais aussi la possibilité de les fixer avec un seuil de résistance. Cela signifie que l’objet ne subira pas de translation tant que son seuil de résistance n’est pas dépassé. Cette fonctionnalité est utile pour simuler le mouvement des arbres, par exemple. En ce qui concerne les objets déplaçables, l’utilisateur peut configurer leur vitesse de déplacement. Ceux du personnage sont gérés grâce à des fonctions d’inputs qui peuvent récupérer les actions effectuées par le joueur sur un clavier ou un pad. 3 1 IHM de l’outil force 5.3. Résultats, limites et avenir Rappelons tout d’abord les contraintes qui étaient de réaliser une solution temps réel et de donner un mouvement réaliste à ces objets. La première partie de ces résultats montrera le fonctionnement de la FluidBox sans objet. Puis, nous inclurons des objets et des décors de niveau afin d’étudier le comportement de ces objets. 3 2 Première image de fumée Voici la première simulation de fumée obtenue avec notre système. Ici, la fumée est représentée par les voxels de la FluidBox qui sont colorisés en blanc et dont l’alpha augmente avec la densité du fluide. L’algorithme de calcul des équations de Navier Stokes est en N315 pour un cube. En effet il faut parcourir tous les voxels à chaque itération. Cela nous fait donc un parcours en Nx*Ny*Nz, avec Nx le nombre de division en largeur, Ny le nombre de division en hauteur et Nz en profondeur. On voit donc le problème majeur qui est la discrétisation de la FluidBox. En effet, plus il y aura de voxel, plus les calculs seront long. 15 Définit la complexité de l’algorithme. Ici la complexité est de l’ordre du cube. 3 Simulation de fumée a t=1, t=2, t=4 et t=8 seconde. Les images ci-dessus ont été simulées avec une boîte de fluide de 10*10*10 voxels et tournent avec une vitesse de 27 FPS donc suffisant pour du temps réel. Sur la 4ème image, on voit clairement que le fluide entre en contact avec la boîte et ne peut s’échapper de celle-ci. C’est un choix que j’ai fait pour simplifier les traitements, mais on peut facilement imaginer développer d’autres types de boîte, laissant sortir le fluide ou encore faisant rentrer de l’autre coté, le fluide sorti. Comme dit précédemment, le principal problème vient du temps de calcul des équations de Navier-Stokes qui est en N3. En effet, on parcourt tous les voxels à chaque itération. Or nous pourrions imaginer une version qui calculerait les équations de Navier-Stokes uniquement pour un certain nombre de voxels sujets à un changement. En effet, à chaque itération tous les voxels ne sont pas forcément modifiés. Cette version fait entrer en compte la notion d’octree16. Cette implémentation est aussi plus complexe et nous n’avons pensé à cette solution que trop tard dans le développement et nous n’avons pas pu appliquer de modifications profondes du projet en cours. 16 Un octree est une structure de données de type arbre dans laquelle chaque nœud peut compter jusqu’à huit enfants. 3 Pour finir avec la FluidBox, il faut juste savoir que les équations mises en place permettent de simuler du vent et de la fumée (comme dans l’exemple ci-dessus), mais elles permettent aussi de simuler des liquides tel que de l’eau ou encore du feu. Avec plus de temps, j’aurais aimé essayer de réaliser des simulations de feu et d’eau mais cela n’était pas réellement dans l’idée du stage. Maintenant que nous avons le cœur de notre système qui fonctionne (les FluidBox), nous allons pouvoir intégrer les forces et les objets. En ce qui concerne les forces, le choix a été fait de pouvoir en implémenter 2 au départ (linéaire et temporel) et finalement nous avons intégré une troisième force (sphérique) afin de montrer les multiples possibilités qui peuvent être mise en place. Je ne vais pas ici toutes les énumérer, mais simplement montrer un exemple que nous aurions pu imaginer. Celui-ci consiste en une force qui se déplace sur un axe ou suivant une courbe dessinée par l’utilisateur. On pourrait aussi imaginer le fait de lier une force un objet pour simuler les pas du héros dans le sable par exemple. Nous avons aussi fait le choix de laisser lier les forces et l’émission de fluide. Cela signifie qu’une force peut générer en même temps une vélocité et une densité. Cela nous permet par exemple de représenter directement une créature qui souffle de l’air ou qui crache du feu. Passons maintenant aux objets. Tout d’abord, nous avons limité les objets que l’on peut placer dans le FluidBox à des objets graphiques. Mais cela n’est pas restrictif. Par la suite nous pouvons très simplement ajouter d’autres éléments en tant qu’objets pouvant interagir avec une FluidBox. Je pense tout particulièrement aux outils Fx et à l’outil ParticleFx qui pourrait par exemple simuler les mouvements d’une flamme dans l’air ou encore la direction de la pluie lorsqu’il y a du vent. Mais le principal objet est bien évidemment l’objet graphique. Nous avons créé donc 2 types d’objets (déplaçables ou non) et nous avons configuré ces objets pour qu’ils réagissent aux mouvements du fluide lorsqu’ils sont en contact avec celui-ci. Ainsi les arbres oscillent sous le vent, le personnage a du mal à avancer en cas de vent très fort ou encore les caisses se déplacent sous la force du vent. Ces mouvements se doivent d’être le plus réaliste possible, mais il faut toujours respecter la contrainte du temps réel. Il a donc fallu adapter les formules de la physique, d’une part, pour les problèmes cités précédemment mais aussi pour une question de performance. En effet, le but est de pouvoir gérer de multiples objets sans baisse de FPS sachant qu’il y a un coût minimum afin de détecter si l’objet est dans la FluidBox ou non et le volume qu’il occupe. 3 4 Image provenant de la démonstration finale Sur cette image, il y a 11 objets graphiques (les arbres, les caisses ainsi qu’Astérix), 3 forces, (1linéaire et 2 sphériques) et la boîte de fluide a une discrétisation de 40*3*15 ce qui fait 1800 voxels. Il y a, de plus, tout un décor de niveau chargé. La simulation fonctionne avec environ 11 FPS. Cependant, la même scène avec une FluidBox de seulement 10*1*5 fonctionne a 36 FPS. Cela nous prouve que le nombre d’objets n’est pas la donnée la plus coûteuse en temps de calcul. Mais, pour le moment, afin d’avoir un mouvement plus réaliste, il est conseillé d’augmenter la discrétisation de la FluidBox. Cependant, avec un peu plus de temps, il y a possibilité de modifier encore les fonctions de déplacement et de rotation de l’objet afin de l’affiner malgré une moindre discrétisation. Toutes ces images et ces simulations ont été réalisées sur un pc portable équipé d’un Pentium 4 de 3GHz avec 1Go de RAM et une carte graphique ATI Mobility M10. Nous allons maintenant passer au bilan et à la conclusion. 3 5 6. Bilan 6.1. Technique D’un point de vue technique, je n’aurais pas pu espérer mieux au niveau du contenu de ce stage. En effet, j’ai vraiment appris de nombreuses choses que ce soit au niveau de la programmation ou en physique qu’au niveau des environnements de travail (découverte de Visual C++). C’est la première fois que j‘approchai un moteur de jeux vidéo et cela est intéressant, j’ai pu observer de nombreuses fonctionnalités à défaut de pouvoir toutes les utiliser. Il y a tellement d’outils déjà implémentés à l’intérieur d’un moteur qu’il est parfois difficile de savoir si ce que l’on est en train de faire n’existe pas déjà quelque part dans le moteur. Le fait de travailler aussi directement avec un logiciel tel que Kal aide grandement la tâche, les fonctions que l’on crée sont directement accessibles et ce que l’on code est directement configurable en temps réel. La découverte de K et de Kal a vraiment été quelque chose d’intéressant et d’instructif pour moi. Quant à la phase de recherche, elle m’a apporté de nombreuses connaissances sur le milieu de la physique mais aussi de la simulation que ce soit de la pluie, du vent, la déformation de tissu, toutes ces techniques sont vraiment très intéressantes et il y a de très nombreux articles traitant de ces sujets. La phase de recherche n’a pas été un point négatif, bien au contraire. Le fait de pouvoir lire et même utiliser des travaux de grosses équipes de recherche comme celles d’ATI, Nvidia, Microsoft ou encore Maya a vraiment été très bénéfique. L’utilisation de Visual C++ a été un peu difficile au début mais une fois les fonctions utiles et basiques maîtrisées il s’avère être un puissant outil de développement avec de nombreuses fonctions de débogages qui m’ont bien aidé au cours du développement. L’apprentissage de Kal a aussi été un peu compliqué au début. Ce logiciel a tellement de possibilités qu’il est difficile de les maîtriser toutes. D’ailleurs, chaque membre de l’entreprise maîtrise plus ou moins bien certains outils de Kal, mais ils ne maîtrisent pas tous le logiciel entièrement. Aujourd’hui, encore, il a certains outils dans Kal que je n’ai jamais utilisé et dont le fonctionnement m’est complètement inconnu. Et même si le développement a parfois été difficile, voir casse tête, je pense notamment au réglage des translations et des rotations pour les objets. Les apports techniques de ce stage ne peuvent être que mis en avant et rien que pour cela, je ne remercierais jamais assez, Etranges Libellules de m’avoir offert ce stage. 3 6 6.2. Humain Le bilan humain, quant à lui, est plus mitigé. Même si le stage est en R&D, je m’imaginais rejoindre une équipe et travailler sur ce projet avec l’aide d’autres personnes. Mais en réalité la philosophie des stages en programmation chez Etranges Libellules est bien différente. En effet, j’ai été le seul maître à bord, c’est-à-dire, que j’ai mené le projet du début à la fin. Cela n’est pas un mal au contraire mais ça apporte finalement plus d’inconvénients que d’avantages. En effet, je n’ai pas réellement découvert l’entreprise puisque je n’ai travaillé avec aucune équipe en particulier et que mes réalisations ne visent en aucun cas une production. De plus, même à l’intérieur de l’équipe R&D moteur, je ne sais pas comment ils travaillent ni même sur quoi ils travaillent. Mise à part le fait de ne pas se sentir intégrer à l’entreprise, la condition de stagiaire est clairement définie. Nous n’appartenons à aucune équipe, ni à aucune production, les journées sont donc parfois longues sans avoir la possibilité de parler de ce que l’on fait. Je ne blâme pas mon tuteur de stage, qui au contraire m’a aidé à chaque fois que j’en avais besoin et m’a écouté à chaque fois. Je suis plus déçu de la vision que porte l’entreprise sur le stagiaire. Le stage se termine donc sans que je n’ai fait aucune rencontre ni même pris contact avec quelqu’un dans l’entreprise. Je viens de passer 3 mois à l’intérieur d’une entreprise que je connais moins que les anciennes où j’ai passé moins de temps. Je comprends aussi qu’il y ait une politique de confidentialité et de production qui empêche les diverses équipes de donner plus de temps au stagiaire mais je pense que c’est dommage de perdre une part si importante du stage qui est la rencontre entre un étudiant et une entreprise. 3 7 Conclusion Ce stage m’a permis de m’immerger intégralement dans le milieu du jeu vidéo et celui de la R&D. En effet, les étapes de recherche et de développement sont les majeures parties de mon stage. Cela n’a pas été facile tous les jours, que ce soit lors des phases de recherche où l’on ne trouve pas de pistes intéressantes et où l’on remet en question notre idée de départ ou pendant les phases de développement où l’on reste coincé lors d’une étape critique sans trouver la solution. Mais ces difficultés ne m’ont pas découragé et finalement à la fin du stage, j’ai un système plus complet que ce que nous imaginions au départ. Pour ma part je suis très content d’avoir découvert le milieu de la R&D en entreprise, cela m’a donné une autre vision que celle que j’avais eue lors des projets tutorés (Projet Eyestracking). Le domaine du jeu vidéo lui aussi a été très intéressant avec la découverte du moteur K et du logiciel Kal mais il est vrai que maintenant j’aimerais aussi découvrir les différents outils utilisés dans le milieu du cinéma d’animation. En effet lors de mes recherches, j’ai découvert que beaucoup des papiers que je lisais traitaient d’applications liées au domaine du cinéma d’animation qui n’a pas les mêmes contraintes que le jeu vidéo. Dans le cinéma d’animation, on cherche le réalisme avant le temps réel. Malgré le bémol du bilan humain, je suis très content d’avoir fait ce stage, il va me permettre d’ajouter de réelles compétences à mon CV et m’a aussi permis de pouvoir orienter mon projet professionnel et ma future recherche de stage pour la troisième année. 3 8 Bibliographie [1]. Hans Petter Langtangen – « The Diffpack Implementation of a Navier-Stokes Solver Based on the Penalty Function Method » - The Diffpack v1.4 Report Series -1996. [2]. F. Bridault, C. Renaud, F. Rousselle – « Vers un modèle de flamme temps-réel » - Laboratoire d’Informatique du Littoral / Université du Littoral Côte d’Opale – 2003. [3]. Jos Stam – « Real-Time Fluid Dynamics for Games » - Alias | wavefront – 2003. [4]. Michael Ash – « Simulation et visualisation d’un fluide 3D » - LIFO – 2005. [5]. Olivier Génevaux Arash Habibi Jean-Michel Dischler – « Simulating Fluid-Solid Interaction » - 2003. [6]. Nick Foster Ronald Fedkiw – « Practical Animation of Liquids » - 2001. [7]. Robert Bongart – « Efficient Simulation of Fluid Dynamics in a 3D Game Engine » - Master of Science Thesis – 2007. [8]. Frank Losasso Frédéric Gibou Ron Fedkiw – « Simulating Water and Smoke with an Octree Data Structure » - 2004. [9]. Centre de documentation de l’institut géographique national – « L’espace urbain en 3D : Reconstruction et modèles » - 2007. [10]. Project-Team EVASION – « Virtual environments for animation and image synthesis of natural objects » - INRIA – 2006. [11]. Fabrice NEYRET – « Créer, Simuler, Explorer des Univers Naturels sur Ordinateur » - Journées de l’Association Francophone d’Informatique Graphique - 2006. [12]. Changbo Wang, Qunsheng Peng – « Realistic simulation of nature scene » - 2004. [13]. Natalya Tatarchuk – « Real-Time rain rendering in city environnements » - Eurographics Workshop on natural phenomena – 2006. [14]. Huamin Wang Peter J. Mucha Greg Turk – « Water Drops on Surfaces » - 2005. [15]. Paul Richmond – « Real Time Droplet Animation on a Glass Pane » - 2005. [16]. A. Kolb L. Latta.C. Rezk-Salama – « Hardware-based Simulation and Collision Detection for Large Particle Systems » - Graphics Hardware – 2004. [17]. Pierre Rousseau Vincent Jolivet Djamchid Ghazanfarpour – « Rendu réaliste de pluie en temps-réel » - Journées de l’association Francophone d’Informatique Graphique – 2006. [18]. Lifeng Wang Zhouchen Lin Tian Fang Xu Yang Xuan Yu Sing Bing Kang – « Real-Time Rendering of Realistic Rain » - Microsoft Research – 2006. [19]. Kshitiz Garg Shree K. Nayar – « Photorealistic Rendering of Rain Streaks » - 2006. [20]. JIM X. CHEN XIAODONG FU EDWARD J. WEGMAN – « Real-Time Simulation of Dust Behavior Generated by a Fast Traveling Vehicle » - ACM Transactions on Modeling and Computer Simulation, Vol. 9, No. 2, - 1999. [21]. Changbo Wang Zhangye Wang, Qi Zhou Chengfang Song Yu Guan Qunsheng Peng – « Dynamic Modeling and Rendering of Grass Wagging in Wind » - 2005. [22]. Frank Perbet Marie-Paule Cani – « Animating Prairies in Real-Time » - 2000. 3 9 [23]. Ying-Qing XU Chiyi CHENG Jiaoying SHI Heung-Yeung SHUM – « Physically Based Real-time Animation of Curtains » - Microsoft Research – 2000. [24]. Rafael Montenegro Gustavo Montero, José Maria Escobar Eduardo Rodriguez José Maria Gonzalez-Yuste – « An Efficient Package for 3-D Wind Simulation » - 2002. [25]. Criss Martin Ian Parberry – « Real Time Dynamic Wind Calculation for a Pressure Driven Wind System » - 2006. [26]. M. Keckeisen S. Kimmerle B. Thomaszewski M. Wacker – « Modelling Effects of Wind Fields in Cloth Animations » - 2004. [27]. Thomas Di Giacomo Stéphane Capo François Faure – « An interactive forest » 2001. [28]. Crytek – « CryEngine2 Feature » - 2007. [29]. Stephen Chenney – « Flow Tiles » - Eurographics/ACM SIGGRAPH Symposium on Computer Animation - 2004. [30]. Fabrice Fries – « Propositions pour développer l’industrie du jeu vidéo en France » - Rapport Ministériel – 2003. 4 0 Annexes I. Chaîne de Production II. Image de la Démo ATI ToyShop III. Simulation avec une force temporelle IV. Evolution de la FluidBox au cours du développement 4 1 I. Chaîne de Production 4 2 II. Image de la Démo ATI ToyShop 4 3 III. Simulation avec une force temporelle 4 4 IV. Evolution de la FluidBox au cours du développement 4 5