I. Introduction - Children of the Sun

Transcription

I. Introduction - Children of the Sun
CHILDREN OF THE SUN
The Mysterious Cities of Gold
CONTROL THE SUN
Game Design Technique
DESS JVMI - 2004
1
Table des matières
I. Introduction
II.
Aspects techniques à implémenter
III.
Contraintes de la plateforme choisie
IV. Le Capteur solaire
Spécification technique
Introduction
Réalisation du capteur
Architecture du capteur
V.
Outils choisis pour la maquette
1.
Outils de développement
2.
Outils de modélisation et création graphique
VI. L’architecture logicielle
1.
Choix du langage de développement : C ou C++ ?
2.
Organisation des différentes couches logicielles
3.
Boucle de jeu
4.
Clarté du code et conventions
VII.
Le moteur de jeu
1.
Rendu 3D
2.
Les caméras
3.
Configuration
4.
Effets spéciaux
5.
Intelligence Artificielle
6.
Moteur de son
7.
Gestion événementielle
8.
Gestion des animations
9.
Gestion des éléments d’interface
10. Gestion de la physique
11. Gestion des entrées utilisateur et gameplay
ANNEXE 1
Définition de la température de couleur
Théorie de mesure de température de couleur
DESS JVMI - 2004
-3-3-4-6-6-6-7-7-8-8-9- 10 - 10 - 10 - 11 - 11 - 12 - 12 - 12 - 13 - 13 - 17 - 22 - 24 - 24 - 25 - 25 - 28 - 30 - 31 - 33 -
2
I.
Introduction
Jeu d’aventure monojoueur prévu pour la PSP (Playstation Portable) de Sony
utilisant la licence des Mystérieuses Cités d’or.
Périphérique capteur solaire.
Le rôle du game design technique est de répondre à toutes les questions d’ordre
technique lors du développement du jeu. Ces solutions proviennent du travail de
réflexion effectué lors de la phase de pré production du projet.
II. Aspects techniques à implémenter
D’après les spécifications du Game Design, le jeu devra comporter les aspects
techniques suivant :
-
Rendu 3D de haute qualité adapté à un écran de portable
Support d’un capteur solaire
Rendu de textures optimisé
Support d’animation
Support d’un gamepad avec stick analogique
Gestion des collisions
Gestion des musiques évènementielles et des effets sonores 3D
Gestion de plusieurs types de caméras (phases extérieur/intérieur et vol en
Condor)
Gestion de 2 types de gameplay (Esteban et le Condor)
Gestion de monde semi-ouvert
IA de coopération avec le joueur pour les personnages Tao et Zia (système de
formation)
IA de différents niveaux pour les ennemis
Scriptage de comportement pour certains PNJ (Mendoza, Sancho et Pedro…)
Support d’un certain nombre d’effets spéciaux (éclairages, particules, eau, etc.)
Chargement de certaines variables à partir de fichiers pour faciliter le réglage du
gameplay et le débogage
DESS JVMI - 2004
3
III. Contraintes de la plateforme choisie
Caractéristiques de la PSP :
Voici les caractéristiques de la PlayStation Portable telles que l’on peut les
trouver à l’heure actuelle sur les documents officiels de Sony.
Caractéristiques générales :
- Dual CPU
- Advance 3D Graphics Engine
- AVC Decoder
- Universal Media Disc (1.8 GB)
- 16:9 Wide screen TFT LCD
o Equipped with backlighting
-
o 480x272 screen resolution
o High resolution for portable
Embedded Wireless LAN
Memory Stick Pro
Caractéristiques du CPU:
-
Caractéristiques graphiques:
-
De plus la PSP
•
•
•
•
•
•
MIPS R4000 32 bit core
333 MHz
Main Memory 32 MB (eDRAM)
Bus Bandwidth: 2.6 GB/sec
I-Cache, D-Cache
FPU, VFPU (Vector Unit): @2.6
GFlops
256bit Bus, 166 MHz
VRAM: 2 MB (eDRAM)
Bus Bandwidth: 5.3 GB/sec
Pixel Fill Rate: 664 M pixels/sec
Maximum 33 M polys/sec (T & L)
24 bit Full Color : RGBA
offre les fonctions suivantes en hardware :
Transform and lighting
Clipping
Skinning
Morphing
Surface Tessellation
Rendu en polygones et patches Bezier et B-Spline
Périphériques d’entrée/sortie :
-
support du Memory Stick pro (capacité de stockage > 1 GB)
USB 2.0 (très rapide, jusqu’à 480 Mbps), rétrocompatibilité avec USB 1.1
DESS JVMI - 2004
4
Touches d’interface utilisateur :
Flips L et R
Pad analogique
Start/Select
Boutons de contrôle
Ces touches sont similaires à celles de la Playstation et Playstation 2 excepté
l’absence des touches L2 et R2.
La PSP étant à l’heure actuelle une console en prévision et certains des
aspects techniques n’étant pas encore confirmés, il nous a fallu travailler en
nous basant sur des hypothèses, principalement en ce qui concerne la taille
de la mémoire, le langage de développement et la possibilité d’utiliser un
middleware.
Après lecture des caractéristiques techniques de la future portable sur les
documents officiels de Sony, la PSP serait a peu de choses près une PS2 à
laquelle seraient ajoutées des contraintes au niveau de l’écran.
En effet, celui-ci est de dimension et de résolution réduite (480x272 pixels) et
en 16/9. Le rendu devra donc utiliser au mieux cette taille d’affichage.
Par ailleurs, tout comme la PS2, la PSP disposera d’une mémoire vidéo très
limitée de seulement 2 Mo (sources de Mai 2004). Ceci limitera de beaucoup
la quantité et la qualité des textures affichables à l’écran (2 Mo de textures
affichables par frame calculée).
Cette contrainte va nécessiter de notre part de surveiller constamment
l’utilisation de la mémoire vidéo et de trouver des optimisations et des
astuces pour utiliser cette caractéristique au mieux (petites textures,
déchargement de la mémoire des textures non rendues …).
En revanche, la taille de l’écran et la résolution pourront jouer à notre
avantage : l’utilisateur fera forcément moins attention au détails des textures
que sur un téléviseur.
DESS JVMI - 2004
5
De plus la PSP sera capable d’afficher un très grand nombre de facettes à la
fois (33 millions/frame théoriques).
Des modèles plus détaillés pourront donc compenser dans une certaine
mesure la faiblesse des textures.
Toutefois il est préférable de prendre ces chiffres avec distance, car même si
la PSP pourra gérer beaucoup de polygones rien ne dit qu’elle pourra le faire
en gardant un taux de rafraîchissement décent.
Nous nous baserons donc principalement sur les capacités de rendu de la
PS2.
IV. Le Capteur solaire
Spécification technique
Plage de Température
Plage de valeur en température
Plage de valeur en intensité
Tension d’alimentation
Interface avec console
Prix Unitaire
Quantité de fabrication minimale
1000 - 10000 °C
8 bits Linéaire
8 bits Linéaire
5 Volts ?
(dépend de l’interface)
USB 2/Autres?
5 Euros HT
50 000 unités
Introduction
Etudier les contraintes d’un tel capteur est primordial pour des raisons de
réalisme.
Un capteur de température de couleur est plus complexe qu’un capteur
photosensible.
De par sa spécificité, la mesure de la température de couleur dans des conditions
industrielles et commerciales valables, nous obligent à nous orienter sur une
approximation de cette température au travers d’une photodiode (capteur
d’intensité lumineuse).
NB : Il ne faut pas confondre l’intensité lumineuse et la température de couleur,
qui sont deux phénomènes certes dépendants mais dont la nature est différente.
Ce qu’il est important de retenir, c’est la notion d’une bi-mesure du capteur :
- une intensité lumineuse dans un spectre visuel en Ampère (A)
- une approximation de la température de couleur en Degrés Celsius (°C)
La réutilisabilité de ce capteur est évidente. L’application plausible est la
météorologie (affectations de la luminosité directement dans un jeu,
synchronisation du temps (nuageux, ensoleillé) entre le jeu et la vie réelle, …).
DESS JVMI - 2004
6
Réalisation du capteur
Pour des raisons d’étalonnage du capteur et pour des raisons industrielles, ils ne
serait pas raisonnable de penser que le capteur ne puisse fournir qu’une lecture
approximative de l’intensité lumineuse.
Rien n’interdit plusieurs industriels de fabriquer ce capteur.
Ce qui voudrait dire des composants, des filtres photo différents et donc des
capteurs différents.
On rencontre cette problématique avec les joysticks analogiques pour PC (a
chaque fois que vous branchez un de ces joysticks, l’étalonnage est obligatoire).
Sur Playstation la partie analogique du Pad est directement étalonnée sur le
joystick lui-même, de manière industrielle.
C’est donc vers cette voie qu’il faut orienter notre capteur.
Architecture du capteur
Le système est composé d’une partie analogique
qui correspond à la transformation du signal
lumineux en un signal utilisable.
D’une partie numérique, composée essentiellement
d’un microcontrôleur équipé d’un convertisseur
analogique/numérique, de mémoire morte et
volatile, d’une unité de calcul et d’adressage et
d’interfaces sériel ou parallèle.
Un composant fera aussi l’interface entre la
Playstation et le capteur.
Une partie pouvant être prise en compte par le
microcontrôleur.
Le microcontrôleur
effectuer comme :
-
DESS JVMI - 2004
aura
plusieurs
tâches
à
La gestion de l’énergie
La conversion du signal analogique
Le calcul de la température
La restitution des informations de température de couleur
et d’intensité lumineuse
Le paramétrage à la volée via l’interface avec la
Playstation comme : le temps de mesure, la fréquence
des mesures.
7
V.
Outils choisis pour la maquette
1. Outils de développement
La question des outils de développement à utiliser pour la maquette est
relativement délicate.
Pour le moment nous n’avons que très peu d’informations sur les API qui
seront disponibles pour le développement sur PSP, même si l’extrait de code
source fourni par Sony fait penser à de l’OpenGL.
Par ailleurs la maquette a un rôle de support du projet et doit donner un
aperçu du gameplay, de l’aspect et du déroulement du jeu.
N’étant pas la version finale du jeu, elle peut donc être développée en
utilisant des outils différents, à condition de prendre en compte les
contraintes de la console.
Compte tenu du temps de développement qui est disponible et de la relative
ambition du projet, le meilleur choix nous a semblé être l’utilisation d’un
middleware plutôt que des API de plus bas niveau comme DirectX ou OpenGL.
L’utilisation de middleware est de plus en plus répandue depuis quelques
années permettant aux studios de développement de gagner un temps
certain sur la création d’outils pour le jeu (gestion de caméra, entrées
utilisateur, collisions, effet spéciaux, …).
A l’heure actuelle, des middlewares sont prévus pour la PSP, dont la
plateforme RenderWare de Criterion Software.
Nous avons eu connaissance de l’existence des middlewares suivant :
- Virtools
- NetImmerse
- RenderWare Graphics
- RenderWare Studio
Virtools possède des fonctionnalités intéressantes et permet d’obtenir des
résultats visibles assez rapidement. En revanche, ce middleware s’avère
plutôt rigide et peu pratique si l’on veut programmer et intégrer ses propres
outils. De plus il convient assez peu au développement sur PSP, notamment
pour certains aspects de Gameplay du projet (Système de formation,
coopération entre PNJ).
Nous avons entendu parler de NetImmerse par notre tuteur. Celui-ci paraît
intéressant, mais il ne nous est pas mis à disposition par la formation et il
nous sera donc difficile de travailler efficacement avec.
Notre choix s’est finalement arrêté sur RenderWare Graphics.
Ce Middleware est suffisamment souple pour nous offrir une grande liberté de
programmer nos propres structures logicielles.
DESS JVMI - 2004
8
Les outils et les plug-ins qu’il propose sont très intéressant (caméras,
particules, rendu cel-shading, gestion des entrées utilisateurs…) pour le
résultat que nous visons.
Enfin, il est tout à fait adapté au développement sur la PSP puisqu’une version
de RenderWare pour PSP est prévue d’ici quelques mois.
En revanche, nous n’avons pas l’intention d’utiliser l’éditeur de RenderWare
Studio. Après étude de son mode de fonctionnement et de ses capacités, nous
pensons que cet éditeur n’est pas suffisamment adapté à ce type de jeu.
Bien sûr il est possible de modifier les structures existantes et d’en créer de
nouvelles, mais ce travail risque d’être fastidieux et de ne pas nous faire
gagner beaucoup de temps au final.
Enfin, en raison de contraintes budgétaires, il est préférable de se restreindre
aux composants essentiels.
De même, il n’est pas prévu d’utiliser les autres composants disponibles de
RenderWare, comme RenderWare Physics ou IA.
2. Outils de modélisation et création graphique
-
3D Studio Max 6.0 pour modéliser et éditer les niveaux
Photoshop 7 pour créer les textures
Flash MX pour les interfaces
Exporteur 3DS Max vers RenderWare
Plug-ins …
DESS JVMI - 2004
9
VI. L’architecture logicielle
1. Choix du langage de développement : C ou C++ ?
Si l’on se réfère à la PS2, le C serait plus adapté au développement.
Bien que l’architecture de la PSP s’annonce proche de la PS2, il est difficile de
trancher à l’heure actuelle.
Le C++ permet une implémentation plus propre, une meilleure lisibilité, et de
bénéficier d’un système de hiérarchies (polymorphisme, classes héritées …) et
donc faciliter le développement.
En effet, une vision objet de l’architecture est généralement bien adaptée au
développement de jeux vidéo.
Le C++, qui a été adopté pour le développement de la maquette pour des
questions d’efficacité, sera probablement conservé pour le projet final.
Un passage du C++ au C sera éventuellement possible pour certaines
structures si le programme nécessite d’être optimisé.
2. Organisation des différentes couches logicielles
Première décomposition en packages d’objets pour chaque partie du moteur
de jeu :
- rendu graphique (effets visuels, optimisations, objets du jeu)
- gestion de la physique
- IA et comportements
- rendu sonore (buitages, musiques)
- gestion des entrées (manette, interface capteur solaire)
DESS JVMI - 2004
10
3. Boucle de jeu
Les différentes étapes importantes du déroulement du jeu seront effectuées
dans un ordre bien précis au sein de la boucle de jeu ou « Main Loop ». Voici
une représentation simplifiée de cette boucle :
While( end != 0 )
{
ReadInputs(…) ;
//lecture
des
entrées
(touches
pressées,
messages
envoyés)
ProcessInputs(…) ;
//traitement des entrées
ProcessSounds(…) ;
//traitement des effets sonores
UpdateGameScene(…) ;
//mise à jour de la scène du jeu
//animations, transformations 3D, affichages…
CheckState(…) ; //vérification de l’état du jeu en fin de cycle. Détermine
si la boucle
//continue, le game over, le passage au niveau
suivant, etc.
}
4. Clarté du code et conventions
-
Charte de programmation : quelques règles simples de syntaxe, inspirées
de la notation hongroise, pour faciliter le partage du travail entre
programmeurs et autres membres du groupe.
o Casse différenciée pour les variables :
§ Tout en minuscules pour les variables locales et temporaires.
§ Tout en majuscule pour les « defines » et champs d’un
« enum » (les valeurs constantes en général).
Ex : #define GRAVITY 9.81
§ Majuscule pour la première lettre d’un nom contenu dans le
champ d’une classe.
Ex : RwReal RotationSpeed ;
RwBool Alive ;
§ Paramètres des fonctions en minuscule pour ne pas apporter
de confusion avec les champs d’une classe.
Préfixe « MCoG » pour chaque nom de classe créée pour le projet
pour les différencier des classes préexistantes dans RenderWare ou
autre bibliothèque utilisée
Ex : MCoG3DActor ;
MCoGCharacter ;
o Eventuellement on pourra utiliser un préfixe pour indiquer le type
d’une variable :
§ i pour int
§ f pour float
§ b pour bool
§ etc.
Cependant RenderWare utilise ses propres noms de type et ceci
pourrait amener une certaine confusion. A utiliser avec précaution.
Nom de variables très explicite. Afin que l’on sache sans ambiguïté à quoi
sert une variable.
Ex : éviter les variables du type « int tmp1, tmp2, tmp3 ; »
o
-
DESS JVMI - 2004
11
-
Code commenté (en anglais autant que possible)
Utilisation d’indentation et de retour à la ligne autant que possible pour un
code aéré et donc une meilleure lisibilité.
VII.Le moteur de jeu
1. Rendu 3D
Utilisation des fonctions de rendu de Renderware Graphics et de plug-ins pour
obtenir les effets spéciaux voulus.
Le jeu utilisera les techniques d’optimisation de rendu suivantes:
-
LOD (Level Of Detail) pour optimiser la résolution du maillage des objets
3D à afficher. Le moteur choisira et affichera parmi plusieurs niveaux de
détail, le modèle ayant la résolution qui correspond à la distance
d’affichage.
-
BSP Tree et Octree pour optimiser les faces à afficher et les tests de
collision.
-
Mip Mapping pour afficher des textures de résolution différente en fonction
de leur distance. Ceci permet d’optimiser le volume de texture affichable à
la frame. La taille des textures devra être adaptée à la capacité mémoire
de la PSP.
2. Les caméras
2 types de caméra différents :
•
•
Vue exploration : inspiration de Zelda Windwaker et Ocarina of Time sur Nintendo GameCube. Le
point de vue de la caméra suit les déplacements du héro.
La caméra reste à une position relative fixe du héro tout en prenant en compte le décor pour les
collisions (une réduction de la distance au héros se produit alors)
Vue Condor : vue arrière+plongée pour une bonne visibilité du paysage. Le point de visée de la
caméra est basé sur la position du Condor et non son orientation. La position de la caméra est un
point relatif au condor fixe.
Calcul du suivi de caméra :
Les éléments de suivi de la camera sont :
Son angle de rotation sur l’axe Y
La distance entre la caméra et la cible
La hauteur entre la caméra et la cible
DESS JVMI - 2004
12
L’ajout d’une vitesse de déplacement rajoute un effet smoother du
mouvement.
Chacun de ces paramètres possède une vitesse de déplacement, une valeur
max et min et la valeur désirée.
L’idée est de se rapprocher de la valeur désirée à la vitesse paramétrée.
3. Configuration
Pour des raisons de réglages et de test, de nombreuses valeurs de
configuration sont nécessaires. C’est pourquoi, un système de configuration
indépendant gère cette problématique.
Le choix du type de fichier s’est porté sur XML. Ce format de fichier reste
lisible et facile à modifier. La conception de type hiérarchique des données
relatives à l’ensemble du jeu, nous conforte dans ce choix.
Nous utilisons un parser de type DOM pour des raisons de facilité
d’intégration.
A chaque donnée particulière, comme par exemple les informations de
caméra, correspond une classe particulière.
Mais le traitement en lui-même (gestion des erreurs, parsing , …) est défini
dans la class Mère XMLDOMParser.
4. Effets spéciaux
De nombreux effets principalement relatifs à la perception du soleil sont
nécessaires (ombres, lumières colorées, rayons de lumière, lens flare,
simulation d’effet comme coucher/lever de soleil, éblouissements, …)
Certains effets comme la simulation d’eau lors de passages en bateau ou près
de temples immergés pourront être développés.
Leur degré de réalisme dépendra des interactions avec les milieux aquatiques.
DESS JVMI - 2004
13
Des effets pour les milieux aériens lors des vols en condor sont nécessaires,
comme des nuages, de la brume, du vent, impression de vitesse …
En voici une liste non exhaustive :
-
Effet de lens flare 2D.
Environment mapping
Bump Mapping
Lightmaps.
Vertex Color
Projection d’ombres en temps réel.
Skybox ou Warp.
Eblouissements
Billboards ou RotShapes
Lens flare :
Bien que cet effet ne soit pas « naturel », il est très répandu dans les jeux vidéo
et donne une très bonne impression d’illumination.
Il permet de repérer la position du soleil.
Son fonctionnement est plutôt simple, on lance un rayon qui va de la caméra
vers la source lumineuse choisie (le soleil ici), et le long de ce rayon on dispose
une série de textures en transparence additive, dont la taille d’origine est
modifiée en fonction de leur distance (plus petites vers le centre et plus grandes
vers l’extérieur).
DESS JVMI - 2004
14
Lens flare dans le jeu
Environment mapping, Bump mapping, Lightmaps et Vertex Color:
RenderWare Graphics permet d’utiliser de façon simple des effets de rendu sur
les surfaces.
L’environment mapping simule la brillance et les reflets dorés pour le Condor
par exemple, et le Bump Mapping sert à accentuer les effets de relief.
Ces deux effets doivent être spécifiés dans le « material » utilisé dans 3DSMax,
puis activé à l’aide du plug-in RpMatFX dans le code RenderWare, qui les gère
automatiquement.
Les textures de Lightmaps sont des projections d’ombres de façon précalculée
sur le décor. Ces textures sont générées dans 3DSMax et activées avec le plug-in
RpLtMap. Ce type de texture est à utiliser avec retenue, si l’on considère les
capacités limitées en mémoire vidéo de la PSP. C’est pourquoi dans certains cas
on lui préfèrera l’utilisation de Vertex Color, moins impressionnant
graphiquement mais beaucoup moins gourmand.
Ombres décor avec les Lightmaps
DESS JVMI - 2004
15
Le Vertex Color est une donnée définie sous 3DSMAX. Il s’agit d’une couleur
assignée aux points d’un modèle 3D. Cette couleur pourra soit être affichée telle
qu’elle, en addition de la couleur de la texture, soit en modulation avec les
valeurs d’éclairage de la scène.
Ce système permettra d’optimiser grandement la mémoire vidéo, car on pourra
réutiliser plusieurs fois les mêmes textures tout en variant leur rendu grâce à
différentes valeurs de Vertex Color. Ainsi, une texture de mur pourra être
aisément altérée en y ajoutant du vert pour d’obtenir un effet de mousse ou de
lichen.
Ombres en temps réel :
Cet effet permettra de calculer l’ombre des objets dynamiques (qui proviennent
de fichiers « dff ») et de les projeter sur les parties du décor statique (qui
provient d’un fichier « bsp »).
A chaque objet « dff », sera attaché une structure ShadowManager qui
recalculera et affichera à chaque frame la texture d’ombre de l’objet.
Son fonctionnement simplifié est le suivant :
- le ShadowManager va créer une texture en mémoire selon la résolution
demandée
- il va ensuite créer une caméra virtuelle avec une scène vide qui contient
une copie de la lumière directionnelle du monde original, et dans laquelle
sera rendu l’objet.
- Cette image sera une empreinte blanc sur noir de l’objet, que le
ShadowManager va ensuite inverser pour obtenir une image noire de
l’objet.
- Enfin, cette texture sera plaquée sur le décor, en n’affichant que la partie
noire de la texture.
Ce système de texture en mémoire (raster), permet d’effectuer des traitements
supplémentaires sur l’ombre, comme de l’anti-aliasing, du flou ou encore un
dégradé d’intensité.
Ombres temps-réel des personnages
DESS JVMI - 2004
16
Skybox :
Pour simuler la zone du ciel, nous allons créer autour du niveau une skybox (ou
warp). Selon les cas il s’agira d’un cube, d’une sphère ou d’une demi sphère sur
lequel est plaqué une texture de ciel et auquel on peut appliquer divers effets,
comme des couches de textures pour simuler les nuages, de l’animation ou du
déplacement de texture en modifiant leurs coordonnées UV.
Eblouissements :
De façon similaire à l’effet de lens flare, il est possible de créer des effets
d’éblouissements liés à des sources lumineuses.
On pourra afficher une texture en transparence dont la taille dépend de
l’alignement avec le vecteur de la caméra.
Plus la caméra sera centrée sur la lumière, plus la texture sera agrandie, jusqu’à
prendre tout l’espace si l’on se trouve exactement dans son alignement.
5. Intelligence Artificielle
Les comportements peuvent se partager en 3 catégories d’IA :
-
« IA amie »
Personnages de Tao et Zia. Relative autonomie mais réaction aux ordres
du joueur.
-
« IA ennemie »
Celle-ci concerne les Olmèques, les conquistadors, les animaux ainsi que
des personnages importants comme Gomez ou Gaspard (que l’on peut
considérer comme des ennemis-clef). Il est donc nécessaire d’implémenter
plusieurs niveaux d’intelligence.
-
Comportements scénarisés
Rencontres scénarisées avec certains personnages clés dont le
comportement sera prévu à l’avance (Mendoza, Pedro, Sancho, Incas,
villageois…). L’utilisation d’un langage de script est envisageable.
Ces
différents
aspects
d’intelligence
artificielle
l’implémentation des fonctionnalités suivantes :
• IA asynchrone
• Recherche de chemin
• Logique floue
• Système multi agent
peuvent
nécessiter
a. IA asynchrone – Time Slicing
Afin d’alléger le moteur de jeu des calculs d’IA qui peuvent s’avérer relativement
lourds (parcours de graphes, récursivité, …), il est préférable d’adopter un
système asynchrone. Cela signifie que les calculs destinés à l’IA ne seront pas
DESS JVMI - 2004
17
effectués à chaque frame, mais de façon légèrement décalée par rapport au
calcul de l’affichage.
Généralement, une boucle d’IA par seconde donne des résultats satisfaisants. On
pourra donc implémenter un système de chronométrage (timer) qui lancera le
calcul de l’IA à un intervalle régulier.
Concrètement, un moteur d’affichage standard tourne aux alentours de 60 fps
(frames per second), alors qu’une boucle d’IA toutes les 0.5 ou 1 seconde serra
suffisante.
Si les niveaux comportent un grand nombre d’ennemis, il serait bon de lancer
leurs fonctions d’IA respectives à tour de rôle.
La réaction de certains ennemis pourra influer sur le comportement des autres
(une alerte déclarée par un garde pourra interrompre un comportement de ronde
par exemple).
A l’intérieur de chaque boucle, il faudra pouvoir conserver les états et les
informations calculées afin qu’elles puissent être réutilisées pour le tour de
boucle suivante. Il faudra donc déclarer ces variables en tant que membre d’une
classe, ou éventuellement en global.
b. Recherche de chemin – Pathfinding
Système utilisé
Un système de pathfinding va s’avérer nécessaire pour les ennemis ainsi que
pour Tao et Zia.
Ce système permettra à ces PNJ de trouver leur chemin à travers un niveau pour
arriver à un point voulu (si Esteban appelle Tao, ou si un conquistador a repéré
les enfants et cherche à les capturer).
Ce système doit pouvoir tenir compte de la géographie des niveaux qui
utiliseront plusieurs niveaux d’altitude et qui ne seront pas atteignables par tout
les personnages (Zia ne peut pas grimper seule par exemple).
Pour calculer le chemin à emprunter, chaque niveau doit être découpé en un
graphe, qui décrira les zones atteignables.
Trois solutions sont possibles :
• Un découpage des zones en boites,
• Un découpage en zones triangulaires sur le sol (comme dans Jak
and Daxter sur PS2)
• L’utilisation de points de navigation (comme dans Unreal
Tournament sur PC).
L’utilisation de Navigation Points semble la solution la mieux adaptée à nos
besoins. Celle-ci tient en effet bien compte de l’altitude et est la plus efficace
pour gérer l’espace.
DESS JVMI - 2004
18
Un autre aspect très intéressant est la possibilité de taguer les liens entre les
navigation points, de même que les points eux-mêmes.
On peut ainsi stocker dans chaque lien des informations sur l’animation à utiliser
pour le personnage, mais aussi des informations sur le « coût » de déplacement
d’un point à l’autre (si le lien coupe une rivière ou une zone marécageuse par
exemple).
Ces informations pourront aussi être utilisées pour des aspects très spécifiques,
notamment concernant le personnage de Zia.
Celle-ci ne pourra franchir seule des zones, contrairement à d’autres
personnages, car elle ne sait pas grimper seule ni sauter.
Génération du graphe de chemins
En revanche, ce système pose des problèmes pour la génération du graphe de
nœuds.
Il existe des algorithmes de génération automatique, mais ils sont vite très
compliqués et coûteux (cela peut prendre plusieurs minutes voir plusieurs heures
si le niveau est grand) et ne fonctionnent pas toujours bien pour rejoindre les
points de différentes hauteurs.
Le temps de calcul n’est pas forcément un problème, puisque la génération du
graphe sera précalculée, mais cela peut être vite contraignant lors du level
design car si des modifications sont apportées au décor, il faudra alors générer
un nouveau graphe.
D’un autre côté, il est possible de placer les points de façon manuelle, ce qui
permet un bon contrôle des chemins et une grande souplesse si le décor évolue.
Mais cela peut être considéré comme une perte de temps pour les level
designers. C’est un travail qui est vite long et fastidieux.
La meilleure solution serait une solution intermédiaire, qui consisterait à générer
une première version du graphe de points pour chaque niveau de hauteur de jeu
(avec une certaine marge de hauteur pour les zones en pente), puis de relier et
modifier ces nœuds de façon manuelle pour améliorer les chemins obtenus.
Choix et parcours du chemin
On utilisera un algorithme classique de type A*.
c. Logique floue VS Finite State Machines
Afin de donner aux ennemis des réactions relativement crédibles, il serait
intéressant d’implémenter un système de logique floue pour les personnages
plutôt qu’un système à états finis classique.
Ce système permet une meilleure souplesse de réaction aux évènements et évite
des changements de direction ou d’état trop brusques.
DESS JVMI - 2004
19
La logique floue fait partie des nombreuses méthodes pour aller plus loin dans la
finesse des changements d’état d’un Jeu.
On peut se restreindre à une transition et un état correspondant, mais dans cette
configuration, tout est binaire. La logique floue propose de passer à quelque
chose de linéaire.
Il n’y a plus un Etat en sortie mais plusieurs en fonction de l’entrée, qui est
linéaire.
L’exemple suivant montre le comportement des gardes poursuivant le groupe
composé d’Esteban et de ses amis. Il s’agit de déterminer comment les gardes
vont œuvrer pour que le joueur ne soit pas trop rapidement attrapé.
Exemple de logique floue pour MCOG avec comme entrée la distance et le
rapprochement:
Se
rapproche
lentement
S’arrêter
Stable
S’éloigne
lentement
S’éloigne
rapidement
Trop près
Se
rapproche
rapidement
S’arrêter
Décélérer
Décélérer
Près
S’arrêter
Décélérer
Décélérer
Distance
parfaite
Eloigné
Décélérer
Décélérer
Décélérer
Très Eloigné
Garder
la
même vitesse
Garder
la
même vitesse
Accélérer
Garder
la
même vitesse
Accélérer
Garder
la
même vitesse
Accélérer
Garder
la
même vitesse
Accélérer
Accélérer
Accélérer
Accélérer
maximum
au
Accélérer
Accélérer
maximum
Accélérer
maximum
au
au
Toutefois ceci n’empêche pas d’implémenter un système à états finis pour les
autres éléments du jeu.
Certains objets n’auront que quelques états possibles, comme un ascenseur
(arrêt, monter, descendre), ou un interrupteur (actif, inactif).
Un système à états finis est même obligatoire dans ces cas.
d. Système multi agents
Pour gérer les PNJ alliés que sont Tao et Zia, on envisagera un système multi
agents qui permettra de gérer leur comportement de leur point de vue.
Ces agents pourront communiquer entre eux et avec Esteban en s’envoyant des
messages (renseigner sur un état, message d’alerte, action accomplie, etc.).
Ce système pourra être réutilisé pour gérer des groupes d’ennemis.
Ceux-ci pourront être hiérarchisé et pourront s’envoyer des messages d’alerte les
uns les autres, tout particulièrement pour les phases d’infiltration et d’évasion.
DESS JVMI - 2004
20
e. Gestion des formations
Lorsque l’on dirige les trois enfants à la fois, il faut pouvoir se déplacer de façon
précise en suivant une ou des formations prédéfinies.
Ces formations devront permettre de diriger le groupe lors de phases d’action, de
plateforme et d’infiltration qui nécessiteront des placements « intelligents » et
aisément manoeuvrables.
Pour indiquer à Tao et Zia leur position de référence par rapport à Esteban, nous
allons utiliser un système de grille de positions qui se déplacera et s’orientera en
même temps que lui.
E
Z
E
T
Z
Formation Esteban/Zia
Formation Esteban/Zia/Tao
E : Position d’Esteban Z : Position de Zia T : Position de Tao
Cette grille permettra un placement efficace et précis des personnages entre eux.
Toutefois, certaines adaptations seront nécessaires pour un résultat plus réaliste
et plus maniable.
Si l’on applique la grille telle quelle, les personnages auront tendance à se placer
systématiquement derrière Esteban, et bien que ce soit un avantage dans les
déplacements rapides, cela peut s’avérer génant dans les phases délicates ou un
simple demi tour d’Esteban modifie toutes les positions.
Il faudra donc intégrer une certaine souplesse à ces positions, ou créer des
formations pour des situations spécifiques.
Par exemple pour rapprocher les personnages le plus possible, ou les mettre en
file indienne lorsqu’ils se trouvent dans des couloirs étroits.
DESS JVMI - 2004
21
E
T
E
Z
Z
T
Formation file indienne
Formation « de front »
6. Moteur de son
La PSP est équipée de possibilités avancées en matière de traitement du son et
de spatialisation. Pour ces raisons, nous simulons dans la maquette :
-
-
la spatialisation du son
la musique interactive
le son d’ambiance
les effets sonores (effet de salle,…)
Il faut déterminer un standard de qualité sonore en tenant compte :
de la mémoire disponible
des fréquences audibles émises par des hauts parleurs
des APIs potentiellement disponibles pour la PSP.
Pour simuler un environnement similaire, nous utilisons donc dans la maquette
Direct Music.
Pour l’utilisation sonore, l’espace mémoire alloué est de 4Mb compressés (soit
8Mb).
Donc découpé avec :
4Mb décompressés de DLS
4Mb décompressés de streaming de source sonore.
Interactivité avec le son.
Nous gérons l’activité sonore de manière événementielle.
Lorsqu’un événement particulier est enclenché (comme le changement de
configuration des personnages) un événement est émis et est pris directement
en compte dans le moteur son (ex : passage d’un segment à l’autre avec
FADE,…)
Deux types d’événements ont été retenus :
- Les événements spatiaux qui interviennent lorsque le joueur passe dans
un endroit précis (voir Outil de Level Design). Généralement destinés à
des changements d’ambiance sonore ou au lancement de son particulier
(comme par exemple un son spatialisé,…).
DESS JVMI - 2004
22
-
Les événements de profil/état de jeu, le joueur change d’état où fait une
action particulière qui lance un événement sonore.
Exemples d’événements sonores de personnage :
-
Attendre
Actionner mécanisme
Prendre Objet
Se plaquer à un mur
Appeler amis
Pousser objet
Quart de tour
Jeter Objet
Utiliser Objet
Longer
-
Marcher
S’agripper
Grimper
Monter Echelle
Monter corde
Nager
Attendre dans l’eau
Tomber
Agripper rebord
…
Flot de Production
Le flot de production est découpé en deux parties. Chaque partie correspond au
protagoniste spécialisé :
Le programmeur son
L’ingénieur du son.
Le programmeur code les événements ainsi que le moteur de script et de son.
L’ingénieur du son script les événements logiciels qui sont envoyés par le jeu.
Pour pouvoir travailler convenablement, l’ingénieur du son dispose d’un langage
de très haut niveau, proche du basic.
Sous DirectMusic, l’ingénieur du son utilise le VBscript comme langage de script.
Il gère lui-même les volumes de chaque partie sonore, les fades, le lancement de
segments sonores, les chargements de DLS, jouer des événements midi.
Le moteur de script charge et appelle les scripts lors d’appels d’événements.
A chaque fonction correspond un événement.
Pour notre version de production un langage (LUA) de même nature que le
VBscript sera utilisé.
-
Le langage de script fournit les fonctions suivantes :
Fade
Play
Stop
Synchronisation par rapport au marqueur
Chargement/dechargement DLS
Play Midi
Stop Midi
DESS JVMI - 2004
23
7. Gestion événementielle
Dans le cadre de ce projet, l’utilisation d’un outil de Level Design paraît
nécessaire.
Dans chaque niveau du jeu, les actions du joueur doivent susciter l’apparition
d’événements apportant un surplus d’interactivité.
Ainsi, les événements sont déclenchés spatialement.
Lorsque le joueur se déplace, dans une zone particulière, il met en jeu des
actions invisibles (lancement de morceaux musicaux, téléportation du joueur
dans un autre endroit…).
On distingue trois grands types d’événements :
-
les événements liés aux héros et à leur environnement : téléportation,
lancement de cinématique, lancement d’animation…
-
les événements liés au son : organisent l’interactivité musicale par
rapport au lieu que le joueur visite.
-
les événements liés au changement de caméra : attirent l’attention du
joueur sur une zone intéressante
Deux type d’éléments collisionneurs :
-
la boite : Seulement deux points sont nécessaire pour définir une
boite
la sphère : Est défini par un rayon et un point.
8. Gestion des animations
Les animations sont gérées avec du blending.
A chaque changement d’animation, on interpole la dernière position de
l’animation précédente avec la première position de l’animation suivante.
La vitesse des animations et le temps du blending entre les animations sont
gérés à partir d’un fichier de configuration XML.
DESS JVMI - 2004
24
9. Gestion des éléments d’interface
Nous avons adopté deux solutions complémentaires :
o
o
Le moteur d’animation 2D de Renderware, Maestro, qui permet,
après l’édition d’un fichier programmé sous Flash, de récupérer des animations.
Nous utilisons cette fonctionnalité pour gérer les menus.
Le placage de texture directement sur l’écran du jeu. Ce système
permet de gérer des animations dynamiques de manière plus aisée que sous
maestro. Nous adoptons cette solution pour gérer les InGame.
Interfaçage entre Maestro et Flash
L’interfaçage entre Maestro et Flash s’effectue en simulant une manette que l’on
fait disparaître à l’export. Cette manette permet au graphiste connaissant Flash
de simuler l’action d’une manette.
Dans le code, nous lions les boutons déclarés dans Flash avec la véritable
manette de jeu.
10. Gestion de la physique
Nous n’utiliserons pas de moteur physique préexistant pour le jeu final.
Dans Children of the Sun, le moteur physique du jeu n’a pas pour rôle de recréer
fidèlement des conditions physiques réalistes.
Comme il s’agit de l’adaptation d’un dessin animé, les personnages devront faire
des actions parfois irréalistes.
Il va plutôt s’agir de simuler et de donner l’illusion de la physique au jeu par
quelques fonctions adaptées aux diverses situations.
DESS JVMI - 2004
25
Gestion des collisions :
-
des personnages envers le décor,
des personnages envers les autres personnages,
des personnages envers les assets (objets du décor amovibles),
Il faut ajouter à ceci les collisions des assets envers le décor statique et aussi
certaines collisions particulières dans des zones de déclenchement (triggers
scénaristiques, couches sonores, puzzles, …).
Acteurs/décor : le moteur utilise des sphères englobantes qu’il projette à
chaque déplacement en appelant la fonction de RenderWare Graphics :
RpCollisionWorldForAllIntersections.
Elle fonctionne pour les collisions envers les décors statiques dont les données
proviennent d’un fichier .bsp.
Acteur/acteur : encore une fois nous utiliserons des sphères englobantes.
En revanche il ne s’agira que de tests de collisions entre deux sphères, dont le
calcul est très simple et sera effectué sans appel de fonction spécifique de
RenderWare.
Exemple de fonction de test de collision entre deux sphères :
bool MCoG3DActor::FindAtomicContact(RwV3d& movement, const RwSphere *boundingSphere)
{
Const RwSphere *CollisionSphere = RpAtomicGetWorldBoundingSphere(CollisionAtomic);
RwV3d vectorToCenters =
{
boundingSphere->center.x - CollisionSphere->center.x,
boundingSphere->center.y - CollisionSphere->center.y,
boundingSphere->center.z - CollisionSphere->center.z
};
RwReal distance = RwV3dLength(&vectorToCenters);
if(distance < (CollisionSphere->radius + boundingSphere->radius)*0.5)
{
RwV3dNormalize(&vectorToCenters, &vectorToCenters);
RwV3dSub(&movement, &movement, &vectorToCenters);
return true;
}
return false;
}
Pour d’autres tests, nous utiliserons en revanche des lancer de rayon, moins
coûteux que les sphères.
Ceci englobe les tests de position par rapport au décor, pour savoir si un
personnage pourra s’agrippe,r par exemple.
Dans un cas concret, si le moteur détecte une collision entre la sphère
englobante et le décor, il lancera un rayon au niveau des épaules et un autre au
niveau de la tête du personnage.
Si aucun ne collisionne, cela veut dire que la collision initiale a eu lieu au niveau
des jambes et que l’obstacle peut être enjambé. Si la collision a lieu au niveau
DESS JVMI - 2004
26
des épaules seulement, il pourra se hisser. Si les collisions ont lieu à tous les
niveaux, il ne pourra simplement pas passer.
Pas de collision
Collisions
Dans le cas ci-dessus, le personnage pourra s’agripper à la paroi et se
hisser.
Tous ces tests sont relativement coûteux et pourront être optimisés de plusieurs
façons.
Le décor pourra par exemple contenir des « tags » (marqueurs invisibles sur des
zones du décors) pour savoir si une zone peut être agrippée.
Avant d’effectuer les lancer de rayon supplémentaires, il suffira de vérifier dans
quel type de zone on se trouve.
Ceci pourrait aussi empêcher le joueur de s’accrocher accidentellement à des
endroits non prévus, et donc susceptibles de causer des bugs.
Gestion de la physique :
Ce sera principalement des fonctions qui utiliseront les informations de collision
pour empêcher un acteur de passer à travers un mur, le sol ou encore un autre
acteur, mais aussi de dévier la trajectoire initiale (et non pas bloquer seulement
le déplacement).
La physique devra aussi gérer la gravité.
Lors des phases de plateforme, ceci sera principalement utilisé pour gérer les
sauts et les chutes (hauteur, durée, accélération, etc.). Pour les phases en
Condor, la gravité permettra de voler, planer et accélérer.
DESS JVMI - 2004
27
La portance qui fait voler le condor
La portance est la résultante des forces de pression qui agissent sur un corps
placé dans un courant fluide.
Soient :
Fa = Ca.ρ.A.v²/2
Fa = portance en Newton
Ca = coefficient de Lift typiquement compris entre 0,02 et 0,05
ρ = masse volumique du fluide en kg/m3
v = vitesse relative d’écoulement en m/s
A = aire projeté de l’aile en m²
Pour cet exemple la force résultante est Fr = Fe-Fw +Fa – Fp
Fe est la force exercée pour faire voler le condor
Fw est la force de frottement de l’aile en Newton
Fp = m.g
Fa est donnée plus haut
11.
Gestion des entrées utilisateur et gameplay
Les entrées utilisateur s’effectueront à plusieurs niveaux :
- Entrées utilisateurs au joypad qui seront enregistrées à l’aide d’une interface appelée
InputManager, utilisant des routines de DirectInput.
- Récupération et exploitation des données du capteur solaire. Stockage dans une variable puis
interprétation de la valeur stockée.
- Possibilité de sauvegarder puis reprendre une partie. Nécessité de déterminer à quel point les
données du jeu devront être sauvegardées (simple progression, progression et état des
personnages, etc.)
DESS JVMI - 2004
28
Le gameplay du jeu va englober tout ce qui a trait à l’interprétation des actions
du joueur.
La physique et le gameplay d’un jeu sont deux aspects extrêmement liés.
Si la physique gère la façon dont vont interagir les objets et acteurs du jeu
(collisions, gravité…), le gameplay va gérer la façon dont le moteur va traiter les
entrées utilisateur de façon à ce que le joueur prenne du plaisir à jouer.
Il sera nécessaire de bien régler le gameplay.
Pour faciliter ce réglage nous utiliserons des fichiers xml dans lesquels nous
lirons la valeur des principales variables du jeu (vitesse de déplacement, points
de vie, positions, etc.). Ceci permettra aux game et level designers de régler
eux-mêmes ces paramètres de manière simple sans qu’ils aient à toucher au
programme et sans que les programmeurs aient à recompiler des parties du jeu
entières à chaque fois.
DESS JVMI - 2004
29
ANNEXE 1
PHYSIQUE DU CAPTEUR SOLAIRE
DESS JVMI - 2004
30
Définition de la température de couleur
La notion de température de couleur repose sur la théorie de l'émission du corps noir.
Le corps noir est une matière fictive capable d'absorber totalement toutes les radiations
électromagnétiques lorsque sa température est le zéro absolu, soit :
-273.15°C=0K (Kelvin).
Aucune lumière n'est réfléchie et sa couleur est donc le noir parfait, d'où son
nom. Mais c'est aussi une matière capable d'émettre un rayonnement
électromagnétique si sa température n'est plus 0K
La distribution d'énergie émise, ou spectre, est alors directement liée à
sa température.
Le corps noir parfait n'existe pas, mais dans certaines conditions de hautes
températures et hautes pressions (> 1Bar!), beaucoup de matière ont un spectre
d'émission superposable à celui de la théorie.
Historiquement, c'est l'observation de l'émission de corps incandescents qui a
permis de construire une théorie basée sur la thermodynamique statistique.
L'acier est en effet un bon corps noir. De l'augmentation de sa température
va résulter un rayonnement de plus en plus intense du rouge profond au
blanc aveuglant.
Une des formules importantes est l'équation de Planck :
ou
qui est la distribution d'énergie en fonction de la longueur d'onde du
rayonnement électromagnétique émis par un corps noir de température
T.
DESS JVMI - 2004
31
Traçons cette fonction pour différentes
températures:
Les
spectres
sont
ici
normalisés.
Cependant l'énergie totale émise par le
corps noir est proportionnelle à la
puissance 4 de la température.
Le flux à 10000K est donc 10000 fois
plus intense qu'à 1000K.
Mais ce qu’il est important d'étudier ici
est la distribution de cette énergie en
fonction de la longueur d'onde. La théorie
montre que le produit de la longueur
d'onde d'émission maximale par la
température est une constante.
Ainsi plus la température augmente,
plus la longueur d'onde diminue,
allant pour la partie visible, du rouge au
bleu. (Rappelons que les courbes sont ici
normalisées, mais l'énergie de chaque
longueur d'onde à 5600K est beaucoup
plus grande qu'à 3400K.)
Il ne faut pas assimiler la température de
couleur à une intensité globale du flux.
Dans le cas d'une même source de masse
constante, en effet nous avions vu que
l'intensité
augmentait
avec
la
température de couleur.
Mais dans le cas de deux sources
différentes, une température de couleur
plus grande ne signifie pas une intensité
de flux plus grande.
Pour exemple: un halogène de 1000W,
avec une température de couleur de 3200K, a un flux plus intense qu'un
petit flash dont la température de couleur est de 5000K. De même la
DESS JVMI - 2004
32
température de couleur du ciel peut varier de 2000 à 20000K sans pour
autant être plus intense.
En fait le ciel (l'atmosphère) joue le rôle d'un filtre de conversion. Le spectre
solaire a une température de couleur de l'ordre de 10000K. Mais l'atmosphère
absorbe les UV et diffuse les bleus. Sur terre les jaunes et rouges du spectre
deviennent alors prédominants et le spectre peut être comparé à celui d'un corps
noir à 5600K. En revanche, le ciel est une source de lumière secondaire où les
bleus sont majoritaires.
Bien que le flux ne soit pas très intense par rapport au soleil, la température de
couleur du ciel bleu est alors au dessus de 5600K.
Théorie de mesure de température de couleur
Ceci est un travail de laboratoire.
Pour cela, il faut partir de la formule de Planck et regarder les valeurs non
statiques comme la longueur d’onde (m) et l’intensité lumineuse émise (W/m3).
Le premier travail est l’utilisation de filtres photo sur un intervalle étroit de
longueur d’onde donnée.
Le second travail est de convertir l’intensité en Ampère en intensité lumineuse.
Ceci se fait par une mesure très précise de l’intensité lumineuse par rapport au
courant. On obtient une table de correspondance qui détermine très précisément
les caractéristiques de la photodiode.
Lorsqu’on a récupéré une longueur d’onde plus une intensité lumineuse, on peut
résoudre la formule de Planck :
B = Intensité lumineuse
λ = Longueur d’onde
On obtient, pour une longueur d’onde et une intensité donnée, une température
monochromatique qui n’est pas la température de couleur recherchée.
Pour mesurer cette température de couleur, il faut une fonction de
transformation que l’on ne peut mesurer qu’en comparant ces deux températures
en laboratoire équipé de matériel adéquat.
La première approximation qui parait suffisante est une fonction simple du
premier degré:
On obtient ainsi une température de couleur approximative.
Pour obtenir une très grande précision, deux méthodes sont utilisables et
complémentaires :
la complexification de la formule d’approximation
la multiplication des capteurs photosensibles dans des longueurs d’ondes
différentes
DESS JVMI - 2004
33