Réaliser un personnage pour Quake3Arena

Écrit le 06/01/2004 par ced.led
Dernière mise à jour : 01/02/2006

Preparations

J'utilise 3dsmax pour ce tutoriel mais n'importe quelle suite 3d devrait faire l'affaire si vous avez un plugin d'export md3 ( ou simplement la possibilité d'exporter toutes vos frames en .3ds ).

Outils necessaires : 3D Studio Max 2.x ou superieur.
Pop'N'Fresh md3 exporter pour 3dsmax 5. Sinon allez sur http://www.maxplugins.de vous devriez y trouver l'exporter MD3 pour votre version de 3dsmax
N'Pherno MD3 compiler ref_box.3DS Quake 3 Arena

Prérequis : Les bases de 3dsmax : modelisation, animation squeletale, UVmapping

Créez quelque part cette arborescence de repertoires :
http://www.game-lab.com/images/tuts/q3_perso/repertoires.jpg
en remplacant bien sur "viciious" par le nom de votre personnage.
Preparez vous un sandwitch avec beaucoup de mayonnaise.

Modélisation

Je suppose que vous connaissez les bases de la modelisation, je donne ici uniquement des indications specifiques a Quake 3.

Avant de vous lancer sur un perso, je vous conseille de rapidement faire le tuto en utilisant "ref_box.3ds" . En 1/4 d'heure vous devriez voir le model dans quake 3, avoir un bon apercu de la marche a suivre et eviter les problemes eventuels qui pourraient vous faire perdre du temps.

Votre personnage doit etre composé de 3 parties separées : la tete, le torse, les jambes. Chaque partie peut etre composée de plusieurs elements. Nommez tous vos elements en utilisant les prefixes "h_" pour tout ce qui formera le modele de la tete (Head), "u_" pour le torse (Upper), "l_" pour les jambes (Lower).
http://www.game-lab.com/images/tuts/q3_perso/parties.jpg.
Chaque element ne doit pas depasser 1024 triangles (mais vous pouvez, je crois, utiliser autant d'elements que vous voulez). Tachez de rester en dessous de 1500 triangles sur l'ensemble du perso pour rester dans la "norme" quake 3...

Faites en sorte que vos 3 parties se rentrent un peu les unes dans les autres. Deplacez les points de pivots de vos maillages : sur le bassin pour le torse, et sur le cou pour la tete. Faites faire toutes sortes de rotations aux groupes de mesh h_head et u_torso pour verifier que ca colle.

Dans cet exemple, j'ai plusieurs elements qui composent la tete, car je compte appliquer un shader specifique aux parties metalliques du visage (on verra plus tard pour les shaders =] ) : un effet chromé , une saturation sur l'oeil a la terminator.

Procedez a l'UVWmapping de votre personnage, puis a l'Unwrap UVW. Rien de particulier a dire :p. En general, vous aurez une texture pour les jambes, une pour le torse et une pour la tete, mais vous pouvez faire un uvmap global a tout le model (ca ne fait qu'une seule texture a charger ), plus les eventuelles parties auquelles vous voulez appliquer un shader special.

Texturing

Exportez votre Unwrap UVW (avec Texporter par exemple) au format d'image que vous voulez. Ouvrez le dans votre soft de dessin et faites votre/vos texture(s) en .tga 24bits (32bits si vous voulez appliquer un shader sur un channel alpha) ou .jpg. En 256*256 idéalement pour le corps, et 128*128 pour le modele de la tete. Vous pouvez monter plus haut si vous le sentez, mais les modeles de players de q3 ne depassent pas ces resolutions de texture.
Sauvez les dans votre_modelmodelsplayersvotre_model

Faites un petit rendu (64x64 pixels) du visage de votre perso dans 3dsmax, sauvez l'image en tga avec sa couche alpha, enregistrez le sous icon_default.tga dans le meme repertoire que le reste. Cette image apparaitra dans le menu de selection du joueur.

Setup et premier test ingame

A/ LES TAGS

Qu'est-ce qu'un tag ? C'est un minuscule triangle qui sert de point d'accroche a toutes vos parties de mesh (head, upper, lower).

tag_head : placez le au niveau du cou du perso
tag_torso : sur le bassin
tag_weapon : dans la main qui portera l'arme
tag_floor : au niveau des pieds.

Dans la vue de dessus, créez un plan, editez le pour supprimer une de ses deux faces et ne laisser qu'un triangle. Dupliquez le, placez tous vos tags a la bonne position et nommez les comme ci-dessus.

B/ ANIMATION.CFG

Non, on ne va pas animer tout de suite =], mais on va preparer le terrain pour pouvoir tester le model "ingame" le plus tot possible, histoire de verifier que "jusqu'ici, tout va bien" :P
Un perso Q3A a besoin du fichier animation.cfg pour etre affiché. Voici un exemple de ce type de fichier :

[quote]
sex m
headoffset -3 0 0

// first frame, num frames, looping frames, frames per second

0 30 0 25 // BOTH_DEATH1
29 1 0 25 // BOTH_DEAD1 //DEAD = last frame of DEATH
30 30 0 25 // BOTH_DEATH2
59 1 0 25 // BOTH_DEAD2
60 30 0 25 // BOTH_DEATH3
89 1 0 25 // BOTH_DEAD3

90 10 0 10 // TORSO_GESTURE

100 6 0 15 // TORSO_ATTACK //HIGHLY recommended to be 6 frames long
106 6 0 15 // TORSO_ATTACK2 //HIGHLY recommended to be 6 frames long

112 5 0 20 // TORSO_DROP //HIGHLY recommended to be 5 frames long
117 4 0 20 // TORSO_RAISE //HIGHLY recommended to be 4 frames long

121 1 0 15 // TORSO_STAND
122 1 0 15 // TORSO_STAND2

123 8 8 20 // LEGS_WALKCR
131 12 12 20 // LEGS_WALK
143 10 10 16 // LEGS_RUN
153 10 10 20 // LEGS_BACK
163 10 10 15 // LEGS_SWIM

173 9 0 15 // LEGS_JUMP
182 3 0 15 // LEGS_LAND

185 9 0 15 // LEGS_JUMPB
194 3 0 15 // LEGS_LANDB

197 1 1 15 // LEGS_IDLE
197 1 1 15 // LEGS_IDLECR

199 1 1 15 // LEGS_TURN
[/quote]

On y trouve le sexe du perso : m ou f. Cela sert uniquement aux bots a s'addresser a votre personnage sans se meprendre sur son genre lors des chats ingame.
headoffset sert a repositionner l'origine de la tete si besoin ( néanmoins present dans tout animation.cfg qui se respecte ).
On a ensuite toute la liste des animations que vous allez devoir realiser. Laissez tout tel quel pour le moment. Copiez tout ca dans un editeur de texte, et sauvez le sous votre_modelmodelsplayersvotre_modelanimation.cfg

C/ FICHIERS .SKIN

Chacun des .MD3 que vous allez bientot obtenir a besoin de ce fichier (encore un fichier texte) pour que s'y applique la bonne texture.
chaque md3 en a au moins un : head_default.skin , upper_default.skin , lower_default.skin
Un exemple : head_default.skin

[quote]
tag_head,
h_chrome,models/players/viciious/h_chrome.tga
h_oeil,models/players/viciious/oeil.tga
h_head,models/players/viciious/viciious.tga
[/quote]

On y trouve :
* le nom du tag relatif a "head.md3"
* le nom de chaque sous-partie de head.md3, suivi du chemin ou se trouve sa texture.

upper_default.skin :
[quote]
u_chrome,models/players/viciious/u_chrome.tga
u_torso,models/players/viciious/viciious.tga
tag_weapon,
tag_head,
tag_torso,
[/quote]

lower_default.skin :
[quote]
l_legs,models/players/viciious/viciious.tga
tag_torso,
[/quote]

Faites de meme en adaptant a votre model. Si vous prevoyez de faire des textures Team play (bleues et rouges) il vous faudra ajouter les fichiers head_blue.skin ; head_red.skin ; upper_blue.skin ; upper_red.skin ; lower_blue.skin ; lower_red.skin , dans lesquels vous indiquerez vos textures Team play.
Sauvez tous ces fichiers encore dans votre_modelmodelsplayersvotre_model.

Bien, on y est presque =]

D/ EXPORTER LES .MD3

3DSmax et Quake 3 n'ont pas le meme systeme de coordonnées. Pour que le modele soit correctement orienté, vous devez le tourner de 90 degrés : dans votre vue "droite" vous devez voir le perso de face. Faites faire une rotation globale a votre mesh et tags.
Importez ensuite dans votre scene ref_box.3ds qui se trouve dans le .zip du meme nom (a moins que vous n'ayez suivi toutes les etapes precedentes avec cette boite :p ). Il s'agit d'une boite dont les dimensions sont les memes que la hitbox de quake3Arena. Ajustez la taille de l'ensemble du perso a cette boite.
Faites un courageux "reset X-Form" sur toute votre selection (onglet utilities, en haut a droite), puis un non moins vaillant "convert to editable mesh". Vous liberez un peu de ressources systeme si votre pile des modificateurs fait trois kilometres, et rendez effectives toutes les rotations, etc. Bref votre scene se trouve a un stade "initial".

Pour vous faciliter les choses par la suite, faites les groupes de selection suivants : http://www.game-lab.com/images/tuts/q3_perso/groupe.jpg

*Selectionnez toutes les parties de la tete (qui ont normalement toutes le prefixe "h_" ) ET le tag_head. Creez un groupe de selection "head".
*Selectionnez toutes les parties du torse (prefixe "u_" ), ainsi que les tags "tag_head", "tag_torso", "tag_weapon". Nommez le groupe "upper".
*Selectionnez toutes les parties des jambes (prefixe "l_" ), et le tag "tag_torso". Nommez ca "lower". NE SELECTIONNEZ PAS TAG_FLOOR. Ce tag ne sert que de point de reference pour l'exportation.

Vous sauverez vos md3 toujours dans le meme repertoire que les textures, .skin et animation .cfg.
Selectionnez le groupe "head". Faites un "export selected", format md3, que vous nommerez head.md3. Une boite de dialogue apparait, remplissez les champs comme ceci :
http://www.game-lab.com/images/tuts/q3_perso/export_head.jpg
Vous n'exportez qu'une seule frame, car dans Q3, la tete n'est pas animée, c'est le code qui se charge de la faire pivoter.

Faites de meme avec les groupe "upper", upper.md3:
http://www.game-lab.com/images/tuts/q3_perso/export_upp.jpg

...puis "lower", lower.md3 :
http://www.game-lab.com/images/tuts/q3_perso/export_low.jpg

Si ce message apparait, n'y pretez pas attention...
http://www.game-lab.com/images/tuts/q3_perso/UV_error.jpg

E/ COMPILATION

A ce stade, tout est pret, mais nous allons quand meme passer par une dernier etape : N'pherno md3 compiler, qui va servir a faire les derniers ajustements.
Lancez MD3Compile.exe, Import objetcs, chargez un des md3.
Cliquez "all" devant "objects" et devant "frames".
Cliquez sur rebuild normal, cocher "ignore uv split" > ceci va faire un smooth global sur les normales du mesh (si vous ne le faites pas, le model apparaitra en fullbright). Si vous ne cochez pas "ignore uv split", les smooth groups suivront vos groupes d'UV mapping.
Faites "export object" et ecrasez le md3 que vous venez d'ouvrir.

Repetez la meme operation sur les 2 autres md3. Pour les jambes, juste avant de reexporter, cliquez sur "Align/Offset". Cochez les deux cases vides, et dans le champ "position / Y" mettez -24 ou -25. Ceci va descendre les jambes de quelques unités pour que les pieds collent bien au sol dans quake 3. Vous pouvez meme faire faire une rotation aux jambes si vous n'avez pas pivoté l'axe au prealable dans votre scene .max. ( Il n'est pas necessaire de faire cette manipulation avec upper ou head ).
http://www.game-lab.com/images/tuts/q3_perso/align.jpg
Vous pouvez aussi changer l'echelle de votre modele dans cette boite de dialogue.

Zippez le repertoire /models/ et tout ce qu'il contient. Renommez l'extension .zip en .pk3, et copiez cette archive dans votre repertoire quake3/baseq3/ .

Lancez le jeu, selectionnez votre bonhomme. Lancez une map dans la console et amusez vous avec un "/cl_thirdperson 1"

Vous etes satisfait du resultat ? On continue.

Animations

Revenez a 3dsmax, rouvrez votre scene (la toute derniere). Vous avez normalement votre personnage a la bonne echelle, bien orienté, avec vos precieux groupes de selection.

A/ RIGGING

Creez votre squelette, avec ce que vous voulez : des boites, des bones, ou un biped si vous avez character studio. Sitot que vous etes satisfait, etablissez des liens de parenté entre vos tags et le squelette :
http://www.game-lab.com/images/tuts/q3_perso/link.jpg

tag_weapon enfant de la main, tag_torso enfant du bassin (prenez "pelvis" pour character studio), tag_head enfant du cou.

B/ SKINNING

Il vous faut ensuite accrocher vos maillages sur le squelette. Sous 3dsmax, vous utiliserez certainement l'outil "skin", ou "physique" si vous avez character studio. Il vous faudra traiter les parties separemment, mais sans vous occuper des tags. Je m'explique :
Selectionnez le torse, appliquez-y physique ou skin, et selectionnez l'origine de votre squelette. Des enveloppes de la partie de squelette des cuisses vont tres certainement englober quelques vertices du bas de votre torse. Il vous faut exclure ces points des enveloppes qui ne font pas partie du torse, sinon vous aurez droit a d'etranges deformations ingame.
Tout mouvement du haut du squelette ( contenu dans la partie "upper")ne doit pas affecter le bas du mesh (ni la tete), et vice-versa.

Faites le skinning assez grossierement, testez un peu en faisant bouger votre squelette, arrangez le tout petit a petit.

C/ ANIMATION

Vous vous rappellez du fichier animation.cfg ? Reprennez-le et jetez-y un oeil:

*DEATH : On a trois animations "death", et apres chacune d'elles, une frame de pause "dead". c'est en fait la derniere frame de chaque animation "death" que animation.cfg indique (vous n'aurez donc pas besoin d'exporter vous meme cette frame). Ces animations sont les seules a s'appliquer a l'ensemble du model (lower+upper).
*TORSO_GESTURE : le geste de victoire (les bots l'utilisent beaucoup quand ils remportent un frag).
*TORSO_ATTACK : attaque par defaut (6 frames conseillé)
*TORSO_ATTACK2 : attaque au gauntlet (6 frames conseillé)
*TORSO_DROP : lorsque vous changez d'une arme A a une arme B, c'est l'animation de "rangement" de l'arme A. (5 frames)
*TORSO_RAISE : c'est ce qui suit l'animation precedente, le perso s'equipe de l'arme B (4 frames)
*TORSO_STAND : pause par defaut
*TORSO_STAND2 : pause avec le gauntlet
*LEGS_WALKCR : marche accroupie
*LEGS_WALK : marche debout
*LEGS_RUN : course en avant
*LEGS_BACK : course en arriere
*LEGS_SWIM : nage
*LEGS_JUMP : saut /!ATTENTION/! vous ne DEVEZ PAS animer votre saut en faisant s'elever le perso en l'air! c'est le code qui va s'en charger. Sinon, votre perso, ingame, va "sortir" de sa hitbox a chaque saut ( comme c'est malheureusement le cas dans quake2 et quake3 : jetez un oeil sur cet article passionant :http://www.cpm-fr.com/?p=c_col&id_col=21 ). Donc le perso doit rester les pieds collés au sol lors de son saut dans votre scene.
*LEGS_LAND : atterissage du saut
*LEGS_JUMPB : saut en arriere (meme chose que precedemment)
*LEGS_LANDB : atterissage du saut en arriere
*LEGS_IDLE : pause des jambes par defaut
*LEGS_IDLECR : pause des jambes en position accroupie.
*LEGS_TURN : pivot sur soi-meme.

Mises a part les animations pour lesquelles un nombre de frames est imposé, vous etes libre de les faire comme vous le sentez. Gardez ref_box visible dans votre scene lorsque vous animez, et tachez de garder le perso dans la boite dans la mesure du possible.
Sauvez chacune de vos animations sous un fichier .max

Pour le travail d'animation a proprement parler, je vous conseille LE tutorial de Paul "Villam" Steed d'ID Software http://www.loonygames.com/content/1.22/ ... dex2.shtml

Finalisations

Exportez chacune de vos animations comme decrit dans la partie "Setup et premier test ingame", en "D/" , en changeant bien sur le nombre de frames que vous exportez. Sauvez les de preference dans un autre repertoire ( /md3_source/ ) car vous allez vous retrouver avec un grand nombre de .md3. Ajoutez leur a chaque fois le prefixe "lower" ou "upper".
Attention la frame 0 compte : si une de vos animations fait 6 frames, cela veut dire que vous allez exporter de la frame 0 a la frame 5 (incluse). Dans le champ "following frames" de la boite de dialogue export md3, vous mettrez donc "0-5".

Une fois que vous avez toutes vos animations exportées en .md3, lancez MD3Compile.exe.
Faites "import object" et prenez la premiere de vos animations "torso_death". Ensuite, faites "import frames" et selectionnez la seconde animation "torso"death". Continuez comme ca pour toutes les animations torso, dans le meme ordre que animation.cfg. Notez au fur et a mesure le nombre de frames de chaque anim dans animation.cfg et additionnez les frames dans la colonne "first frame".
Faites un "rebuild normals" en ayant tout selectionné, et exportez le tout sous "upper.md3" dans le repertoire de votre modele.

Faites la meme chose avec les jambes, en nommant "lower.md3"
Pour la tete, si vous n'y avez fait aucune modification depuis votre premier test ingame, vous pouvez garder head.md3 tel quel.

Re-pakez tout ca comme precedemment, jouez =]

Bonus: Skins CPMA

Pour faire des skins customisables pour Challenge ProMode Arenahttp://www.promode.org, c'est assez simple :
Ouvrez la ou les texture(s) du personnage dans votre soft d'edition d'image. Ajoutez un peu de luminosité, du contraste, et passez tout ca en niveaux de gris. Sauvez les images sous /cpma/models/players/nom_du_perso/
Dans ce meme repertoire, créez des fichiers .skin pour les parties du modele :
[quote]l_legs,models/players/nom_du_model/pm
tag_torso,[/quote]
Nommez vos trois fichiers skin "head_pm.skin", "lower_pm.skin", upper_pm.skin"
Vous devrez aussi avoir dans ce repertoire un thumbnail du perso en 64*64 pixels. Nommez-le "icon_pm.tga"

Dans /cpma/scripts/ , créez un fichier texte et nommez-le "nom_du_modele_pm.shader"
Copiez-y ceci, en changeant les occurences "nom_du_modele" :
[quote]
models/players/nom_du_modele/pm
{
nopicmip
{
map models/players/nom_du_modele/nom_de_la_texture.jpg(ou tga)
blendFunc GL_ONE GL_ZERO
alphaFunc GE128
rgbGen entity
}
{
map models/players/nom_du_modele/nom_de_la_texture.jpg(ou tga)
blendFunc GL_ONE GL_ZERO
alphaFunc LT128
rgbGen identity
}
}
[/quote]

Et voila =] Je ferais peut-etre plus tard un tutorial sur les shaders mais je ne maitrise pas suffisamment le sujet. Il ya de tres bons tutos la dessus, mais tous sont en anglais. Servez-vous des shaders que vous trouverez dans pak0.pk3 ( dans /scripts ) pour les adapter a vos objets, c'est encore ce qu'il y a de plus simple.