Get the Mytodolist Free Android app from SlideME.

lundi 29 avril 2013

3/ Charger des modèles 3D et du texte avec Assets ( actifs ).


                Dans ce tutoriel, nous allons apprendre à charger des modèles 3D et des textes dans le graphe de scène, en utilisant le gestionnaire d'actifs JME. Vous apprendrez également comment déterminer les chemins corrects, et les formats de fichiers à utiliser.

                   
                 Pour obtenir les actifs (modèles 3D) utilisées dans cet exemple, ajoutez  jme3-test-data.jar à votre classpath. Dans un projet créé avec le moteur jmonkeyengine SDK (recommandé), il faut juste faire un clic droit sur votre projet, choisir "Properties", aller dans "Libraries", appuyer sur "Add Library" et ajouter la bibliothèque préconfigurée "jme3-test-data".


Exemple de code




package jme3test.helloworld;
 
import com.jme3.app.SimpleApplication;
import com.jme3.font.BitmapText;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box;
 
/** Exemple 3 - comment charger un modèle OBJ, et le modèle ogrexml,
  * Un matériau / texture ou texte. */
public class HelloAssets extends SimpleApplication {
 
    public static void main(String[] args) {
        HelloAssets app = new HelloAssets();
        app.start();
    }
 
    @Override
    public void simpleInitApp() {
 
        Spatial teapot = assetManager.loadModel("Models/Teapot/Teapot.obj");
        Material mat_default = new Material( 
            assetManager, "Common/MatDefs/Misc/ShowNormals.j3md");
        teapot.setMaterial(mat_default);
        rootNode.attachChild(teapot);
 
        // Création d'un mur avec une simple texture de test_data
        Box box = new Box(Vector3f.ZERO, 2.5f,2.5f,1.0f);
        Spatial wall = new Geometry("Box", box );
        Material mat_brick = new Material( 
            assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat_brick.setTexture("ColorMap", 
            assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));
        wall.setMaterial(mat_brick);
        wall.setLocalTranslation(2.0f,-2.5f,0.0f);
        rootNode.attachChild(wall);
 
       // Affiche une ligne de texte avec une police par défaut
        guiNode.detachAllChildren();
        guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
        BitmapText helloText = new BitmapText(guiFont, false);
        helloText.setSize(guiFont.getCharSet().getRenderedSize());
        helloText.setText("Hello World");
        helloText.setLocalTranslation(300, helloText.getLineHeight(), 0);
        guiNode.attachChild(helloText);
 
        // Charge un modèle de test_data (ogrexml + matériel + texture)
        Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");
        ninja.scale(0.05f, 0.05f, 0.05f);
        ninja.rotate(0.0f, -3.0f, 0.0f);
        ninja.setLocalTranslation(0.0f, -5.0f, -2.0f);
        rootNode.attachChild(ninja);
        // Vous devez ajouter une lumière pour rendre le modèle visible
        DirectionalLight sun = new DirectionalLight();
        sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f));
        rootNode.addLight(sun);
 
    }
}


           Exécuter l'exemple de code (en faisant après un build ). Vous devriez voir un Ninja vert avec une théière colorée debout derrière un mur. Le texte sur l'écran devrait dire "Hello world".

Utilisation des Assets

L'Asset Manager



            Par des actifs de jeu c'est à dire tous les fichiers multimédias, tels que des modèles, des matériaux, des textures, des scènes entières, des shaders personnalisés, des fichiers musicaux et sonores, et des polices personnalisées JME3 est livré avec un objet AssetManager pratique qui vous permet d'accéder à vos actifs. Le AssetManager peut charger des fichiers à partir de:

  • le chemin de classe actuelle (le plus haut niveau de votre répertoire de projet),
  • le répertoire actif de votre projet, et
  • Les chemins personnalisés que vous vous inscrivez.

Ce qui suit est la structure  recommandée du répertoire pour stocker des éléments dans votre projet:

MyGame/assets/Interface/
MyGame/assets/MatDefs/
MyGame/assets/Materials/
MyGame/assets/Models/
MyGame/assets/Scenes/
MyGame/assets/Shaders/
MyGame/assets/Sounds/
MyGame/assets/Textures/
MyGame/build.xml            <-- Ant build script
MyGame/src/...              <-- Java sources go here
MyGame/...

        Ceci est juste une meilleure pratique suggérée, et c'est ce que vous obtenez par défaut lorsque vous créez un nouveau projet Java dans le SDK jMokeyEngine. Vous pouvez créer un répertoire des actifs (ou asset ) et nommer les sous-répertoires comme vous le voulez.

Chargement Textures

               Placez vos textures dans un sous-répertoire de  assets/Textures/. Chargez la texture dans le matériel avant de définir le matériel. L'exemple de code suivant est tiré de la méthode simpleInitApp() et charge un modèle de paroi simple:

// Création d'un mur avec une simple texture de test_data
Box box = new Box(Vector3f.ZERO, 2.5f,2.5f,1.0f);
Spatial wall = new Geometry("Box", box );
Material mat_brick = new Material( 
    assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat_brick.setTexture("ColorMap", 
    assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));
wall.setMaterial(mat_brick);
wall.setLocalTranslation(2.0f,-2.5f,0.0f);
rootNode.attachChild(wall);

                  Dans ce cas, vous créez votre propre matériel et l'appliquer à une géométrie. (on y reviendra plus en détail plus tard) Vos matériels se base sur les descriptions de matériaux par défaut (tels que "Unshaded.j3md"), comme le montre cet exemple.



Chargement texte et des polices


         Cet exemple affiche le texte "Hello world" dans la police par défaut sur ​​le bord inférieur de la fenêtre. Vous attachez le texte à la guiNode - c'est un nœud spécial pour éléments d'affichage plats (orthogonal). Vous affichez le texte pour montrer le score du jeu, la santé joueur, etc L'échantillon de code suivant va dans la méthode simpleInitApp ().

// Affiche une ligne de texte avec une police par défaut
guiNode.detachAllChildren();
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
BitmapText helloText = new BitmapText(guiFont, false);
helloText.setSize(guiFont.getCharSet().getRenderedSize());
helloText.setText("Hello World");
helloText.setLocalTranslation(300, helloText.getLineHeight(), 0);
guiNode.attachChild(helloText);

Astuce: Effacer le texte existant dans le guiNode en détachant tous ses enfants.

Chargement d'un modèle

             Exporter votre modèle 3D au format ogrexml (. Mesh.xml. Scène. Matériau. Skeleton.xml) et le placer dans un sous-répertoire de assets/Models/  L'échantillon de code suivant va dans la méthode simpleInitApp ().

// Charge un modèle de test_data (ogrexml + matériel + texture)
Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");
ninja.scale(0.05f, 0.05f, 0.05f);
ninja.rotate(0.0f, -3.0f, 0.0f);
ninja.setLocalTranslation(0.0f, -5.0f, -2.0f);
rootNode.attachChild(ninja);
// Vous devez ajouter une lumière directionnelle pour rendre le modèle visible!
DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f).normalizeLocal());
rootNode.addLight(sun);


               Notez que vous n'avez pas besoin de créer un matériel si vous avez exporté le modèle avec le matériel. N'oubliez pas d'ajouter une source de lumière, sinon le matériel (et l'ensemble du modèle) sera invisible!

Chargement actifs des chemins personnalisés

             Que faire si votre jeu reposant sur des fichiers de modèle fourni par un utilisateur, ne sont pas inclus dans la distribution? Si un fichier ne se trouve pas dans l'emplacement par défaut (par exemple, le répertoire des assets ), vous pouvez enregistrer un Localisateur personnalisé et le charger à partir de n'importe quel chemin.

            Voici un exemple d'utilisation d'un ZipLocator qui est sauvegarder dans le fichier town.zip  à la racine de votre répertoire de projet:
assetManager.registerLocator("town.zip", ZipLocator.class);
    Spatial scene = assetManager.loadModel("main.scene");
    rootNode.attachChild(scene);

       Voici une HttpZipLocator qui permet de télécharger des modèles zippées et les charger:
 assetManager.registerLocator(
      "http://jmonkeyengine.googlecode.com/files/wildhouse.zip", 
      HttpZipLocator.class);
    Spatial scene = assetManager.loadModel("main.scene");
    rootNode.attachChild(scene);


JME3 offre ClasspathLocator, ZipLocator, FileLocator, HttpZipLocator et UrlLocator (voir com.jme3.asset.plugins).


Création de modèles et scènes



                  Pour créer des modèles 3D et des scènes, vous avez besoin d'un éditeur de Mesh 3D avec un plugin exportateur ogrexml. Par exemple, vous pouvez créer des modèles entièrement texturés avec Blender. Vous pouvez utiliser le SDK pour charger des modèles, convertir des modèles et créer des scènes d'eux.

            Si vous utilisez Blender, exporter vos modèles comme Ogre mesh XML avec des matériaux comme suit:


  • Ouvrez le menu Fichier> Exporter> Exporter ogrexml pour ouvrir la boîte de dialogue exportateur.
  • Dans le domaine des matériaux d'exportation: Donnez au matériel le même nom que le modèle. Par exemple, le  modèle quelquechose.mesh.xml va avec quelquechose.material, plus (en option) quelquechose.skeleton.xml et quelques fichiers de texture JPG.
  • Dans le domaine des maillages d'exportation: Sélectionner un sous-répertoire du répertoire /assets/models . Par exemple /assets/models/quelquechose /.
  • Activez les paramètres d'exportateurs suivants:
    • Copy Textures: YES
    • Rendering Materials: YES
    • Flip Axis: YES
    • Require Materials: YES
    • Skeleton name follows mesh: YES
  • Cliquez sur Export



Modèle Formats de fichiers

                    JME3 peut charger  les modèles XML Ogre  + matériaux, DotScenes ogre, ainsi que les modèles Wavefront OBJ + MTL. Le code loadModel () fonctionne avec ces fichiers lorsque vous exécutez le code directement à partir du SDK du moteur jmonkeyengine.

                Si vous construisez les exécutables utilisant le script de compilation par défaut, les fichiers de modèles originaux (XML, OBJ, etc) ne seront pas inclus. Lorsque vous lancez l'exécutable, vous obtenez un message d'erreur si vous essayez de charger directement les modèles:

com.jme3.asset.DesktopAssetManager loadAsset
WARNING: Cannot locate resource: Models/Ninja/Ninja.mesh.xml
com.jme3.app.Application handleError
SEVERE: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
java.lang.NullPointerException


                Le chargement des fichiers XML / obj est directement acceptable uniquement pendant la phase de développement. Si votre graphiste insère les fichiers mis à jour dans le répertoire asset, vous pouvez passer rapidement en revue la dernière version dans votre environnement de développement.

                   Pour les tests et pour la version finale construite, vous utilisez des fichiers .J3o exclusivement. J3o est un format binaire optimisé pour jME3 applications et les fichiers. J3o sont automatiquement inclus dans le fichier JAR distribuable par le script de compilation. Quand vous faites les builds de test d'assurance qualité ou êtes prêt à libérer, utiliser le SDK pour convertir tous les fichiers .obj / .scene / .xml / .blend  en fichier .J3o, et seulement charger les fichiers .J3o.

Ouvrez votre projet JME3 dans le SDK moteur jmonkeyengine.


  • Clique-droit sur un fichier .Blend, OBJ, ou un fichier mesh.xml dans la fenêtre des Projets et choisissez "convert to JME3 binary".
  • Le fichier j3o. Apparaît à côté du fichier. Mesh.xml et a le même nom.
  • Changer toutes les lignes contenant loadModel() en conséquence. Par exemple:


Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.j3o");


Si votre exécutable obtient une exception lors de l'exécution, assurez-vous que vous avez converti tous les modèles en fichier .J3o!


Chargement de modèles et scènes


TâchesSolutions!
Charger un model avec des matériauxUtilisez la méthode loadModel() du gestionnaire d'actif (asset ) et fixez l'espace dans le noeud racine.
Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.mesh.xml");
rootNode.attachChild(elephant);
Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.j3o");
rootNode.attachChild(elephant);
charger un model sans matérielSi vous avez un modèle sans matériel, vous devez lui donner un matériel pour le rendre visible.
Spatial teapot = assetManager.loadModel("Models/Teapot/Teapot.j3o");
Material mat = new Material(assetManager, "Common/MatDefs/Misc/ShowNormals.j3md"); //matériel par défaut
teapot.setMaterial(mat);
rootNode.attachChild(teapot);
charger une scèneVous chargez la scène comme si vous charger un model
Spatial scene = assetManager.loadModel("Scenes/town/main.scene");
rootNode.attachChild(scene);
Spatial scene = assetManager.loadModel("Scenes/town/main.j3o");
rootNode.attachChild(scene);



Excercise - Comment charger des ressources

Comme exercice, nous allons essayer différentes façons de charger une scène. Vous apprendrez comment charger la scène, directement ou à partir d'un fichier zip.


  •  Télécharger la scène town.zip .
  • (Facultatif :) Décompressez le fichier town.zip pour voir la structure de ogre dotScene : Vous obtenez un répertoire nommé Town. Il contient les fichiers XML, la texture, et un fichier appelé main.scene. (Ceci c'est juste pour votre information personnelle, vous n'avez pas besoin de faire quoi que ce soit avec elle.)
  • Placez le fichier town.zip dans le répertoire au niveau supérieur de votre projet JME3, comme ceci:


jMonkeyProjects/MyGameProject/assets/
jMonkeyProjects/MyGameProject/build.xml
jMonkeyProjects/MyGameProject/src/
jMonkeyProjects/MyGameProject/town.zip
...


Utilisez la méthode suivante pour charger des modèles à partir d'un fichier zip:


  • Vérifiez si town.zip se trouve dans le répertoire du projet.
  • Enregistrer un fichier de localisation de zip dans le répertoire de projet: Ajoutez le code suivant sous simpleInitApp () {


 assetManager.registerLocator("town.zip", ZipLocator.class);
    Spatial gameLevel = assetManager.loadModel("main.scene");
    gameLevel.setLocalTranslation(0, -5.2f, 0);
    gameLevel.setLocalScale(2);
    rootNode.attachChild(gameLevel);


              La méthode loadModel () recherche actuellement ce zip directement dans les fichiers à charger.
(Cela signifie qu'il ne faut pas écrire loadModel (town.zip / main.scene) ou autre similaire!)


  • Nettoyer, construire (clean and build) et exécuter le projet.
Vous devriez maintenant voir le Ninja + mur + théière debout dans une ville.
Astuce: Si vous enregistrez de nouveaux repères, assurez-vous que les noms de fichiers n'entrent pas en conflits: Ne pas citer toutes les scènes main.scene mais donner à chaque scène un nom unique.

Plus tôt dans ce tutoriel, vous avez chargé des scènes et des modèles à partir du répertoire asset. Il existe une façon plus courante et même recommander de charger les scènes et les modèles. Voici la procédure typique:


  • Supprimer le code que vous avez ajouté à l'exercice précédent.
  • Copiez le répertoire décompressé Town dans le répertoire assets/Scenes de votre projet.
  • Ajoutez le code suivant sous simpleInitApp () {


    Spatial gameLevel = assetManager.loadModel("Scenes/town/main.scene");
    gameLevel.setLocalTranslation(0, -5.2f, 0);
    gameLevel.setLocalScale(2);
    rootNode.attachChild(gameLevel);


Notez que le chemin est relatif aux répertoires assets/...


  • Nettoyer, construire (clean and build ) et exécuter le projet. Encore une fois, vous devriez voir le Ninja + mur + théière debout dans une ville.

Voici une troisième méthode vous devez le savoir, le chargement d'une scène / modèle à partir d'un fichier j3o.:


  • Supprimer le code de l'exercice précédent.
  • Si vous ne l'avez pas déjà fait, ouvrez le SDK et ouvrez le projet qui contient la classe HelloAsset.
  • Dans la fenêtre des projets, accédez au répertoire assets/Scenes/town 
  • Clique-droit sur le fichier main.scene et convertir la scène en fichier binaire: jMoneyPlatform génèrera le fichier main.j3o.

Ajoutez le code suivant sous simpleInitApp () {


    Spatial gameLevel = assetManager.loadModel("Scenes/town/main.j3o");
    gameLevel.setLocalTranslation(0, -5.2f, 0);
    gameLevel.setLocalScale(2);
    rootNode.attachChild(gameLevel);


Encore une fois, notez que le chemin est relatif aux répertoires asset/... 


  • Nettoyer, Construire et exécuter le projet (encore).

Encore une fois, vous devriez voir le Ninja + mur + théière debout dans une ville.





Conclusion

                      Maintenant, vous savez comment remplir le scénographe avec des formes et des modèles statiques, et comment construire des scènes. Vous avez appris comment charger les actifs (assets) en utilisant assetManager (gestionnaire des actifs) et vous avez vu que les chemins commencent par rapport au répertoire de votre projet. Une autre chose importante que vous avez apprise, c'est de convertir les modèles au format .j3o pour les JAR exécutables etc

Ajoutons quelques actions à la scène et continuons la semaine prochaine avec UpdateLoop (boucle de mise à jour)


<< Précédent                         Sommaire                             Suivant >>



2 commentaires:

  1. bon jour,
    Comment on peut charger un modèle à partir d'une base de données?

    RépondreSupprimer