Game AI 2007
CASANAS Sylvain
PASTOR Antoine
PERCHET Frederic
VERHEYE Fabien
PrincipeArchitectureAnimationAnalyse de RPGModèles de comportementAvenir du RPG
Issu du JDR papier
Un personnage ou groupe à incarner
Des quêtes à accomplir
Différents types de JDRClassique : Baldur’s Gate, Fallout, NeverwinterNigthsAction/aventure : Oblivion, GothicHack ’n slash : Diablo, Titan QuestMMORPG : WoW, EverquestTactical : FF Tactics, Golden Sun…
Différents universMédiéval FantastiquePost ApocalyptiqueSpace OpéraContemporain…
Définis par une feuille de personnage
Fallo
ut 2
Possèdent un inventaire
Neve
rWin
terN
igt
hs2
Un personnage unique ou un groupe
Acteurs de l’histoire Contrôlés par le joueurEvolue au fil du jeu
Neve
rWin
terN
igt
hs2
Contexte
Moteur Graphiqu
e
Moteur de son
Jeu
Carte
Element Objet
Personnage
PNJ
PJ
IA_PNJ
Journal
Quête InventaireFeuille de
Perso
Compétence
Dons Sorts
Moteur physiqu
e
Model du personnage structuré en 2 parties :
SqueletteAnatomie
MeshMaillage du model 3D
VertexLes sommets du maillages
BoneOs du squelette
2 models de skinning :Rigid skinningSmooth skinning
• On récupère la rotation du bone.
• On transforme cette rotation dans le repère du mesh.
• On récupère les vertices influencés par ce bone dans le mesh.
• On applique la rotation sur chaque vertex.
• Chacun de ces bones a une influence appelée “un poids” sur un vertex.
• Pour chaque vertex on récupère les matrices de rotation des n bones qui l’influencent ainsi que les poids correspondant.
• On modifie les vertices et les normales au vertex avec la formule suivante : V = M0*V*W0 + M1*V*W1 + … + Mn*V*Wn
Animé par le squelette
SqueletteContient les animations
MeshMaillage du model 3D
VertexLes sommets du maillages
BoneOs du squelette
Bones influençantsPoids des bones
Vertices à influencer
Vertices attachés au bone
AnimationClés d’animation
Interpolation de mouvementsUne animation se compose de keyframes
(translation et rotation sur un bone à l’instant ti)Connaître à chaque instant t les positions des
bones
• On récupère les 2 keyframes bornant t• On utilise une formule d’interpolation de mouvement pour trouver la position des bones à l’instant t
Interpolation de mouvements avec tangentesPermet des mouvements plus soupleDirection dans laquelle on arrive ou on part :
tangente in et tangente out
Composition de mouvements (Animation blending)
Enchainement de mouvements : même principe d’interpolation mais entre 2 keyframes d’animations différentes.
Un poids croissant ou décroissant sur les animations.
Cross fade, continuous blending.
Composition de mouvements (Animation blending)
Mélange de mouvements : Feather blending.Exemple : un personnage qui marche et fait
tourner son épée.Un modificateur de poids sur chaque os d’une
animation :Anim1 (marcher) : 100% sur les jambes, 20% sur les
bras.Anim2 (tourner épée) : 100% sur les bras, 0% sur les
jambes.
Motion CaptureM
akin
g o
f Th
e
Witch
er
Interactions PNJ :Quêtes : OblivionDialogues : Fallout 2Combat : NeverWinterNigths 2
Journal de quêtesDéfinie par une prioritéUne quête divisée en « quest stages » avec une
valeur indiquant l’avancement de la quêteMise à jour du journalEvolution du dialogue des PNJMise à jour du marqueur sur la carte
Exemple
10 : quête acceptée20 : 1ère étape validée30 : 2ème étape validée40 : quête terminée
Journal de quêtesO
blivio
n
Journal de quêtes
Ob
livion
Con
structio
n
Set
IA des PNJ de Fallout 2Les fichiers .ssl
procedure pickup_p_proc : Si le joueur tente de voler le PNJ procedure talk_p_proc : Début du dialogue procedure destroy_p_proc : Décès du PNJ procedure look_at_p_proc : Le joueur regarde le PNJ procedure description_p_proc : Le joueur regarde le PNJ avec
attention procedure use_skill_on_p_proc : Le joueur utilise une compétence
sur le PNJ. procedure damage_p_proc : Le PNJ perd des points d'impact. procedure map_enter_p_proc : Le joueur entre sur la map du PNJ.
C'est ici par exemple qu'est définie la team du PNJou son ia.
Exemple de dialogueprocedure talk_p_proc begin Evil_Critter:=0; Slavery_Tolerant:=SLAVE_VERY_INTOLERANT; Karma_Perception:=KARMA_PERCEPTION1;
if (dude_iq < 4) then begin start_gdialog(NAME,self_obj,4,-1,-1); gSay_Start; call Node012; gSay_End; end_dialogue; endelse if (global_var(GVAR_ARROYO_DOG) == DOG_FINISHED_BAD) then begin floater(128); end
else if (global_var(GVAR_ARROYO_DOG) == DOG_ACCEPTED) then begin set_local_var(LVAR_Herebefore,1); start_gdialog(NAME,self_obj,4,-1,-1); gSay_Start; call Node005; gSay_End; end_dialogue; end
procedure Node012 begin Reply(129); NLowOption(130,Node999);End
procedure Node005 begin Reply(114); NOption(115,Node004,004); NOption(116,Node999,004);end
{129}{}{J'ai à faire, imbécile. Va jouer ailleurs.}{130}{}{Gaaaah…}
{114}{}{As-tu retrouvé Fumace ?}{115}{}{Non, pas encore. Où as-tu dit que se trouvait le terrain de chasse ?}{116}{}{Non, pas encore.}
{128}{}{Fumace me manque. Pourquoi ne peux-tu pas le sauver ? Tu es l'Etre Elu.}
Autres procédures procedure damage_p_proc beginif (source_obj == dude_obj) then begin set_local_var(LVAR_Personal_Enemy,1); set_global_var(GVAR_ENEMY_ARROYO,1); end
end
procedure pickup_p_proc begin if (source_obj == dude_obj) then begin set_local_var(LVAR_Hostile,2); endend
Dépend de la distance au joueurLOD (Level of detail)
Dépend du type de créature
1
2
22
3
1
3
33
4
4
4
4
4
4
5
5
5
5
5
1
2
3
4
5
PJ
25%
10%
5%
2%
Charge CPU
Animaux Animaux « d ’ambiance » : oiseaux, insectes…
Déplacements basiques…
Autres animaux : ours, loups, cerf… Algos de « vie » : nourriture, protection, chasse,
errance Ob
livion
OursNormal errer(); si (a_faim() et voit_nourriture() ) { aller_a(nourriture-vue); animation(manger); }
Est_attaque while(est_vivant(attaquant)) {attaquer();}
VillageoisErrent dans la villeOccupation naturelles en fonction du moment
de la journéeDéplacements dans la foule
Assa
ssin’s
creed
Marchand Accroche du PJComportements dépendant des actions du PJ
Achats précédentsAide apportéeNégociationPopularité dans la ville
GardeSuit un tour de gardeRenseigne le PJEnquête sur les évènements suspects (cadavre,
inconnu…)Donne l ’alerte