Bonjour je cherche le calcule à faire pour que mon mesh avance selon la rotation Y et Z.
c'est à dire quand il est tourné vers le bas (rotation de Z) il avance vers le bas, et quand il regarde vers le haut il avance vers le haut.
Et je voudrais savoir comment faire (s'il y a un calcul) pour que les axes de rotation ne tournent pas avec le mesh, regardez l'image.
http://i1128.photobucket.com/albums/m49 … r/3d-1.jpg
Voilà merci d'avance.
Dernière modification par kiricou974 (25-10-2010 20:31:26)
Hors ligne
Pour ta 1ere question jette un œil par là:
http://irrlicht-fr.org/viewtopic.php?id=1350
void moveCamera(irr::scene::ISceneNode *node, vector3df unite)
ça correspond à peu près à ce que tu veux faire je pense..
Sinon pour ta 2eme question, j'ai pas bien compris ce que tu veux faire, ne pas tourner l'axe de quoi ? ton mesh ? ton monde ?....
Hors ligne
Pour ma 2eme question je voudrais savoir comment faire pour que les axes de rotation du mesh, de l'objet que je contrôle (vaisseaux spatiale) ne tournent pas avec le mesh.
excuse moi si je m'exprime mal j'ai du mal à le décrire.
Merci pour la première question mais j'ai trouvé par moi-même.
Dernière modification par kiricou974 (25-10-2010 21:57:43)
Hors ligne
ok je vois ce que tu veux dire,
Une petite idée (parmi d'autres) tu crées un noeud de scene "noeud1" , tu en crées ensuite un deuxième qui contient ton vaisseau.
tu mets le deuxième en fils de "noeud1".
Tu peut donc tourner ton vaisseau sur l'axe que tu veux, sans modifier l'axe de "noeud1"
ensuite j'imagine que tu contrôles "noeud1" pour gérer les déplacements"
Dernière modification par nabouill (25-10-2010 22:07:28)
Hors ligne
j'ai déjà essayé ça mais le problème c'est que avec la camera 3eme personne que j'ai sans fait un joli bug mais je vais retenter.
bon voila le code que j'ai fait :
#include <irrlicht.h> #include "CShieldManager.h" #include "Following_Camera.h" #include "CEventManager.h" using namespace irr; using namespace core; using namespace gui; using namespace video; using namespace scene; void event_manager(MyEventReceiver *receiver, IAnimatedMeshSceneNode *battle_turtle1) { int rot1 = 0, rot2 = 0; vector3df rot, rrot; rot.Y += 0.7; ISceneNode *plane = battle_turtle1->getParent(); if(receiver->IsKeyDown(KEY_KEY_Z)) { vector3df facing(cos(battle_turtle1->getRotation().Y * PI/180.0f), -sin(battle_turtle1->getRotation().Z * PI/180.0f), -sin(battle_turtle1->getRotation().Y * PI/180.0f)); facing.normalize(); vector3df newPos = battle_turtle1->getPosition() - (facing + (facing * (f32)0.5f)); battle_turtle1->setPosition(newPos); if(receiver->IsKeyDown(KEY_KEY_Q)) { if (battle_turtle1->getRotation().X <= -30) { rot1 = 0; } else { rot1 = rot1 + 1; } battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(-rot1,-rot.Y,0)); } else if(receiver->IsKeyDown(KEY_KEY_D)) { if (battle_turtle1->getRotation().X >= 30) { rot2 = 0; } else { rot2 = rot2 + 1; } battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0)); } else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false) { if (battle_turtle1->getRotation().X < 0) { rot1 = rot1 + 1; } else if (battle_turtle1->getRotation().X == 0) { rot1 = 0; rot2 = 0; } else if (battle_turtle1->getRotation().X > 0) { rot2 = rot2 - 1; } battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0)); battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0)); } } else if(receiver->IsKeyDown(KEY_KEY_Q)) { if (battle_turtle1->getRotation().X <= -30) { rot1 = 0; } else { rot1 = rot1 + 1; } battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(-rot1,-rot.Y,0)); } else if(receiver->IsKeyDown(KEY_KEY_A)) { battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(0,0,1)); } else if(receiver->IsKeyDown(KEY_KEY_E)) { battle_turtle1->setRotation(battle_turtle1->getRotation()-vector3df(0,0,1)); } else if(receiver->IsKeyDown(KEY_KEY_D)) { if (battle_turtle1->getRotation().X >= 30) { rot2 = 0; } else { rot2 = rot2 + 1; } battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0)); } else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false) { if (battle_turtle1->getRotation().X < 0) { rot1 = rot1 + 1; } else if (battle_turtle1->getRotation().X == 0) { rot1 = 0; rot2 = 0; } else if (battle_turtle1->getRotation().X > 0) { rot2 = rot2 - 1; } battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0)); battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0)); } } int main(void) { IrrlichtDevice* device = irr::createDevice(EDT_OPENGL,dimension2d<irr::u32>(1024,768),32,false,false,true); IVideoDriver* driver = device->getVideoDriver (); ISceneManager *sceneManager = device->getSceneManager (); scene::IAnimatedMeshSceneNode *shield_node; sceneManager->addSkyBoxSceneNode( driver->getTexture("Data/skybox/irrlicht2_up.jpg"), driver->getTexture("Data/skybox/irrlicht2_dn.jpg"), driver->getTexture("Data/skybox/irrlicht2_lf.jpg"), driver->getTexture("Data/skybox/irrlicht2_rt.jpg"), driver->getTexture("Data/skybox/irrlicht2_ft.jpg"), driver->getTexture("Data/skybox/irrlicht2_bk.jpg")); scene::ILightSceneNode* lumiere = sceneManager->addLightSceneNode(0,vector3df(500000,0,10000),SColorf(255, 255, 255),5000000.0f); lumiere->getLightData().Type = ELT_POINT; f32 radius = 0.1; u32 duration = 500; video::SColorf impact_color(1,1,1,1); device->getCursorControl ()-> setVisible (true); // curseur invisible scene::IMeshManipulator *manipulator = sceneManager->getMeshManipulator(); CShieldManager *shieldmanager = new CShieldManager(sceneManager,device->getTimer()); scene::ISceneNode * plane = sceneManager->addCubeSceneNode(0.0001f); scene::IAnimatedMeshSceneNode *battle_turtle1 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/dedale.b3d"), plane); scene::ISceneNode * planet = sceneManager->addSphereSceneNode(5,96); scene::ISceneNode * soleil = sceneManager->addSphereSceneNode(5,96); planet->setScale(vector3df(20,20,20)); planet->setPosition(vector3df(20000,0,0)); soleil->setScale(vector3df(20*18,20*18,20*18)); soleil->setPosition(vector3df(0,0,0)); soleil->setMaterialFlag(EMF_LIGHTING, false); lumiere->setPosition(soleil->getPosition()); battle_turtle1->setScale(core::vector3df(1,1,1)); battle_turtle1->setPosition(core::vector3df(20000,0,100)); battle_turtle1->setMaterialFlag(EMF_LIGHTING, true); shield_node = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/shield_dedale.b3d"),battle_turtle1); shield_node->setMaterialTexture(0,driver->getTexture("Data/textures/water.jpg")); shield_node->setMaterialTexture(1,driver->getTexture("Data/textures/gradient_blinds.png")); planet->setMaterialTexture(0,driver->getTexture("Data/textures/terre.jpg")); soleil->setMaterialTexture(0,driver->getTexture("Data/textures/soleil.png")); manipulator->scaleTCoords(shield_node->getMesh(),core::vector2df(6,6),1); shield_node->setMaterialFlag(video::EMF_BACK_FACE_CULLING,false); shield_node->setScale(core::vector3df(1,1,1)); shield_node->setVisible(false); scene::ITriangleSelector *selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node); selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node); shield_node->setTriangleSelector(selector); selector->drop(); scene::ITriangleSelector *selector1; shieldmanager->addShield(shield_node); FollowingCamera* MaCamera = new FollowingCamera(battle_turtle1, sceneManager,false, 50000,selector1,-3,0.5f,0,vector3df(7,2,0)); // Position initiale. MyEventReceiver receiver; device->setEventReceiver(&receiver); int lastFPS = -1; u32 lastMS = device->getTimer()->getRealTime(); while (device->run()) // la boucle de rendu { u32 difMs = device->getTimer()->getRealTime()-lastMS; lastMS = device->getTimer()->getRealTime(); f32 alignSpeed = difMs/16.0; if(lastMS%(rand()%20+30)==0) { core::vector3df source = vector3df(50,10,50); core::vector3df target = battle_turtle1->getPosition(); const core::line3df ray(source,target); core::vector3df result = shieldmanager->addImpact(shield_node, ray,radius*250,duration,impact_color); core::matrix4 trans = shield_node->getAbsoluteTransformation(); trans.makeInverse(); trans.transformVect(result); } event_manager(&receiver,battle_turtle1); driver->beginScene(true,true,SColor(0,200,200,200)); MaCamera->Update(); sceneManager->drawAll (); shieldmanager->drawAll(); driver->endScene (); } device->drop (); delete shieldmanager; delete MaCamera; return 0; }
Dernière modification par kiricou974 (25-10-2010 22:32:27)
Hors ligne
essaye d'utiliser les balise de code C++ stp pour poster ton code, ce sera plus lisible.
Et quand tu dis ça bug, c'est quoi/comment ça bug ?
Hors ligne
Excuse moi pour les balises ben quand je dit que sa bug ben la camera ne suit plus le vaisseau et quand je tourne avec le vaisseau ben il disparaît. mais avec le code que j'ai mis il a pas de problème mais le vaisseau ne tourne pas comme il faut quand je monte ou descends.
Hors ligne
ok, si je peux me permettre une petit remarque au passage (mais le prend pas mal) ça manque un peu de commentaires ton code, ça devient un peu difficile à lire (enfin pour moi toujours).
Donc si j'ai bien compris, tu crées un sceneNode "plane" à qui tu attaches un autre sceneNode "battle_turtle1".
Tu as une camera qui suit en permanence "battle_turtle1". Avec les touches du clavier, tu changes les positions de "battle_turtle1". on ne voit pas le code de "FollowingCamera", mais j'imagine que vu que la camera suit "battle_turtle1", quand tu fais une rotation sur "battle_turtle1" la camera en fait autant donc l'effet devient transparent. d'autre part, tu ne bouges jamais "plane", lui il reste à sa position, "battle_turtle1" en est son fils mais se déplace toujours seul, donc l'intérêt ici il n'y en a pas.
Si mon petit résumé est bon, je pense pouvoir corriger cela en:
tu continues de mettre "battle_turtle1" fils de "plane" mais quand tu bouges, tu bouges "plane" et non plus "battle_turtle1". Par contre quand tu montes ou descends, tu fais une rotation sur "battle_turtle1" sur l'axe X pour que "battle_turtle1" penche en avant ou en arrière.
Et MaCamera ne doit pas suivre "battle_turtle1" mais "plane" (ce que tu avais du faire je pense, mais si pour les déplacements tu déplaçais "battle_turtle1" au lieu de plane, "battle_turtle1" se barrait bien vite et loin donc tu ne le voyais plus)
Je pense que ça devrait rouler (si j'ai bien compris le code et ce que tu voulais faire)
Bon courage!
ps: pense au balise de code http://irrlicht-fr.org/help.php#bbcode
Dernière modification par nabouill (25-10-2010 23:09:25)
Hors ligne
C'est exactement ça et pour les commentaires c'est une habitude que je dois prendre désolé.
Hors ligne
pas de soucis, redis sinon si ça marche pas
Hors ligne
ben je viens de faire tes modifications mais quand je monte et que je tourne à droite ou à gauche il fait une boucle bizarre qui n'est pas bon voilà le code que j'ai fait
#include <irrlicht.h> #include "CShieldManager.h" #include "Following_Camera.h" #include "CEventManager.h" using namespace irr; using namespace core; using namespace gui; using namespace video; using namespace scene; void event_manager(MyEventReceiver *receiver, IAnimatedMeshSceneNode *battle_turtle1, ISceneNode* plane) { int rot1 = 0, rot2 = 0; vector3df rot, rrot; rot.Y += 0.7; if(receiver->IsKeyDown(KEY_KEY_Z)) { vector3df facing(cos(battle_turtle1->getRotation().Y * PI/180.0f), -sin(battle_turtle1->getRotation().Z * PI/180.0f), -sin(battle_turtle1->getRotation().Y * PI/180.0f)); facing.normalize(); vector3df newPos = battle_turtle1->getPosition() - (facing + (facing * (f32)0.5f)); battle_turtle1->setPosition(newPos); if(receiver->IsKeyDown(KEY_KEY_Q)) { if (battle_turtle1->getRotation().X <= -30) { rot1 = 0; } else { rot1 = rot1 + 1; } battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(-rot1,-rot.Y,0)); } else if(receiver->IsKeyDown(KEY_KEY_D)) { if (battle_turtle1->getRotation().X >= 30) { rot2 = 0; } else { rot2 = rot2 + 1; } battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0)); } else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false) { if (battle_turtle1->getRotation().X < 0) { rot1 = rot1 + 1; } else if (battle_turtle1->getRotation().X == 0) { rot1 = 0; rot2 = 0; } else if (battle_turtle1->getRotation().X > 0) { rot2 = rot2 - 1; } battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0)); battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0)); } } else if(receiver->IsKeyDown(KEY_KEY_Q)) { if (battle_turtle1->getRotation().X <= -30) { rot1 = 0; } else { rot1 = rot1 + 1; } battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(-rot1,-rot.Y,0)); } else if(receiver->IsKeyDown(KEY_KEY_A)) { battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(0,0,1)); } else if(receiver->IsKeyDown(KEY_KEY_E)) { battle_turtle1->setRotation(battle_turtle1->getRotation()-vector3df(0,0,1)); } else if(receiver->IsKeyDown(KEY_KEY_D)) { if (battle_turtle1->getRotation().X >= 30) { rot2 = 0; } else { rot2 = rot2 + 1; } battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0)); } else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false) { if (battle_turtle1->getRotation().X < 0) { rot1 = rot1 + 1; } else if (battle_turtle1->getRotation().X == 0) { rot1 = 0; rot2 = 0; } else if (battle_turtle1->getRotation().X > 0) { rot2 = rot2 - 1; } battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0)); battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0)); } } int main(void) { IrrlichtDevice* device = irr::createDevice(EDT_OPENGL,dimension2d<irr::u32>(1024,768),32,false,false,true); IVideoDriver* driver = device->getVideoDriver (); ISceneManager *sceneManager = device->getSceneManager (); scene::IAnimatedMeshSceneNode *shield_node; sceneManager->addSkyBoxSceneNode( driver->getTexture("Data/skybox/irrlicht2_up.jpg"), driver->getTexture("Data/skybox/irrlicht2_dn.jpg"), driver->getTexture("Data/skybox/irrlicht2_lf.jpg"), driver->getTexture("Data/skybox/irrlicht2_rt.jpg"), driver->getTexture("Data/skybox/irrlicht2_ft.jpg"), driver->getTexture("Data/skybox/irrlicht2_bk.jpg")); scene::ILightSceneNode* lumiere = sceneManager->addLightSceneNode(0,vector3df(500000,0,10000),SColorf(255, 255, 255),5000000.0f); lumiere->getLightData().Type = ELT_POINT; f32 radius = 0.1; u32 duration = 500; video::SColorf impact_color(1,1,1,1); device->getCursorControl ()-> setVisible (true); // curseur invisible scene::IMeshManipulator *manipulator = sceneManager->getMeshManipulator(); CShieldManager *shieldmanager = new CShieldManager(sceneManager,device->getTimer()); scene::ISceneNode * plane = sceneManager->addCubeSceneNode(0.0001f); scene::IAnimatedMeshSceneNode *battle_turtle1 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/dedale.b3d"), plane); scene::ISceneNode * planet = sceneManager->addSphereSceneNode(5,96); scene::ISceneNode * soleil = sceneManager->addSphereSceneNode(5,96); planet->setScale(vector3df(20,20,20)); planet->setPosition(vector3df(20000,0,0)); soleil->setScale(vector3df(20*18,20*18,20*18)); soleil->setPosition(vector3df(0,0,0)); soleil->setMaterialFlag(EMF_LIGHTING, false); lumiere->setPosition(soleil->getPosition()); battle_turtle1->setScale(core::vector3df(1,1,1)); battle_turtle1->setPosition(core::vector3df(20000,0,100)); battle_turtle1->setMaterialFlag(EMF_LIGHTING, true); shield_node = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/shield_dedale.b3d"),battle_turtle1); shield_node->setMaterialTexture(0,driver->getTexture("Data/textures/water.jpg")); shield_node->setMaterialTexture(1,driver->getTexture("Data/textures/gradient_blinds.png")); planet->setMaterialTexture(0,driver->getTexture("Data/textures/terre.jpg")); soleil->setMaterialTexture(0,driver->getTexture("Data/textures/soleil.png")); manipulator->scaleTCoords(shield_node->getMesh(),core::vector2df(6,6),1); shield_node->setMaterialFlag(video::EMF_BACK_FACE_CULLING,false); shield_node->setScale(core::vector3df(1,1,1)); shield_node->setVisible(false); scene::ITriangleSelector *selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node); selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node); shield_node->setTriangleSelector(selector); selector->drop(); scene::ITriangleSelector *selector1; shieldmanager->addShield(shield_node); FollowingCamera* MaCamera = new FollowingCamera(battle_turtle1, sceneManager,false, 50000,selector1,-3,0.5f,0,vector3df(7,2,0)); // Position initiale. MyEventReceiver receiver; device->setEventReceiver(&receiver); int lastFPS = -1; u32 lastMS = device->getTimer()->getRealTime(); while (device->run()) // la boucle de rendu { u32 difMs = device->getTimer()->getRealTime()-lastMS; lastMS = device->getTimer()->getRealTime(); f32 alignSpeed = difMs/16.0; if(lastMS%(rand()%20+30)==0) { core::vector3df source = vector3df(50,10,50); core::vector3df target = battle_turtle1->getPosition(); const core::line3df ray(source,target); core::vector3df result = shieldmanager->addImpact(shield_node, ray,radius*250,duration,impact_color); core::matrix4 trans = shield_node->getAbsoluteTransformation(); trans.makeInverse(); trans.transformVect(result); } event_manager(&receiver,battle_turtle1,plane ); driver->beginScene(true,true,SColor(0,200,200,200)); MaCamera->Update(); sceneManager->drawAll (); shieldmanager->drawAll(); driver->endScene (); } device->drop (); delete shieldmanager; delete MaCamera; return 0; }
Hors ligne
tu n'as pas appliqué toutes mes modifications, car tu ne bouges toujours pas "plane"
l'idée est que tu ne déplaces JAMAIS "battle_turtle1". quand tu te déplaces, tu déplaces seulement "plane". "battle_turtle1" étant son fils va suivre tout seul.
une fois que ça c'est fait, tu peux alors appliquer une rotation a "battle_turtle1" quand tu montes ou descends ou tournes , mais seulement une rotation PAS de déplacement. Et ta camera DOIT suivre "plane"
Aussi si tu veux plus de détails, commente les lignes évènements que je comprenne à quoi servent réellement les touches (avancer, tourner...) pour que j'essaye de retoucher un peu ton code.
ps: pour les balises de code, utilise plutôt la balise => Code=cpp
Dernière modification par nabouill (25-10-2010 23:35:44)
Hors ligne
bon voila se que j'ai fait mais le problème c'est que la camera ne pivote pas avec le vaisseau et il faut toujours une boucle bizard. si je peut te poster mes source et les bin
Dernière modification par kiricou974 (26-10-2010 00:58:24)
Hors ligne
Réponse un peu tardive mais je n'ai pas eu beaucoup de temps ces temps si.
Donc je me suis permis d'y intégrer un petite fonction supplémentaire pour alléger un peut le code au niveau des déplacements.
Aussi je n'est pas tout réécrit, mais seulement ce qui nous intéresse.
Je n'ai pas put tester, il faudra bien-sur ajuster un peut tout ça (vitesse de rotation, vitesse déplacement...) il est aussi possible qu'il y est des erreur dans les sens de rotation, a voir.
En espérant que sa t'aide un peu.
@+
Dernière modification par nabouill (27-10-2010 23:56:58)
Hors ligne
Merci de cette réponse mais j'ai changer la façon don le vaisseau se deplace merci quand meme.
Hors ligne
ça aurait été bien de le dire, cela m'aurait éviter de perdre 1 heure pour rien.
Hors ligne
Désoler pour les dérangement nabouill
Hors ligne