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
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
Merci d'avance pour votre aide.
Cordialement.
Hors ligne
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
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
Bon courage A+
A+
Hors ligne
Je ne m'attendait pas à une réponse aussi rapide ^^
Merci beaucoup
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 Il faudrait vraiment trouver un moyen pour ignorer la casse lors de l'ouverture des fichiers.
nabouill :
Problème N°2:
j'imagine rapidementCode 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
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
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
En tout cas, encore merci pour ta réponse
Hors ligne
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
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
Ta solution me parait bien mais le problème, c'est que ça obligerai à modifier tout les mods déjà existants
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
Merci à ceux qui ont répondu
Ça ne sert donc plus a rien de répondre au différents problèmes
Cordialement.
Hors ligne