Partage
  • Partager sur Facebook
  • Partager sur Twitter

[irrlicht] problème de rotation

la rotation est juste, mais le mesh ne tourne pas !

    20 octobre 2007 à 16:58:31

    Bonjour tout le monde. Je développe (en C/C++ IrrLicht) un jeu en splitscreen ou on peut avec le clavier diriger des petits bonshommes. Le premier par exemple, on le fait avancer avec Z, reculer avec S, tourner a gauche avec Q et tourner a droite avec... D ! :p

    Le perso est un mesh, qui avance recule et tourne en fonction des events (en gros), et la camera correspondante est placée derrière le mesh en fonction de la rotation. Mais le problème, c'est que j'ai beau avancer, tourner, bouger où je veux (ca marche), le Mesh du perso ne tourne pas o_O ...

    Mon code :
    1. IAnimatedMeshSceneNode* player = smgr->addAnimatedMeshSceneNode(smgr->getMesh("Res/Msh/red.md2"));
    2. //textures, animation, collisions, etc...
    3. ICameraSceneNode* camera = smgr->addCameraSceneNode(0, vector3df(0,100,-40), vector3df(0,70,0));
    4. vector3df pos;
    5. vector3df newpos;
    6. vector3df rota;
    7. double a;
    8. //+qq bools et autres...
    9. //Puis dans le loop :
    10. if(forward){
    11.             pos = player->getPosition();
    12.             rota = player->getRotation();
    13.             newpos.X = pos.X + cos(rota.Y);
    14.             newpos.Z = pos.Z + sin(rota.Y);
    15.             newpos.Y = pos.Y;
    16.             player->setPosition(newpos);
    17.         }
    18. if(backward){
    19.             pos = player->getPosition();
    20.             rota = player->getRotation();
    21.             newpos.X = pos.X - cos(rota.Y);
    22.             newpos.Z = pos.Z - sin(rota.Y);
    23.             newpos.Y = pos.Y;
    24.             p1->setPosition(newpos);
    25.         }
    26. if(turnright){
    27.             a-=3.14159/180;
    28.         }
    29.         if(turnleft){
    30.             a+=3.14159/180;
    31.         }
    32. rota = vector3df(0,a[0],0);
    33. player->setRotation(rota);
    34. pos = player->getPosition();
    35.            newpos.X = pos.X - 50 * cos(rota.Y);
    36.            newpos.Z = pos.Z - 50 * sin(rota.Y);
    37.            newpos.Y = pos.Y + 10;
    38. camera->setPosition(newpos);
    39. camera->setTarget(pos);


    Comme dit plus haut, tout marche au poil sauf que le meche, lui, reste toujours tourné vers la meme direction... SOS SVP ! ^^
    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2007 à 17:33:03

      Salut.

      1. rota = vector3df(0,a[0],0);

      Que signifie ce 0 entre crochet ?
      • Partager sur Facebook
      • Partager sur Twitter
        21 octobre 2007 à 15:58:51

        ca veut dire qu'au vecteur "rota" on associe les valeurs 0 à X et Z, et la variable a à Y (pour le faire tourner seulement sur l'axe Y). Seulement voila, j'utilise dans mon programme des tableaux ^^ d'ou le a[0]... (mais c'est pas tres important)
        • Partager sur Facebook
        • Partager sur Twitter
          21 octobre 2007 à 16:08:37

          Hum, je ne comprend pas. Dans le code du dessus, a est un double tout con, pas un tableau...

          Si tu tente une rotation d'un angle arbitraire, sans prendre en compte les events, est-ce que ça marche ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 octobre 2007 à 20:45:09

            (Note : j'ai essayé avec des valeurs arbitraires, le perso tourne 100x plus lentement que sa rotation et la caméra derrière lui, j'ai essayé d'autres trucs sans succès etc, jusqu'à...)

            Bon écoutez j'ai pété un cable et j'ai viré toutes les lignes de code concernant la rotation ^^' (ce qui marchait pas). Maintenant, je vous balance tout mon code :

            1. //variables globales
            2.         IAnimatedMesh* oMesh;
            3.         IAnimatedMeshSceneNode* player[4];
            4.         ICameraSceneNode* cam[4];
            5.         vector3df pos;
            6.         vector3df rota;
            7.         bool forward1;
            8.         bool backward1;
            9.         bool turnright1;
            10.         bool turnleft1;
            11.         cam[0] = smgr->addCameraSceneNode(0, vector3df(0,100,-40), vector3df(0,70,0));
            12.         //on passe sur la map, on balance le mesh
            13.         oMesh = smgr->getMesh("Res/Msh/ox.md2");
            14.         player[0] = smgr->addAnimatedMeshSceneNode(oMesh);
            15.         player[0]->setMaterialFlag(EMF_LIGHTING, false);
            16.         player[0]->setMD2Animation(EMAT_STAND);
            17.         player[0]->setMaterialTexture( 0, driver->getTexture("Res/Msh/ox.bmp"));
            18.         player[0]->setPosition(vector3df(1200,470,200));
            19.         player[0]->setRotation(vector3df(0,0,0));
            20.         //un petit gestionnaire d'evenements, qui touche au bools...
            21.         //dans le loop, on fait avancer/reculer le perso
            22.         if(forward1){
            23.             pos = player[0]->getPosition();
            24.             rota = player[0]->getRotation();
            25.             if(type[0]==OX){
            26.             newpos.X = pos.X + Owalkspeed * cos(rota.Y);
            27.             newpos.Z = pos.Z + Owalkspeed * sin(rota.Y);}
            28.             if(type[0]==RED){
            29.             newpos.X = pos.X + Rwalkspeed * cos(rota.Y);
            30.             newpos.Z = pos.Z + Rwalkspeed * sin(rota.Y);}
            31.             newpos.Y = pos.Y + 1;
            32.             player[0]->setPosition(newpos);
            33.         }
            34.         if(backward1){
            35.             pos = player[0]->getPosition();
            36.             rota = player[0]->getRotation();
            37.             if(type[0]==OX){
            38.             newpos.X = pos.X - Owalkspeed * cos(rota.Y);
            39.             newpos.Z = pos.Z - Owalkspeed * sin(rota.Y);}
            40.             if(type[0]==RED){
            41.             newpos.X = pos.X - Rwalkspeed * cos(rota.Y);
            42.             newpos.Z = pos.Z - Rwalkspeed * sin(rota.Y);}
            43.             newpos.Y = pos.Y + 1;
            44.             player[0]->setPosition(newpos);
            45.         }
            46.         //on place astucieusement la caméra derrière lui
            47.         rota = player[0]->getRotation();
            48.         pos = player[0]->getPosition();
            49.            newpos.X = pos.X - 50 * cos(rota.Y);
            50.            newpos.Z = pos.Z - 50 * sin(rota.Y);
            51.            newpos.Y = pos.Y + 20;
            52.         cam[0]->setPosition(newpos);
            53.         cam[0]->setTarget(pos);



            Voila. Maintenant, comment est-ce que je fais tourner le perso ? ^^ (avec les bools turnright1 et turnleft1)

            Je pense que ca clarifie deja pas mal ^^.

            Merci pour vos réponses ! :)

            (PS : Et là, j'ai fait F9 une fois que mon message était finit ! XD)
            (les utilisateurs de CodeBlocks comprendront mon erreur... (F9=Compiler))
            • Partager sur Facebook
            • Partager sur Twitter
              24 octobre 2007 à 15:36:26

              Damned, que ce code a l'air compliqué !

              Je ne sais pas comment tu comptait t'y prendre, mais je te conseil de tout simplement faire pivoter ton mesh d'un degré ou 2 à chaque frames où les touches correspondantes sont enfoncées.

              Je ne vois pas trop ce que les cosinus et sinus viennent faire là...
              • Partager sur Facebook
              • Partager sur Twitter

              [irrlicht] problème de rotation

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown