Créez vos mesh Ogre sous Blender !

Si vous aimez le logiciel de modélisation 3D Blender, vous serez sans doute ravi de l’utiliser pour créer votre monde dans votre jeu utilisant le moteur Ogre.
La bonne nouvelle, c’est que c’est d’une simplicité impressionnante, je vais profiter de ce billet pour me faire un petit mémo sur comment faire, ainsi que comment utiliser la technique de l’UV mapping avec Blender (je débute avec la 3D, que ça soit en programmation ou modélisation).

L’exemple présenté ici sera fait sur un simple cube, que l’on va texturer, et intégrer dans un projet Ogre.

Installation du script d’exportation OGRE Meshes Exporter

Sous Ubuntu

Tout d’abord, vous aurez besoin du script d’exportation pour Ogre. Sous Ubuntu pour l’installer, il suffit de faire
sudo aptitude install blender-ogrexml

Sous une autre distribution

Si vous avez une autre distribution, voici comment installer le script.

  • Téléchargez OGRE Meshes Exporter
  • Copiez ogremeshesexporter.py et les sous-dossiers dans ~/.blender/scripts

Note : Vous devez aussi avoir python 2.6.4 installé pour que le script fonctionne.

Création du cube et UV mapping

– Ouvrez Blender, créez un cube dans une nouvelle scène.
– Déplacez votre curseur sur la limite supérieure de la zone de modélisation jusqu’à voire une double flèche. Clic droit, puis clic gauche sur Split Area, puis clic gauche pour valider.
– Maintenant, dans la nouvelle fenêtre créé, passez en mode UV/ImageEditor

UV Maping

– Retournez dans la vue 3D, passez en mode editing (touche tab), sélectionnez tout le cube

– Ensuite, faites U -> Unwrap (smart projection).
Smart projection est souvent la méthode de déroulement donnant les meilleurs résultats.

– Faites ensuite Image -> Open (Alt+O) et ouvrez une image de votre choix qui vous servira de texture. Vous pouvez en trouver dans le répertoire OGRE/media/materials/textures…
Une image apparait alors dans la partie de l’UV mapping. Normallement, les vues planes des faces du cubes devraient coincider avec la taille de l’image, si ce n’est pas le cas, sélectionnez toutes les faces dans la partie UV (touche A) puis redimensionnez les en utilisant la touche s.
On obtient

– Allez dans la vue 3D, et faites Alt+Z pour passer en mode texturé. Normalement vous devriez voir la texture.

– Il ne reste plus qu’à assigner un matériau au cube, et à exporter.
Ouvrez le panneau Shading (F5), puis créez un nouveau matériau.
Cliquez sur Tex Face.

Exportation

Faites Fichier->Exporter->Ogre Meshes.
Là, vous avez la fenêtre du bas qui se modifie. Cliquez sur « Game Engine Materials » et « OgreXMLConverter ». Le fait de sélectionner OgreXMLConverter appellera automatiquement le programme d’Ogre du même nom qui est chargé de convertir le fichier XML du mesh en des fichiers de mesh que le moteur comprend.
Cliquez sur « Exporter ».

Sublime, magnifique, perfect, vous venez de créer votre premier Mesh pour OGRE. Mais comment l’utiliser maintenant ? Suivez le guide.

Utiliser le mesh dans OGRE

Dans cette partie, je supposerai que vous connaissez au moins les bases de OGRE, c’est à dire les premiers tutoriels du wiki officiel, au moins jusqu’à la partie permettant de charger un mesh.

Tout d’abord, il va falloir placer les fichiers où il faut, c’est à dire… où vous voulez. Je vous conseille néamoins de respecter la structure habituelle de OGRE, c’est à dire

– Ogre (un dossier dans lequel vous placerez vos mesh, par exemple dans le répertoire de votre jeu, où ailleurs).
—> models : vous placerez dans ce répertoire le fichier Cube.001.mesh qui a été généré par le script d’exportation
—-> materials : ce répertoire contient les textures, scripts, enfin bref infos sur l’apparence
———-> textures : placez ici votre texture
———-> scripts : placez ici le fichier Scene.material généré par l’exportation

Maintenant, il va falloir dire à Ogre où trouver les fichiers. Pour celà, modifiez le fichier ressource.cfg comme suit

# Resources required by the sample browser and most samples.
[Essential]
Zip=/usr/share/OGRE/media/packs/SdkTrays.zip
FileSystem=/usr/share/OGRE/media/thumbnails

# Common sample resources needed by many of the samples.
# Rarely used resources should be separately loaded by the
# samples which require them.
[Popular]
FileSystem=/usr/share/OGRE/media/fonts
FileSystem=/usr/share/OGRE/media/materials/programs
FileSystem=/usr/share/OGRE/media/materials/scripts
FileSystem=/usr/share/OGRE/media/materials/textures
FileSystem=/usr/share/OGRE/media/materials/textures/nvidia
FileSystem=/usr/share/OGRE/media/models
FileSystem=/usr/share/OGRE/media/particle
FileSystem=/usr/share/OGRE/media/DeferredShadingMedia
FileSystem=/usr/share/OGRE/media/PCZAppMedia
FileSystem=/usr/share/OGRE/media/RTShaderLib

# MODIFIEZ ICI : mettez le chemin des répertoires que vous venez de créer
FileSystem=/media/data/programmation/3D/ogre/media/materials/scripts
FileSystem=/media/data/programmation/3D/ogre/media/materials/textures
FileSystem=/media/data/programmation/3D/ogre/media/models

Zip=/usr/share/OGRE/media/packs/cubemap.zip
Zip=/usr/share/OGRE/media/packs/cubemapsJS.zip
Zip=/usr/share/OGRE/media/packs/dragon.zip
Zip=/usr/share/OGRE/media/packs/fresneldemo.zip
Zip=/usr/share/OGRE/media/packs/ogretestmap.zip
Zip=/usr/share/OGRE/media/packs/ogredance.zip
Zip=/usr/share/OGRE/media/packs/Sinbad.zip
Zip=/usr/share/OGRE/media/packs/skybox.zip

[General]
FileSystem=/usr/share/OGRE/media

Plus qu’à tester ça sur un exemple, prenons celui du wiki officiel :

#include "ExampleApplication.h"
class TutorialApplication : public ExampleApplication
{
protected:
public:
    TutorialApplication()
    {
    }

    ~TutorialApplication()
    {
    }
protected:
    void createScene(void)
    {
        mSceneMgr->setAmbientLight( ColourValue( 1, 1, 1 ) );
        Entity *ent1 = mSceneMgr->createEntity( "Test", "Cube.001.mesh" );
        SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "TestNode" );
        node1->attachObject( ent1 );
    }
};

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
    // Create application object
    TutorialApplication app;

    try {
        app.go();
    } catch( Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
        MessageBox( NULL, e.what(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
        fprintf(stderr, "An exception has occurred: %s\n",
                e.what());
#endif
    }

    return 0;
}

Voilà, plus qu’à compiler, et à lancer le programme. Normallement, sous vos yeux ébahis, le cube apparait, texturé tout comme il faut.

Problèmes

Voici quelques problèmes que j’ai rencontré, et comment les éviter :

  • Si l’application ne démarre pas, vous avez probablement oublié de placer le fichier mesh Cube.001.mesh dans votre répertoire models/, ou alors vous n’avez pas spécifié correctement sa position dans le fichier ressources.cfg
  • Si le cube n’est pas texturé, vérifiez que vous avez bien un fichier Scene.material dans votre dossier script, et que son emplacement est correctement spécifié dans le fichier ressources.cfg

Amusez vous bien, et si je n’ai pas été clair, n’hésitez pas à demander des précisions dans les commentaires.

Références:

4 commentaires

  1. salut, merci pour le tuto il m’a été très utile. je suis arrivé à exporter un objet créé par un seul plan mais lorsque j’essaie d’exporter un objet composé de plusieurs plans ou cube ou… l’exportation me génère plusieurs fichiers .mesh et je ne sais pas comment utiliser cela dans ogre alors si tu connais la réponse ca m’aiderai beaucoup.
    encore merci pour le tuto.

  2. J’espère que je ne te réponds pas trop tard.
    La procédure à suivre pour afficher les autres mesh est la même que pour un seul mesh.
    Tu places tous tes fichiers .mesh dans le répertoire models, les textures à leur place…
    Et ensuite, tu utilise les nouveau mesh dans le programme en les chargeant à l’aide de
    mSceneMgr->createEntity( "nom", "Cube.00x.mesh" );

  3. salut
    merci pour ta réponse . j’ai essayé d’ajouter les autres mesh dans mon programme mais le probleme est que je suis obligé à chaque fois de repositionner chaque noeud attaché à chaque mesh par rapport aux autres comme suit :

    Ogre::Entity* ent = mSceneMgr->createEntity(« chapeau » , « Cone.mesh »);
    Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode(Ogre::Vector3(15, 0,15));
    node->attachObject(ent1);
    Ogre::Entity* ent1 = mSceneMgr->createEntity( « aaa »+ Ogre::StringConverter::toString(i+j*10), « Plane.001.mesh » );
    Ogre::SceneNode* node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode(Ogre::Vector3(15, -5,15));
    node1->attachObject(ent1);

    càd que je n’obtient pas la meme position que dans blender . est ce normal ou bien y a til quelque chose que je doit fiare pour remédier à cela?
    encore merci pour ta réponse je suis encore bloquée.

    1. salut
      j’ai essayé un autre truc: j’ai esporté mon .blend en .scene et je l’ai ajouté à mon projet ogre et le probleme est le meme: j’obtient toutes les mesh mais elles ne sont pas attachées càd qu’elles sont éparpillées dans l’espace. j’ai regardé dans le fichier log de ogre et j’ai trouvé des exceptions:

      OGRE EXCEPTION(2:InvalidParametersException): Parameter called ambient does not exist. in GpuProgramParameters::_findNamedConstantDefinition

      OGRE EXCEPTION(2:InvalidParametersException): Parameter called camObjPos does not exist. in GpuProgramParameters::_findNamedConstantDefinition

      est ce que tu a une idée de ce que ca peut être?

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :