Get the Mytodolist Free Android app from SlideME.

lundi 16 juin 2014

7/ Comment ajouter une animation dans JMonkey



          Ce tutoriel montre comment ajouter un contrôleur et des canaux d'animation, et comment répondre à aux entrées de l'utilisateur en déclenchant une animation dans un modèle chargé.




Pour utiliser les exemples des actifs dans un nouveau projet du moteur jmonkeyengine SDK, clique-droit sur votre projet, sélectionnez "Properties", aller à "Libraries", appuyez sur "Add Library" et ajouter la bibliothèque "jme3-test-données".


Code d'exemples

package jme3test.helloworld;
 
import com.jme3.animation.AnimChannel;
import com.jme3.animation.AnimControl;
import com.jme3.animation.AnimEventListener;
import com.jme3.animation.LoopMode;
import com.jme3.app.SimpleApplication;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
 
/** Sample 7 - how to load an OgreXML model and play an animation,
 * using channels, a controller, and an AnimEventListener. */
public class HelloAnimation extends SimpleApplication
  implements AnimEventListener {
  private AnimChannel channel;
  private AnimControl control;
  Node player;
  public static void main(String[] args) {
    HelloAnimation app = new HelloAnimation();
    app.start();
  }
 
  @Override
  public void simpleInitApp() {
    viewPort.setBackgroundColor(ColorRGBA.LightGray);
    initKeys();
    DirectionalLight dl = new DirectionalLight();
    dl.setDirection(new Vector3f(-0.1f, -1f, -1).normalizeLocal());
    rootNode.addLight(dl);
    player = (Node) assetManager.loadModel("Models/Oto/Oto.mesh.xml");
    player.setLocalScale(0.5f);
    rootNode.attachChild(player);
    control = player.getControl(AnimControl.class);
    control.addListener(this);
    channel = control.createChannel();
    channel.setAnim("stand");
  }
 
  public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName) {
    if (animName.equals("Walk")) {
      channel.setAnim("stand", 0.50f);
      channel.setLoopMode(LoopMode.DontLoop);
      channel.setSpeed(1f);
    }
  }
 
  public void onAnimChange(AnimControl control, AnimChannel channel, String animName) {
    // unused
  }
 
  /** Custom Keybinding: Map named actions to inputs. */
  private void initKeys() {
    inputManager.addMapping("Walk", new KeyTrigger(KeyInput.KEY_SPACE));
    inputManager.addListener(actionListener, "Walk")

Création et chargement de modèles animés 


On peut créer des modèles d'animation avec un outil tel que Blender. Prenez le temps de l' apprendre et de créer vos propres modèles dans Blender Animation Tutorials.  Pour l'instant, téléchargez et utilisez un modèle gratuit, comme celui inclus ici à titre d'exemple (Oto Golem, et Ninja). 


Le chargement d'un modèle d'animation est assez simple, comme vous l'avez appris dans les chapitres précédents. Les modèles d'animations d'Ogre viennent comme un ensemble de fichiers: Le modèle est dans Oto.mesh.xml, et les détails d'animation sont dans Oto.skeleton.xml, ainsi que les fichiers habituels pour les matériaux et les textures. Vérifiez que tous les fichiers du modèle sont dans le même sous-répertoire du modèle.



 public void simpleInitApp() {
    /* Displaying the model requires a light source */
    DirectionalLight dl = new DirectionalLight();
    dl.setDirection(new Vector3f(-0.1f, -1f, -1).normalizeLocal());
    rootNode.addLight(dl);
    /* load and attach the model as usual */
    player = assetManager.loadModel("Models/Oto/Oto.mesh.xml");
    player.setLocalScale(0.5f); // resize
    rootNode.attachChild(player);
    ...
    }
Ne pas oublier d'ajouter une source de lumière pour rendre la matière visible. 



Controlleur et canaux d'animations

Après avoir chargé le modèle animé, vous vous inscrivez aux contrôleurs d'animations. 


  • L'objet contrôleur vous donne accès à des séquences d'animation disponibles. 
  • Le contrôleur peut avoir plusieurs canaux, chaque canal peut exécuter une séquence d'animation à la fois. 
  • Pour exécuter plusieurs séquences, il faut créer plusieurs canaux, et définir chacune de ces canaux à leur animation.




  private AnimChannel channel;
  private AnimControl control;
 
  public void simpleInitApp() {
    ...
    /* Load the animation controls, listen to animation events,
     * create an animation channel, and bring the model in its default position.  */
    control = player.getControl(AnimControl.class); 
    control.addListener(this);
    channel = control.createChannel();
    channel.setAnim("stand");
    ...

Réponse à des événements d'animations 



Ajouter implements AnimEventListener à la déclaration de classe. Cette interface vous permet d'accéder aux événements qui vous avertissent quand une séquence est terminée, ou lorsque vous passez d'une séquence à l'autre, afin que vous puissiez y répondre. Dans cet exemple, vous rétablissez le personnage à la position "stand" après un cycle de "Walk" .


public class HelloAnimation extends SimpleApplication
                         implements AnimEventListener {
  ...
 
  public void onAnimCycleDone(AnimControl control, 
                              AnimChannel channel, String animName) {
    if (animName.equals("Walk")) {
      channel.setAnim("stand", 0.50f);
      channel.setLoopMode(LoopMode.DontLoop);
      channel.setSpeed(1f);
    }
  }
  public void onAnimChange(AnimControl control, AnimChannel channel, String animName) {
    // unused
  }

Déclenchement d'animations après une entrée clavier utilisateur 


Il ya des animations ambiantes comme des animaux ou des arbres que vous pouvez être amené à déclencher dans la boucle principale. Dans d'autres cas, les animations sont déclenchées par interaction de l'utilisateur, tel que l'entrée de clé. Vous voulez jouer l'animation de marche lorsque le joueur appuie sur une certaine touche (ici la barre d'espace), pour que l'avatar exécute l'action "Walk" et change en même temps d'emplacement. 


  • Initialiser un nouveau contrôleur d'entrée (dans simpleInitApp ()). 
    • Ecrire la méthode pratique initKey () et appeler à partir simpleInitApp (). 
  • Ajouter une cartographie de clés avec le nom de l'action que vous souhaitez déclencher. 
    • Ici par exemple, vous mappez "Walk" pour la touche Espace. 
  • Ajouter un écouteur d'entrée pour l'action de "Walk".





 private void initKeys() {
    inputManager.addMapping("Walk", new KeyTrigger(KeyInput.KEY_SPACE));
    inputManager.addListener(actionListener, "Walk");
  }
Pour utiliser le contrôleur d'entrée, vous avez besoin d'implémenter l'actionListener en testant chaque action par leur nom, puis réglez le canal de l'animation correspondante pour aller plus vite. 


  • Le second paramètre de setAnim () est la blendTime (combien de temps l'animation actuelle devrait se chevaucher avec le dernier). 
  • LoopMode peut être en boucle (répétition), cycle (avant puis en arrière), et DontLoop (une seule fois). 
  • Si nécessaire, utilisez channel.setSpeed ​​() pour régler la vitesse de cette animation. 
  • Eventuellement, utiliser channel.setTime () pour avancer ou revenir en arrière à un certain moment dans le temps de cette animation.




 private ActionListener actionListener = new ActionListener() {
    public void onAction(String name, boolean keyPressed, float tpf) {
        if (name.equals("Walk") && !keyPressed) {
            if (!channel.getAnimationName().equals("Walk")){
                channel.setAnim("Walk", 0.50f);
                channel.setLoopMode(LoopMode.Cycle);
            }
        }
    }
  };




<< Précédent                                         Sommaire                              Suivant >>











Aucun commentaire:

Enregistrer un commentaire