Forums Développement Multimédia

Aller au contenu

- - - - -

Piloter les animations d'un dae

CODE Actionscript

13 réponses à ce sujet

#1 Grouuu

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 138 messages

Posté 28 June 2012 - 14:25 PM

Bonjour,

Dans le cadre d'une démo technique, je souhaite faire un mini jeu avec Minko 2.

Mon premier test est de voir si on peut charger un dae contenant une animation, puis de jouer certaines portions de cette animation selon les interactions du joueur.

Il me semble que dans le jeu Mirage ce principe est utilisé.

Et c'est à ce moment là que ça a commencé à partir en sucette.

Je compile l'exemple AstroBoy, ça s'anime. Je teste avec un autre dae, ça marche pas. Hummm, je fouine, je vois que C4D n'exporte pas les input INTERPOLATION. Je passe par Blender, c'est bon, j'ai mes input, mais ça ne s'anime pas... Bon, je regarde en parallèle si je vois comment on peut faire pour piloter les animations. TimeLabel avec AnimationGroup, ha non mince, c'est du Minko 1. J'ai des classes avec des noms alléchants, mais comment les utiliser, et cibler mon modèle ?

Donc je ne suis qu'un hamster qui tourne dans sa roue.

Donc, comment vous faites pour avoir un modèle 3D sur votre scène, dont les animations conçues depuis le soft 3D puissent être changées au runtime ?

Avec quel soft 3D vous exportez votre modèle (et avec quels paramètres) ?

Pendant ce temps là, je vais envisager les solutions les plus sales et improbables.

Merci à vous !

[EDIT] : yeah, la doc est dispo, ça va m'aider ! :D

#2 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 04 July 2012 - 20:41 PM

Je pense que l'exemple ci-dessous t'aideras :


animationController.labels.push(
  new TimeLabel("idleStart", 30),
  new TimeLabel("idleEnd", 1900),
  new TimeLabel("rightStart", 2100),
  new TimeLabel("rightEnd", 2700),
  new TimeLabel("leftStart", 3100),
  new TimeLabel("leftEnd", 3700),
  new TimeLabel("jumpToStandStart", 4000),
  new TimeLabel("jumpToStandEnd", 6050),
  new TimeLabel("failStart", 6100),
  new TimeLabel("failEnd", 7700),
  new TimeLabel("winStart", 7700),
  new TimeLabel("winEnd", 9300),
  new TimeLabel("jumpToSitStart", 9450),
  new TimeLabel("jumpToSitEnd", 10800),
  new TimeLabel("loseSittingStart", 11200),
  new TimeLabel("loseSittingEnd", 13125),
  new TimeLabel("winSittingStart", 13125),
  new TimeLabel("winSittinEnd", 15050)
);

// joue l'animation entre "idleStart", et "idleEnd");
// equivalent à "[color=#000000][size=3]animationController.setPlaybackWindow(30, 1900)", mais plus lisible ![/size][/color]
[color=#000000][size=3]animationController.setPlaybackWindow("idleStart", "idleEnd");[/size][/color]
[color=#000000][size=3]animationController.goToAndPlay("idleStart");[/size][/color]
 


#3 Grouuu

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 138 messages

Posté 05 July 2012 - 17:49 PM

Merci !

Je vais tester ça dès que possible.

#4 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 12 July 2012 - 10:39 AM

Alors ? :)

#5 Grouuu

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 138 messages

Posté 13 July 2012 - 10:00 AM

Je n'ai guère eu le temps de tester, j'ai du reprendre un autre projet entre temps, mais j'ai quand même pu mettre en place le controller correctement (je crois).

Je pars d'un de tes exemples (Astroboy), et je teste avec le dae fourni avec, et avec un autre dae qui contient lui aussi une animation (démo pour Papervision il me semble) :


override protected function initializeScene() : void
  {
   super.initializeScene();
 
   cameraController.distance = 0.5;
   cameraController.distanceStep = 0.02;
   cameraController.lookAt.set(0, 0.05, 0);
 
   var options : ParserOptions  = new ParserOptions();
 
   options.parser        = ColladaParser;
   options.loadDependencies  = true;
   options.mipmapTextures   = true;
   options.dependencyLoaderClosure = loadDependency;
 
   var sceneLoader:SceneLoader = scene.loadClass(DAE, options) as SceneLoader;
 
   var group:Group = sceneLoader.data as Group;
 
   var timelines:Vector.<ITimeline> = new Vector.<ITimeline>();
 
   var animationController:AnimationController = new AnimationController(timelines, false);
 
   group.addController(animationController);
 
   animationController.labels.push(
        new TimeLabel("truc", 30),
        new TimeLabel("machin", 500)
   );
 
   animationController.setPlaybackWindow("truc", "machin");
 
   animationController.gotoAndPlay("truc");
  }
 

Et j'ai pour le dae d'origine l'animation qui boucle à l'infini (qui ne devrait plus boucler), et pour l'autre aucune animation (qui devrait bouger le bougre).

J'ai tracé dans AnimationController.sceneEnterFrameHandler, dans le premier cas, numTimelines vaut 1, dans le second test il vaut 0.

J'ai pas eu le temps de faire des petits tests afin de mieux comprendre le fonctionnement global du Minko comme je devais valider ce point rapidement pour validation, donc je me fourvoie sûrement sur l'utilisation de la timeline par exemple, et j’attends aussi le retour de notre pro 3D pour checker les propriétés des dae.

Dès que j'ai enfin plus de dispo, je regarde ça plus intensivement !

Fichier(s) joint(s)

  • Fichier joint  example.rar   1.36 Mo   100 téléchargement(s)


#6 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 14 July 2012 - 10:52 AM

Une timeline c'est - en gros - un truc qui va faire varier une propriété en fonction du temps.
Tu peux regarder l'AnimationControllerExample pour mieux comprendre :

https://github.com/a...ollerExample.as

#7 Grouuu

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 138 messages

Posté 20 July 2012 - 17:12 PM

Je viens de tester, je comprend mieux ce que tu veux dire.

Mais on travaille sur des animations que l'on définit dans flash si j'ai bien compris. Or, dans l'exemple d'Astroboy, le fichier dae contient déjà une animation créée dans le soft 3D. On voit qu'elle se lance seule, et qu'elle se joue en boucle.

C'est cette animation "native" que j'aimerais piloter, la jouer un certain moment, boucler sur une portion, etc. Pour un modèle complexe, comme un personnage, c'est la méthode qui me paraissait la plus simple pour changer ses attitudes selon le contexte de jeu.

Dites moi si je me fourvoie déjà sur ce point !

#8 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 24 July 2012 - 00:35 AM

Citation

C'est cette animation "native" que j'aimerais piloter, la jouer un certain moment, boucler sur une portion, etc. Pour un modèle complexe, comme un personnage, c'est la méthode qui me paraissait la plus simple pour changer ses attitudes selon le contexte de jeu.

Il n'y a qu'une seule manière de faire des animations et de les piloter : l'AnimationController. Les animations chargées depuis les DAE utilisent cette même API et tu contrôles donc des animations procédurales de la même manière que les animations faites par un graphiste. Au demeurant, c'est tout à fait logique puisque charger les animations ça revient juste à - procéduralement - créer les timelines/AnimationController correspondants.

#9 Grouuu

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 138 messages

Posté 24 July 2012 - 16:49 PM

Ha ok !

Donc quand le DAE est parsé, une timeline est créée ainsi qu'un AnimationController, c'est bien ça ?

Comment est-ce que je récupère la référence à ce controller (ou à la timeline) ? Quand je teste les controllers présents, sur le mesh je ne trouve qu'un SkinningController.

#10 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 24 July 2012 - 22:52 PM

Citation

Donc quand le DAE est parsé, une timeline est créée ainsi qu'un AnimationController, c'est bien ça ?
Il y'a un AnimationController (avec normalement une timeline) par joint.

Citation

Quand je teste les controllers présents, sur le mesh je ne trouve qu'un SkinningController.
Le SkinningController a pour rôle de sérialiser les matrices lues depuis le squelette qui est dans la scène.
En gros à chaque frame, les AnimationController font leur travail pour mettre à jour le squelette puis le SkinningController récupère les matrices à jour pour les sérialiser dans le but de les utiliser sur le GPU.

Cette méthode a un gros avantage : comme le squelette est dans la scène, on peut y injecter des objets.
Exemple : ajouter un objet dans le poignet d'Astroboy:

astroboy.get("//group[name='astroBoy_newSkeleton_L_wrist']").addChild(yourMesh);

Et ça c'est vraiment super ! Par contre ça a un certain prix côté performances évidemment. On cherche des moyens d'avoir un mode sans le squelette dans la scène pour gagner un peu en perf. On essaie aussi d'optimiser la sérialisation des constantes des shaders.

Pour avoir les meilleures perf, le mieux c'est d'utiliser du morphing - au lieu du skinning - qui lui est pratiquement gratuit en CPU/GPU.

#11 Grouuu

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 138 messages

Posté 25 July 2012 - 09:27 AM

Hourra, ça marche !


var sceneLoader:SceneLoader = scene.loadClass(DAE, options) as SceneLoader;
 
   var group:Group = sceneLoader.data as Group;
   var skin:SkinningController;
   var animation:AnimationController;
 
   for each(var m:Mesh in group.getDescendantsByType(Mesh))
   {
    skin = m.getController(0) as SkinningController;
   
    for each(var joint:Group in skin.joints)
    {
         if (joint.getControllersByType(AnimationController).length > 0)
         {
          animation = joint.getControllersByType(AnimationController)[0] as AnimationController;
         
          animation.labels.push(
           new TimeLabel("start", 50),
           new TimeLabel("end", 500)
          );
         
          animation.setPlaybackWindow("start", "end");
         
          animation.gotoAndPlay("start");
         }
    }
   }
 

Merci de ta patience et de tes explications ! :D

#12 Grouuu

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 138 messages

Posté 25 July 2012 - 10:28 AM

Ce point résolu, j'ai toujours par contre le problème avec mes DAE (ils ne génèrent pas de timeline comme le tien).

Le model pour l'exemple AstroBoy avec qui j'ai fait le test ci-dessus, tu l'as réalisé sous quel soft 3D ?

[EDIT] : ha, je viens de retrouver les sources du model, et j'ai eu ma réponse (3DsMax).

#13 Seraf_NSS

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3868 messages

Posté 20 March 2013 - 15:48 PM

Salut

donc en gros on crée un animationController pour chaque bone
on lui set toutes les anims
et pour jouer une animation il faut dire a toutes les animationController de se jouer?

y'a pas moyen de faire ca en une fois, genre avec un AnimationGroup :

public class AnimationGroup
{
  private var anims:Vector.<AnimationController>;
  public function AnimationGroup()
  {
   anims=new Vector.<AnimationController>();
  }
 
  public function pushAnimation(animationCtrl:AnimationController):void
  {
   anims.push(animationCtrl);
  }
 
  public function pushLabels(...rest):void
  {
 
   var l:int=anims.length,l2:int;
 
   while(l--){
    l2=rest.length;
    while(l2--)anims[l].labels.push(rest[l2]);
   }
  }
 
  public function setPlaybackWindow(beginTime : Object = null,
                    endTime : Object = null):void
  {
   var l:int=anims.length;
   while(l--){
    anims[l].setPlaybackWindow(beginTime,endTime);
   }
 
  }
 
  public function play():void
  {

   var l:int=anims.length;
   while(l--){
    anims[l].play();
   }
  }
 
ca fonctionne avec ma classe mais ca m'etonne que ce ne soit pas implementé dans minko

#14 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 18 April 2013 - 16:08 PM

Salut et merci pour ta suggestion :)
Une classe similaire sera intégrée dans la prochaine update de Minko!



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)