vendredi 27 janvier 2012

Skinning almost done

Deux de mes anim avec le perso 1 de Agustin Trechi. Le skinning pourrait être retravailler au niveau des poignets mais je ne pense pas que cela se verra dans le jeu. J'essayerais de l'arranger quand même demain.

Kismet

Salut,
Dans ce post je vais vous expliquer comment fonctionne mon Kismet pour le niveau de chase Gang of New York.
Voici d'abord une vu d'ensemble :
Ceci pour deux obstacles seulement mais on peux en rajouter autant que l'on veut. Il fait un peu peur comme ça : je vais le cleaner et vous expliquer chaque étape. 

Première chose à faire : un anim tree. Le mien est très basic, et à vrai dire, pas besoin dans notre cas de faire beaucoup plus compliqué :) 
Un AnimNodeSlot nommé FullBodySlot pour que le code puisse le retrouvé et la suite est aussi simple que possible. 

Kismet pour un obstacle : 

1. Définit la variable 'Me' qui représente le joueur. 
2. Quand le joueur pèse E, la bool 'E pressed?' passe true. Ne pas oublier de mettre le trigger count à 0 pour que le joueur puisse faire cette action autant de fois que nécessaire. 
3. Quand le joueur passe dans le trigger placer juste devant le saut un message l’informe de peser E et la bool 'E pressed?' passe à false. Le joueur a alors o.35 sec pour appuyer E avant que le Compare Bool vérifie s'il l'a fait à temps. 
4. Si le joueur n'a pas été assez rapide, la bool 'E pressed?' est à false quand Compare Bool vérifie. Les input du joueur sont désactivés et l'anim de fail joue. Il faudrait que le level recommence au début à ce point mais je ne sais pas encore comment, peut être juste en tuant le pawn pour pouvoir respawn mais le Modify Health n'a pas l'air de marché...
5. Si le joueur a pas été assez rapide, la bool 'E pressed?' est à true quand Compare Bool vérifie. Les input du joueur sont désactivés et l'anim de jump joue. Les input du joueur sont réactivés et le joueur peut continuer vers le prochain obstacle. 

Note : il est important de setter un delay é la sortie des pawn anim pour laisser le temps à l'animation de jouer en entier avant de rentre le contrôle au joueur. Allez vérifiez la duré de vos animations dans votre anim set. 

Attention : parfois l'animation reste coincer dans les collisions de l'obstacle... Pour éviter ça ajoutez un Change collision avant le pawn anim. 



Here we go ! :)
Il est temps de retourner à l'animation maintenant !

Level actuel

Juste avant de vous parler un peu du Kismet derrière tout ça voici ce que ça donne comme résultat. Il restera a setter une caméra pas contrôlée par le joueur et a reprendre mon Kismet précédent avec les matinée pour le voleur.


Faire marcher le Pawn Anim et le Root Motion

C'est cette partie qui m'as volé ma semaine car elle touchait au code... Je suis ignorante du UnrealScript : je suis parvenue à mes fins en copiant les partie de code trouvés ça et là qui me semblaient avoir un effet.

La première chose était de faire fonctionner le node Pawn Anim de Kismet. NADPawn est dérivé du Pawn très de base de UDK qui ne comprend pas cette action Kismet.
Il faut ensuite setter le root motion. Oui dans le code, je vais vous expliquer pourquoi.

Pawn Anim va chercher dans le Anim Tree de l'actor target un AnimNodeSlot. Comme celui là :
L'animation spécifiée dans Pawn Anim utilise les Channel vide de ce node. 
Pour setter le root motion il faut aller dans un AnimNodeSequence. Comme celui là : 
Bref, comme Pawn Anim n'utilise pas ce genre d'animnode il faut stter le root motion dans le code qui s’exécute lorsque Pawn Anim est appelé. 

Pour plus d'info sur le Root Motion allez sur la page de l'UDN, c'est très clair : http://udn.epicgames.com/Three/RootMotion.html


Bref : pour que tout marche correctement, il faut ajouter ces parties au code de NADPawn :


var AnimNodeSlot FullBodyAnimSlot;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
if (SkelComp == Mesh)
{
FullBodyAnimSlot = AnimNodeSlot(Mesh.FindAnimNode('FullBodySlot'));
}
}

function enableRootMotion()
{
        // tell mesh to use Root Motion to translate the actor
        Mesh.RootMotionMode = RMM_Translate;

        // Tell mesh to notify us when root motion will be applied,
        // so we can seamlessly transition from physics movement to animation movement
        Mesh.bRootMotionModeChangeNotify = TRUE;
}


 //Fonction appelé par Pawn Anim
function OnPlayAnim( UTSeqAct_PlayAnim InAction )
{
if( FullBodyAnimSlot != None )
{
FullBodyAnimSlot.PlayCustomAnim(InAction.AnimName, 1.0, 0.2, 0.2, InAction.bLooping, true);
Mesh.RootMotionMode = RMM_Translate;
FullBodyAnimSlot.SetRootBoneAxisOption(2, 2, 0);
}
}


Ça doit paraître très simple pour quiconque s'y connais un minimum en UnrealScript mais bon... j'apprendrait un jour :P

Personnaliser le pawn

La première étape a été de remplacer Cathode de UDK par notre modèle dans le pawn.
Ici Jocelyn (professeur de UDK au Centre NAD) m'a aider en me fournissant les script nécessaires à la création d'un nouveau Game Type.

(pour ceux que ça intéresse : ici http://www.lostsystem.com/UDKLibrary.html ces tuto expliquent comment faire)

Je laisse le dossier NADA11 dans le partage temporaire\Contrainte1. Copiez le dans C:\UDK\UDK-2011-11\Development\Src.

Dans les Default Properties du nouveau Pawn (NADPawn) on peut indiqué quel mesh on veut et les anim tree, physic asset et anim set qui lui correspondent :


Tip : Pour être sur d'avoir le bon nom à mettre dans le script, ouvrez votre pakage dans le content browser, right clikez sur l'anim tree (mesh, anim set, etc) et choisissez Copy full name to Clipboard. CtrlV dans le NADPawn.uc au bon endroit ;)



Une dernière chose : pour que l'engin recompile les nouveau scripts allez dans C:\UDK\UDK-2011-11\UDKGame\Config et trouvez DefaultEngine.ini. Dans ce fichier ajouter cette ligne : 


Un level jouable =D

Salut,
Ca fait déjà une semaine depuis mon dernier post... Ya eu pas mal de changement depuis !
J'ai passé plusieurs jours à fouiller dans un paquet de choses que je ne connaissais pas pour rendre notre chase un peu plus interactive.

Résultat des courses : j'ai un niveau dans lequel le joueur peut courir ou il veut avec le bon personnage. Quand il rencontre un obstacle il a un certain temps pour appuyer sur le bon input pour le franchir sinon il fail. Ici on a plusieurs solutions : soit on garde un fail commun a tous les obstacles et c’est game over si tu rates, soit on peut faire des fail perso a chaque obstacles avec des anim beaucoup plus longues que le saut réussi, et le game over n'arrive que si le voleur arrive au bout avant toi (beaucoup plus de travail !). Tant que j'y suis : vu que now le joueur contrôle la course ça devient très intéressant de faire des anim de sidestep... Mais tout ça c'est si ça nous tente et si on a le temps car la base est là.

Dans les prochains posts j'expliquerais comment j'ai procédé et montrerais ce que ça donne.

Autre nouveauté : Agustin a fini ses mesh low poly. Nous allons donc pouvoir les skinné et ajuster nos anim si besoin est.

vendredi 20 janvier 2012

Quicktime event in kismet

Okay une solution un peu cheap mais qui marcherais pour que le joueur ait quelque chose a faire : le level pourrait être un quicktime event tout du long. Je viens de tester ça dans le niveau de Viro et ça marche.

Ce que ça fait :
- le perso part a courir
- le message : PRESS E ! apparait
- si le joueur appui E dans la demi seconde qui suit le perso saute par dessus la boite
- si non la fail anim joue et le level recommence après 3 sec


Ce que j'ai fait : 
- je suis partie de la base montrée dans le post précédent
- j'ai modifié le premier matinée pour remplacer le jump par le fail et j'ai coché rewind on play pour qu'il puisse rejouer si jamais le joueur n'appuie pas E
- j'ai créer un Event track key dans ce même matinée au moment ou je veux que le joueur appui E (cela rajoute un output au matinée)
- dans cet output j'ai placé : 
  •  un log qui affiche PRESS E !
  •  deux toggles avec un delais de 0.5 sec entre chaque pour rendre un Bool True pendant ce laps de            temps
  •  un Key Pressed event qui vérifie que le joueur a bien appuyé sur E dans le temps alloué (grace au Bool)
- j'ai créé un nouveau matinée avec juste le jump et jai coché Rewind on Play et No Reset on Rewind pour que le personnage fasse son anim de saut au bon endroit (la place ou il se trouve quand le joueur appui E)



Ça crée un petit snap après le saut quand on change de modèle par contre... C'est pas une solution idéale mais ça marche. 

On veut un démo... jouable ?

J'ai fait quelques recherches pour trouver une solution pour rentre notre poursuite jouable... Sans grand succès malheureusement =(
Par mal de tête a essayer de comprendre du unrealscript j'ai fais une pose pour tester mes anim juste avec Kismet et Matinee (le voleur sera fait de cette facon dans tous les cas).

J'ai utilisé la méthode expliqué ici :

Quand on rajoute un saut (surtout un saut qui dépose les mains sur un objet) au idle et au run, cette méthode n'est pas tout à fait suffisante :
- suivez cette vidéo pour blend idle au run
- exportez le saut en décochant le 'in place mode' dans max
- blendez le saut de la même facon que dans la vidéo
- faite disparaître le skeletal mesh MAT un fois l'anim complété
- faite apparaître un autre skeletal mesh MAT (hidden depuis le début) placé à l'emplacement ou l'autre a disparut
- continuez l'anim dans un autre matinée avec ce nouveau skeletal mesh MAT jusqu'au prochain saut


J'ai donc commencé à faire courir mes anim dans le greybox du niveau de Viro. Je ne sais pas comment enregistrer une vidéo du résultat donc en voila quelques screenshots. 

A noté que c'est vraiment long :s Et que chaque animateur devra le faire dans chaque niveau (car nos anim ne vont pas exactement à la même vitesse). Je pourrais quand même fournir la structure kismet une fois terminée pour le level de Viro mais il restera aux autres anim beaucoup d'arrangements à faire pour le rendre compatible à leur propre set d'animation. 

jeudi 19 janvier 2012

Anim Tree

Une petite suite de tuto sur les anim trees...
http://udkc.info/index.php?title=Tutorials:Wraiyth%27s_AnimTree_crash_course
Might be helpful.

Fail

Idle

Importation dans UDK et anim set

Il me reste encore 3 anim à faire : le idle, le fail et la mini cut scene finale.
Toutes fois j'ai cru bon de tester l'import dans UDK avec celle que j'ai déjà. Cette étape est pas mal facile :)

Attention : si comme moi votre import fail vérifiez que tout ce que vous exportez de Max est dans le layer Default. Pour moi ça à régler le problème.

UDK m'envoie tout le temps une autre erreur mais qui n'as pas l'air de poser de problème pour le moment :

J'ai créer mon anim set. Je vais commencer le blocking de mes dernières anim en attendant que Mishka ou Youssef me montre comment faire un anim tree (ayant assumé le rôle de LD la session passée je n'ai pas appris à en faire encore)

mardi 17 janvier 2012

Slide !

Premiere passe pour le slide.

Ref (on en a jamais assez) et débuts dans 3Ds Max

C'est toujours quand on a fini d'en prendre qu'on se rend compte qu'il nous en faudrait d'autres. Dimanche j'ai tourner quelques autres refs et j'en ferais surement d'autres : même si je suis pour pas les suivre finalement c'est toujours bon d'étudier le mouvement sur plusieurs différentes pour mieux être capable de faire des changement qui font du sens une fois rendu en 3D.

Bref a un moment donné faut quand même commencer à animer.
J'ai commencé par le run cycle car c'est lui le plus important : on va le voir très souvent et il me servira de base pour les autres anim. Je l'ai laisser très blocky, il mériterais que je passe encore quelques heures dessus mais je voulais avoir le plus vite possible un petit set d'anim pour les tester dans UDK avant de les raffiner de trop. Voilà ce que ça donne.


Je suis ensuite passé au jump médium (avec la main) et au jump normal. Je commence et fini mes anim par la même pose : celle de la course, comme ça les anim blendront mieux. Je sauvegarde l'animation du run dans un .bip et a chaque nouvelle anim que je fait je commence par loader cet anim dessus pour partir exactement de la bonne position. J'ai passer un peu plus de temps sur ces deux anim, elles sont pas mal plus smooth, il faudra les finir mais pour l'instant je peux passer à celles qui me manquent.


Pour le jump normal je voulais le faire trébuché sur la fin. Il le fait un peu, pas autant que je voudrais mais pour le faire comme je veux il faudrait rajouter deux pas à l'anim. Ça fait un peu long (en distance parcourue). J’espère avoir le temps d'en faire une ou il trébuche plus plus tard et je verrais si elle rentre dans les levels des LA. Mais pour l'instant il me reste beaucoup d'anim requises à faire et c’est important de travailler selon l'ordre de priorité.

Petite note : important de montrer son travail à beaucoup de personnes différentes même s'il n'est pas encore final. A chaque critique il devient meilleur (est ce qu'on sens bien le poids du personnage ? Est ce que   le timing fait du sens ? Les poses clés peuvent elles être rendues plus intéressante?, etc)

samedi 14 janvier 2012

Qui est il et que fait il ?

Avant de commencer dans 3Ds Max ma première étape est de réfléchir à qui est le personnage. Même si dans ce cas si les anim devront être appliquées a deux perso différents (le voleur et le volé) j'ai décidé de leur donner une petite personnalité.

Je n'avais pas envie d'animer des mouvement de gymnaste, très contrôles, très calculés. Je veux leur donner une attitude qui montre que ce sont quand même des gens dans la moyenne (un peu maladroits, pas 100% confiants en leur sauts etc, même si monsieur tout le monde ne saute pas forcément par dessus les clôtures). Pour se faire je pense a des mouvements tel que trébucher un peu après un saut, des mouvement de bras pas très efficaces pendant la course...

Avec ces idées en tête on a filmer quelques références avec Mishka dans le salon étudiant Vendredi (merci Mishka et Viro :]). Certaine fit plus que d'autres avec ce que je veux, j'en referais pour ce qui me manque.

Je suis aussi allé regarder des vidéo de parkour sur Youtube. Bien souvent les gens qui en font sont trop sur d'eux pour que je puisse garder leur mouvement tel quel mais je m'en sert pour comprendre c'est quoi le mouvement et j'essaye d'imaginer ce que ça donnerais s'ils le faisait moins bien.


A partir de ces références je dessine mes thumbnails : cela me sert a planifier ce que je vais faire dans 3Ds Max et aussi à analyser plus les références (avant de faire cela j'avais tendances à partir directement dans le logiciel et à perdre beaucoup de temps a essayer des poses. Avec cette technique j'apprend un peu plus comment le mouvement est fait et je me donne une première idée de ce dont mon timing devrait avoir l'air)


Demain je compte filmer d'autres ref et j'espère avoir le temps de commencer à animer les bouts dont je suis le plus sure (run, hand jump, jump). 

jeudi 12 janvier 2012

Avant d'animer...

Nous nous sommes mis d'accord avec les animateurs sur le type de saut que l'on voulait faire et le type d'objets que cela implique pour les LA (hauteur et longueur ainsi que clearence).

mardi 10 janvier 2012

recherche d'inspiration

Premiere idée générale : ca me tente de faire des anim de gens pas trop athlétique, plus à la limite d'etre maladroit.
Je suis partie à la recherhe d'inspiration tel que LA Noire et Heavy Rain (meme si celui ci est plus un film qu'un jeu je pourrais y trouver de bonnes idées).

(enlever le son de la video heavy rain : c'est agacant d'entendre le type commenter sa partie)

C'est tout pour ce soir. J'irais chercher des ref de film itoo et jespere avoir le temps de passer au Y cette semaine, filmer des ref live ca serait encore plus pratique...

Première contrainte : ready, steady, ...

Début de session, premier cour, premier soir : atelier de simulation de production.
Le cour est pas encore commencé mais on aurait du déjà avoir commencer la première contrainte la semaine derniere :) Le but de l'exercice : créer les animations d'une petite séquense jouable de course poursuite. 7 ou 8 anim dont :
- une cource
- 2 ou 3 sauts
- un idle
- un slide
- un fail
- un anim de fin (le volé attrape le voleur)
Le tout intégré dans UDK.
Oh et 4 semaines pour tout ca.
Je suppose que ya plus grand temps a perdre dans ce cas, let's begin.