Bonjour à tous,
Débutant sur ce moteur et ayant commencé un jeu de snowboard, je me pose quelques question :
- premierement, j'ai importé un terrain de 3ds et j'ai réglé les collisions mais j'aimerais que mon snowboarder puisse 'glisser' progressivement tout seul dans la pente est-ce possible?
- deuxiemement, mon perso est également importé de 3ds et je souhaiterais pouvoir l'animer (par exemple le faire tourner lors de l'apui sur la fleche gauche ou droite) est-il possible de faire cela uniquement en utilisant des .3ds?
Si mes questions sont un peu floues ou que souhaitez voir du code n'hésité pas à me le demander
merci d'avance @bientot
Hors ligne
Pour que ton perso glisse, tu peux utiliser un peu de gravité dans l'animator que tu creais pour les collisions.
Sinon pour bouger ton perso sur la droite et la gauche, moi j'aurrai fait une anim sous 3ds genre le mec plis un peu les jambes, et tourne son corps légèrement sur la droite ou la gauche, puis ensuite j'aurrai fini ça en code en passant par les Events, tu captures la touche Fleche droite ou Fléches Gauche, puis tu modifis les frames de ton animations.Tout dépend le résultat que tu veux.Tu peux également le faire pivoter après capture des touches, mais le personnage va parraitre rigide et ça sera pas jolie donc moi j'aurrai fait une petite anim, au choix.
Hors ligne
merci beaucoup pour ta reponse Copland,
j'avai déja à peu près penser à ces solutions simplement je les utilises peut etre mal (malgré des heures plongés dans la doc
pour ce qui est de l'apesanteur voila mes ligne de code :
//collision nodeG/piste : selecteur = smgr->createOctTreeTriangleSelector(meshPiste->getMesh(0), nodePiste, 32); anim = smgr->createCollisionResponseAnimator(selecteur,nodeG,radius,vector3df(0,-150,10 ),vector3df(0,9,-30),0.0001f); nodeG->addAnimator(anim); anim->drop();
1er probleme : c'est que je dois faire correspondre la force de l'attraction (ici -150) et le sliding (0.0001f) et afin de pouvoir glisser correctement et la vitesse est presque nul!!
2eme probleme : le perso ne glisse que selon l'axe des x, mon code marchait mieux lorsque j'incrémenté automatiquement les x dans une classe dérivée de ISceneNodeAnimator
pour l'animation je ne suis pas bien sur mais je crois avoir fait un peu n'importe quoi (ben oui je debute ) enfin voila ma situation : je possede un ISceneNode* (nodeG) avec lequel je gere les collisions(ce qui explique la translation de l'ellipsoide vector3df(0,9,-30) puisque mon perso n'est pas sur le nodeG) et le billboard. Ensuite je lui ai attaché mon perso devant puis la camera! Du coup, lorsque j'essai de changer de frame je suis obligé de tout recharger (collision...) et je ne vois pas pourquoi :s
exemple pour tourner a gauche :
case KEY_LEFT: { core::vector3df v = nodeG->getPosition(); if(!rotatGauche) { nodePerso->remove(); meshPersoGauche = smgr->getMesh("../media/pandaGauche.3ds"); nodePerso = smgr->addOctTreeSceneNode(meshPersoGauche->getMesh(0)); nodePerso->setMaterialTexture(0, idriver->getTexture("../media/texturePerso.jpg")); nodePerso->setMaterialFlag(video::EMF_LIGHTING,false); nodeG->addChild(nodePerso); gestionOisivete(); gestionCollision(); chargementBillboard(0); nodeG->setPosition(v); rotatGauche = true; }
Encore merci @bientot j'espere ^^
Dernière modification par babar63 (14-02-2007 17:06:50)
Hors ligne
Finalement pour la collision je pense adapter la piste même si ca limite un peu le choix de piste le résultat sera plus réel (pas de virage à 90° )
J'ai également trouvé mon erreur pour l'animation, j'ai remplacé mon 'nodePerso' par un IAnimatedMeshSceneNode* (au lieu de ISceneNode*)
Et j'utilise le code suivant :
case KEY_LEFT: { core::vector3df v = nodeG->getPosition(); if(!rotatGauche) { nodePerso->drop(); nodePerso = smgr->addAnimatedMeshSceneNode(meshPersoGauche); nodePerso->setMaterialTexture(0, idriver->getTexture("../media/texturePerso.jpg")); nodePerso->setMaterialFlag(video::EMF_LIGHTING,false); nodeG->addChild(nodePerso); nodeG->setPosition(v); rotatGauche = true; } v.X += event.KeyInput.Key == KEY_RIGHT ? 2.0f : -2.0f; nodeG->setPosition(v); break; }
C'est déja beaucoup plus propre et ca marche beaucoup mieux
Toutefois, j'aurais encore une question mon animation est très 'brusque' puisque je change d'une position à une autre directement je souhaiterais créer deux véritable animations : une pour la transition d'une position à l'autre et l'autre pour une position particulière
Je possede déja une classe prévu (enfin je suppose) :
class IdleAnimatorNode : public ISceneNodeAnimator { public : virtual void animateNode(ISceneNode * node,u32 timeMs) { //utilisé pour le déplacement automatique core::vector3df v = nodeG->getPosition(); v.Z += 0.15f; nodeG->setPosition(v); } };
Mais premier problème je n'arrive pas à gerer le timer 'timeMs' j'appele la fonction avec 0 par défault
Et deuxième problème je ne vois vraiment pas comment procédé pour créer ces animations et les appeler...
En tout cas j'y travaille pour l'instant
Si vous avez quelques conseils à me donner je suis ouvert à toutes propositions
encore merci ^^
Hors ligne
Pour l'animation étant donné que j'utilise 3ds Max je me suis penché sur le plugin Panda DirectX pour exporter mes animations
Pour l'instant je possede seulement un cube qui se déforme pour tester je l'exporte en .x et j'utilise le code suivant :
scene::IAnimatedMeshSceneNode* anms = smgr->addAnimatedMeshSceneNode( smgr->getMesh("../media/test.x")); anms->setFrameLoop(1,20); anms->setAnimationSpeed(30); anms->setRotation(core::vector3df(0,180.0f,0));
Je me suis également inspiré du code donné par Copland lors d'un autre message sur ce forum :
scene::IAnimatedMeshX* TinyX = (scene::IAnimatedMeshX *)smgr->getMesh("../media/test.x"); TinyX->setCurrentAnimation("anim"); scene::IAnimatedMeshSceneNode* Tiny = smgr->addAnimatedMeshSceneNode(TinyX); Tiny->setRotation(core::vector3df(0,180.0f,0)); Tiny->setFrameLoop(1,20); Tiny->setAnimationSpeed(30);
mais l'anim ne se lance pas quoiqu'il arrive !! Je me demande si j'exporte bien mes fichiers à partir de 3ds....
voila mes options pour l'exportation :
http://www.hiboox.com/image.php?img=fa6e70b.jpg
http://www.hiboox.com/image.php?img=90df524c.jpg
Help please.... merci d'avance bonne journée
Dernière modification par babar63 (16-02-2007 18:43:08)
Hors ligne
Personne n'aurait donc de conseils pour que j'intègre l'animation je suis vraiment bloqué sur cette partie.........
Si vous souhaitez voir le code entier ou me demander plus de précision si mes question sont flous n'hésitez pas
Bonne journée à vous ^^
Hors ligne
Pour panda je ne pourrai pas t'aider, mais pour vérifier si ton objet fonctionne bien, ouvre le simplement sous le viewer d'irrlicht, et si il bouge pas tu seras fixé.
Sinon envoi moi ton modèle max par email et je te l'exporte en X si tu veux.
J'ai un exporteur X sous license, donc je n'ai malheureusement pas le droit de le distribuer...
@+
Hors ligne
L'exportation des animations de 3dsMax en .X n'a pas vraiment l'air d'etre opérationnel (ou alors je m'y prends mal) avec le plugin PandaX (pour 3ds 7 en tout cas). Pour ceux qui rencontrerait le même probleme que moi, je me permet de mettre un lien vers la FAQ developpez.com ici qui donne les differentes possibilités pour exporter au format .x. Personnelement je me suis penché sur blender qui exporte directement.....
Si le lien est mal vue je m'en excuse d'avance, n'hésitez pas à modifier mon message ou à le supprimer... =s
@+++
Hors ligne
T'a réussi à exporter prorement un modèle animé en X avec Blender ?
Si oui quelle version de blender et quel plugin s'il te plait ? :p
Hors ligne
Salut !
J'ai réussi a exporter des animations avec PandaX mes seul le squelette passe. Le reste partr dans tout les sens...
(J'ai peut etres sauté une ligne, Copland, quel exporter utilise tu ?)
Hors ligne
L'exporter de la version commerciale d'un autre moteur 3D et à parament il est 100% compatible avec irrlicht ce qui m'arrange pas mal ....
Sinon pour Max et Irrlicht je préfère quand même le format B3D qui est plus rapide.
Hors ligne
Oki ! (pour le moteur 3D, c'est le quel ?)
Le format B3D utilise gère t'il les animations dans Irrlicht ?
Hors ligne
Salut !
J'ai réussit a exporter en .X un squelette (charactere) + mesh et a le lire dans Irrlicht avec PandaX.
Et ça marche !
Pour ce faire (même si ce n'est pas forcément ça), j'ai ajouter l'exporter X de directX un peu dans tout les dossiers de 3ds.
L'animation est fait avec l'autokeys...
Sinon, pour la gestion de l'anim dans Irrlicht :
j'ai ce code là :
scene::IAnimatedMeshX* mesh_first = (scene::IAnimatedMeshX *)smgr2->getMesh("first.X"); mesh_first->setCurrentAnimation("course_w_arme"); scene::IAnimatedMeshSceneNode* node_first = smgr2->addAnimatedMeshSceneNode(mesh_first, camera); node_first->setMaterialFlag(video::EMF_LIGHTING, false); node_first->setPosition(core::vector3df(0,-120,0)); node_first->setRotation(core::vector3df(0,180,0)); node_first->setAnimationSpeed(6000);
Cependant, j'ai deux probleme :
-Ya t'il un system pour pouvoir stopé, démarer l'animation (exemple quand le perso s'arrete, l'anim ne bouge plus)
-Ya t'il un moyen de stopé le Loop... Ya bien "node_first->setLoopMode(false);" mais quand je le met, l'animation ne démarre pas...
Merci de vos reponse/question
a+
w
Dernière modification par Willikus (22-02-2007 14:14:20)
Hors ligne
Copland a écrit :
T'a réussi à exporter prorement un modèle animé en X avec Blender ?
Si oui quelle version de blender et quel plugin s'il te plait ? :p
J'utilise la version 2.43 de blender et l'exporter .x est déjà intégré par contre je dois d'abord apprendre à utiliser le logiciel vu que je ne connaissait que 3ds max jusqu'a présent ; )
Donc pour l'instant j'attend de voir le résultat....
EDIT : J'ai créer une première animation basique avec cette version et l'exportation est très propre... voilà
Tu dis utiliser le format .b3d Copland... j'ai également essayé et je pense avoir correctement installé l'exporter mais pour les animations il reste toujours un probleme. Pourtant lorsque j'utilise la fonction preview avant l'export mon animation est bien présente sur la fenetre de rendu :s .... du coup je vois pas pourquoi lorsque j'importe sous irrlicht plus rien????
Dernière modification par babar63 (28-02-2007 20:37:12)
Hors ligne
Pour le format b3d je n'ai toujours pas trouvé de solution pour exporter proprement les animations par contre j'ai enfin réussi à exporter en .X pour 3ds max7... suffisait juste de travailler en autokey.... (au passage merci à willikus )
Par contre il me reste toujours un probleme et pourtant je ne vois plus d'erreur pour animer mon perso :
nodePerso->setFrameLoop(1,6); nodePerso->setAnimationSpeed(10); nodePerso->setLoopMode(true);
Avec ce code j'obtient deux résultats différents, si je le place après l'appui d'une touche l'anim n'est pas joué et si je le place lors du chargement du personnage l'anim est joué en boucle or je souhaite juste aller de la frame 1 à la frame 6... :s
j'ai également essayé avec setLoopMode(false) mais c'est pas mieux je suppose que mon souci rejoins pas mal celui de willikus est-ce un bug de irrlicht ? Quelqu'un aurait-il une solution?
Dernière modification par babar63 (05-03-2007 04:25:27)
Hors ligne
bien le bonsoir a tous mon projet commence à aboutir cependant j'ai rencontré un dernier problème je n'arrive plus a déplacer mon personnage (alors que mes animations marchent plus très bien pour une fois!!!)
Voila ma situation :
variables utiles :
ISceneNode* nodeG=0; //il s'agit en fait d'un simple cube situé derriere la camera qui permet d'y attacher la //cam et le perso, ainsi, j'effectue les translation seulement sur ce noeud IAnimatedMeshSceneNode* nodePerso=0; IAnimatedMesh* meshPerso=0; IAnimatedMesh* meshPersoGauche=0;
fonction de chargement du perso :
void chargementPerso() { //chargement des differents mesh du perso : meshPerso = smgr->getMesh("../media/pandaAnimNormal.X"); meshPersoGauche = smgr->getMesh("../media/PandaAnimGauch.X"); //initialisation du noeud : nodePerso = smgr->addAnimatedMeshSceneNode(meshPerso); //gestion de l'animation du perso nodePerso->setLoopMode(false); //le personnage est attaché au noeud nodeG nodeG->addChild(nodePerso); };
classe evenement :
class RecepteurEvenement : public IEventReceiver{ public: virtual bool OnEvent(SEvent event) { if (nodePerso != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT) { switch(event.KeyInput.Key){ case KEY_LEFT:{ if(!rotatGauche) { //mis a jour des booléens : posOriginal = false; rotatGauche = true; rotatDroite = false; rotatArriere = false; //chargement de l'anim : nodePerso->drop(); nodePerso = smgr->addAnimatedMeshSceneNode(meshPersoGauche); nodePerso->setLoopMode(false); nodeG->addChild(nodePerso); } core::vector3df v = nodeG->getPosition(); v.X -= 4.0f; nodeG->setPosition(v); break; } // idem pour les autres touches } } return false; } };
class animation :
class IdleAnimatorNode : public ISceneNodeAnimator{ public : virtual void animateNode(ISceneNode * node,u32 timeMs){ //utilisé pour le déplacement automatique core::vector3df v = node->getPosition(); v.Z += 0.25f; node->setPosition(v); } };
utilisation :
void animation(){ //j'attache l'animateur au noeud nodeG IdleNode = new IdleAnimatorNode; IdleNode->animateNode(nodeG,15); nodeG->addAnimator(IdleNode); IdleNode->drop(); }
J'espere ne pas trop abuser de votre gentillesse vous m'avez déjà bien aidé mais la j'avoue que je ne sais plus quoi faire.....donc si vous voyez quelques choses qui ne semble pas normal faites moi signes svp
@bientot ^^
Hors ligne
Après etre passé un peu du coté du debug, j'ai constaté que la position du noeud nodeG est constament égal au vecteur(0,0,0). Et meme lorsque j'incremente la position dans mes fonctions la position est réinitialisé par la suite. Or si je ne charge pas mes animations la il n'y a plus aucun probleme pour déplacer mon noeud.... :s je ne comprend vraiment pas....
Y a t-il une astuce pour regler ce probleme ou faut-il modifier le code d'irrlicht et si oui, où récuperer le code???
merci d'avance a bientot ++
Hors ligne