#0 

02-08-2010 15:46:51

darktux72
Petit nouveau
Date d'inscription: 02-08-2010
Messages: 5

Bonjour,

Je vais commencer par présenter un peu ce que je veux (tenter) de faire. En fait, je voudrai coder un simulateur de bus, pas trop compliqué, il existe déjà un simulateur de ce type (en open source) mais son développement est arrêté car les technologies utilisées sont devenues obsolètes (le jeu est fait en delphi avec GLScene), le code source n'est pas très maintenable et delphi n'est pas multiplateforme...
Je voudrai donc refaire un tout nouveau simulateur avec Irrlicht, mais la communauté et le nombre de mods étant important pour l'autre jeu, je voudrai utiliser les mêmes formats pour commencer, ça me permettrait d'avoir tout les mods de l'autre jeu compatible avec le mien, ce qui ferai déjà pas mal de contenu.
Je précise aussi que je suis un noob en C++ et Irrlicht mais je n'en suis pas a mes début en développement, je connais bien le java que j'ai même eu l'occasion d'utiliser en entreprise, je connais aussi le PHP et j'ai de bonnes bases en C wink

Donc venons en aux problèmes que je me pose sur Urrlicht qui ont tous plus ou moins rapport avec le format .3ds :
1) Je suis sous Linux et je rencontre un problème avec la casse des caractères, dans les fichier .3ds par exemple le fichier de la texture est marqué comme A.BMP, or, le vrai fichier de la texture est a.bmp, donc sous windows ça passe mais sous Linux, évidement, Irrlicht essai d'ouvrir le fichier A.BMP qu'il ne trouve pas, donc je voudrai savoir si il y a moyen d'ignorer la casse des caractères pour les fichier des textures quand on charge le fichier .3ds ?

2) Pour gérer les différentes parties du bus, le jeu actuel utilise un système un peu particulier, il y a un model .3ds pour un bus entier, ce model est séparé en plusieurs objets qui ont des noms bien précis, par exemple l'objet porte_avant, ensuite le jeu gère toutes les animations par rapport à ça, par exemple quand on clique sur le bouton d'ouverture de porte, l'objet porte_avant du .3ds va effectuer une rotation. Donc je cherche un moyen de gérer les différents objets d'un fichier 3ds mais je n'ai pas trouvé comment faire...

3) Les textures s'affiche sans problème pour les fichiers .3ds tant que les textures sont dans le même dossier, mais je vais avoir besoin d'avoir des textures dans différents dossiers pour gérer les livrées des bus (les couleurs), par exemple :
- fichier bus.3ds
- dossier livrée_1
----- 1.bmp
----- 2.bmp
----- 3.bmp
- dossier livrée_2
----- 1.bmp
----- 2.bmp
----- 3.bmp
L'utilisateur pourra choisir la livrée, donc il faudrait pouvoir dire à Irrlicht que les textures se situent dans telle ou telle dossier selon la livrée choisie.

Normalement ça devrait être bon une fois que j'aurai résolu ces problèmes, car le reste c'est plus "classique" donc les tutos et recherches sur le net devraint suffire smile

Merci d'avance pour votre aide.

Cordialement.

Hors ligne


#1 

02-08-2010 16:24:27

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

Salut
Problème N°1: je pense qu'il y a 2 façon de réglé ce problème
a) un peu bourrin: tu renomme tes fichier selon majuscule/minuscule en fonction de comment il sonts déclaré dans le fichier 3ds. exemple, pour ton fichier a.bmp, tu le renomme en A.BMP tel que le fichier 3ds le déclare. Ce que je n'aime pas dans ce genre de méthode, c'est que tu va te retrouvé avec des fichier en maj et d'autre en min, ce qui ne fait pas très organisé.
B) plus soft et organisé, tu ouvre ton fichier 3ds avec un éditeur 3D, tu modifie le nom de la texture et  tu ré enregistre.

Problème N°2:
j'imagine rapidement

Code c++ :


ISceneNode * porteAvant = smgr->addAnimatedMeshSceneNode(smgr->getMesh("porteAvant.3ds"));
bool boutonOuverturPorteEstAppuye = false;
//blablabla...code...
if(boutonOuverturPorteEstAppuye)
{
      porteAvant->setRotation(vector3df(0.0, 90.0, 0));
}



Problème N°3: tu peut charger ton modèle avec les texture qui lui sont attribué dans le modèle, mais tu peut très bien les changé par la suite

Code c++ :


//je charge un model de bus bleu par défaut; qui contient 2 textures a.bmp et b.bmp, qui sont (generalement) dans le meme dossier que le model
ISceneNode * monBus = smgr->addAnimatedMeshSceneNode(smgr->getMesh("porteAvant.3ds"));

//puis je le change de couleur en chargeant a la place les texture de bus Rouge
//on notera ici en 1er parametre l'ID de la texture
monBus->setMaterialTexture(0, driver->getTexture("bus.3ds"));
monBus->setMaterialTexture(1, driver->getTexture("busRouge/rougeA.bmp"));

//et si ça me chante, je rechange de couleur en chargeant a la place les texture de bus Vert
monBus->setMaterialTexture(0, driver->getTexture("busRouge/rougeB.bmp"));
monBus->setMaterialTexture(1, driver->getTexture("busVert/vertA.bmp"));



Bon courage A+
A+


mes sites: www.manga-vf.fr et www.series-vf.fr

Hors ligne


#2 

02-08-2010 17:49:37

darktux72
Petit nouveau
Date d'inscription: 02-08-2010
Messages: 5

Je ne m'attendait pas à une réponse aussi rapide ^^

Merci beaucoup wink

nabouill :

Salut
Problème N°1: je pense qu'il y a 2 façon de réglé ce problème
a) un peu bourrin: tu renomme tes fichier selon majuscule/minuscule en fonction de comment il sonts déclaré dans le fichier 3ds. exemple, pour ton fichier a.bmp, tu le renomme en A.BMP tel que le fichier 3ds le déclare. Ce que je n'aime pas dans ce genre de méthode, c'est que tu va te retrouvé avec des fichier en maj et d'autre en min, ce qui ne fait pas très organisé.
B) plus soft et organisé, tu ouvre ton fichier 3ds avec un éditeur 3D, tu modifie le nom de la texture et  tu ré enregistre.


C'est la solution que j'ai utilisé pour mes tests mais le problème c'est que les nombreux mods prévus pour le jeu actuel ont ce problème de nom, donc ça voudrai dire qu'un utilisateur devrait renommer plusieurs dizaines de textures à chaque installation de terrain ou de bus, donc c'est pas vraiment envisageable hmm Il faudrait vraiment trouver un moyen pour ignorer la casse lors de l'ouverture des fichiers.

nabouill :

Problème N°2:
j'imagine rapidement

Code c++ :


ISceneNode * porteAvant = smgr->addAnimatedMeshSceneNode(smgr->getMesh("porteAvant.3ds"));
bool boutonOuverturPorteEstAppuye = false;
//blablabla...code...
if(boutonOuverturPorteEstAppuye)
{
      porteAvant->setRotation(vector3df(0.0, 90.0, 0));
}


J'ai du mal m'exprimer, en fait il n'y a qu'un seul modèle 3ds, et le 3ds en question est séparé en plusieurs objets, exemple :
bus.3ds
--- carrosserie
--- vitre
--- porteAvant
--- porteArriere

Ça sera beaucoup plus simple si tous les objet était chacun dans un 3ds différent mais ce n'est pas le cas sad

nabouill :

Problème N°3: tu peut charger ton modèle avec les texture qui lui sont attribué dans le modèle, mais tu peut très bien les changé par la suite

Code c++ :


//je charge un model de bus bleu par défaut; qui contient 2 textures a.bmp et b.bmp, qui sont (generalement) dans le meme dossier que le model
ISceneNode * monBus = smgr->addAnimatedMeshSceneNode(smgr->getMesh("porteAvant.3ds"));

//puis je le change de couleur en chargeant a la place les texture de bus Rouge
//on notera ici en 1er parametre l'ID de la texture
monBus->setMaterialTexture(0, driver->getTexture("bus.3ds"));
monBus->setMaterialTexture(1, driver->getTexture("busRouge/rougeA.bmp"));

//et si ça me chante, je rechange de couleur en chargeant a la place les texture de bus Vert
monBus->setMaterialTexture(0, driver->getTexture("busRouge/rougeB.bmp"));
monBus->setMaterialTexture(1, driver->getTexture("busVert/vertA.bmp"));



Bon courage A+
A+


En fait c'est un peu plus compliqué que ça car je ne peux pas connaitre à l'avance le nom des fichiers des textures, tout ce que je sais c'est que les textures dans les différents dossiers on le même nom (voir mon exemple dans mon message précédent), et il n'y a pas de texture par défaut qui serai dans le même dossier que le 3ds wink
Je vais essayer de bosser ta solution, je vais voir si après le chargement du 3ds, on peu récupérer les nom des textures, si c'est possible, je ne devrais pas avoir trop de mal à m'en sortir pour rajouter le dossier qui correspond devant smile

En tout cas, encore merci pour ta réponse wink

Hors ligne


#3 

03-08-2010 10:59:37

thoced
Membre
Date d'inscription: 02-08-2010
Messages: 65

Bonjour concernant ton probleme numero 2,

lors de la modélisation de ton bus, tu peux y attaché un squelette et nommé les différents os du squelettes.

Meme si ton objet n'est pas un personnage mais un Bus, rien ne t'empêche d'utiliser une armature pour animer ta porte du bus

Ainsi dans Irrlicht tu peux récupérer les différents OS et appliquer une rotation sur l'os qui s'occupe de la porte du bus. Seul la porte du bus s'ouvrira.

Seul petit probleme, les fichiers 3ds ne peuvent contenir de mesh animé. Donc il faudra peut être exporter ton modèle de bus dans un autre format lisible par Irrlicht (B3d, fichier .x) ...


Voici les différents objets utilisables par Irrlicht (Animated objects)  : http://irrlicht.sourceforge.net/features.html


Voici comment récupérer l'os du mesh et appliquer une rotation :

        scene::IAnimatedMeshSceneNode *node;

        // code .............  chargement de ton mesh (bus complet avec armature)

    irr::scene::IBoneSceneNode * bone = node->getJointNode("nom_os");

        // "nom_os" que tu as attaché à la porte de ton bus via (3dsmax ou blender ou ect ...)

        bone->setRotation(irr::core::vector3df(0,90,0));

        // rotation sur le bone

Dernière modification par thoced (03-08-2010 11:52:47)

Hors ligne


#4 

03-08-2010 14:01:31

darktux72
Petit nouveau
Date d'inscription: 02-08-2010
Messages: 5

Salut,

thoced :

Bonjour concernant ton probleme numero 2,

lors de la modélisation de ton bus, tu peux y attaché un squelette et nommé les différents os du squelettes.

Meme si ton objet n'est pas un personnage mais un Bus, rien ne t'empêche d'utiliser une armature pour animer ta porte du bus

Ainsi dans Irrlicht tu peux récupérer les différents OS et appliquer une rotation sur l'os qui s'occupe de la porte du bus. Seul la porte du bus s'ouvrira.

Seul petit probleme, les fichiers 3ds ne peuvent contenir de mesh animé. Donc il faudra peut être exporter ton modèle de bus dans un autre format lisible par Irrlicht (B3d, fichier .x) ...


Voici les différents objets utilisables par Irrlicht (Animated objects)  : http://irrlicht.sourceforge.net/features.html


Voici comment récupérer l'os du mesh et appliquer une rotation :

        scene::IAnimatedMeshSceneNode *node;

        // code .............  chargement de ton mesh (bus complet avec armature)

    irr::scene::IBoneSceneNode * bone = node->getJointNode("nom_os");

        // "nom_os" que tu as attaché à la porte de ton bus via (3dsmax ou blender ou ect ...)

        bone->setRotation(irr::core::vector3df(0,90,0));

        // rotation sur le bone


Merci pour ta réponse smile

Ta solution me parait bien mais le problème, c'est que ça obligerai à modifier tout les mods déjà existants hmm

Avec vos réponses et ce que j'ai pu trouver sur le forum anglais, je vais abandonner l'idée de réutiliser le format existant avec l'autre jeu et je vais inventer mon propre format smile

Merci à ceux qui ont répondu wink

Ça ne sert donc plus a rien de répondre au différents problèmes wink

Cordialement.

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
24 invités en ligne
Aucun membre connecté
RSS Feed