Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Irrlicht] Tir + collision

    25 juillet 2007 à 21:20:48

    Voilà mon systeme de tir :

            scene::ICameraSceneNode* camera = smgr->getActiveCamera();

            core::vector3df start = camera->getPosition();
            core::vector3df end = (camera->getTarget() - start);
            end.normalize();
            start += end*8.0f;
            end = start + (end * camera->getFarValue());
            core::triangle3df triangle;

            core::line3d<f32> line(start, end);
            if (smgr->getSceneCollisionManager()->getCollisionPoint(
                    line, selector2, end, triangle))
            {
        }
            else if (smgr->getSceneCollisionManager()->getCollisionPoint(
                    line, selector, end, triangle))
            {
                    // collides with wall
                    core::vector3df out = triangle.getNormal();
                    out.setLength(0.03f);
            }
            else
            {
                    // doesnt collide with wall
                    core::vector3df start = camera->getPosition();
                    core::vector3df end = (camera->getTarget() - start);
                    end.normalize();
                    start += end*8.0f;
                    end = start + (end * camera->getFarValue());
            }

            scene::ISceneNode* node2 = 0;
            node2 = smgr->addBillboardSceneNode(0,
                    core::dimension2d<f32>(25,25), start);

            node2->setMaterialFlag(video::EMF_LIGHTING, false);
            node2->setMaterialTexture(0, driver->getTexture("../../media/portal1.bmp"));
            node2->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);

            f32 length = (f32)(end - start).getLength();
            const f32 speed = 0.6f;
            u32 time = (u32)(length / (2 * speed));

            scene::ISceneNodeAnimator* anim2 = 0;

           
            anim2 = smgr->createFlyStraightAnimator(start, end, time);
            node2->addAnimator(anim2);
            anim2->drop();

            anim2 = smgr->createDeleteAnimator(time);
            node2->addAnimator(anim2);
            anim2->drop();
     


    Mon problème n'est pas vraiment simple.
    Vous avez sûrement remarqué que c'est le code de la demo à peu près.
    Mon problème est que ma cible est mouvante et que dans le cas d'une rocket ou d'une boule de plasma, ce code est insuffisant : la cible est atteinte avant que le projectile ne l'ai touché. Je voudrais en fait calculer les coordonnées de collision avec le mur, et faire ensuite une verification de collision entre les projectiles et la cible.
    J'ai besoin d'aide, s'il vous plait.
    Comment puis-je faire ? Comment detecter les collisions entre deux nodes dans un if()
    • Partager sur Facebook
    • Partager sur Twitter
      26 juillet 2007 à 10:31:13

      Moi j'essairai avec ISceneCollisionManager en utilisant getCollisionPoint et tester si le node est a une certaine distance du pont de collision.
      Si le node est trop près il est touché ;)
      • Partager sur Facebook
      • Partager sur Twitter
        27 juillet 2007 à 14:19:20

        Je vois, mais pourrais je continuer avec mon code actuel : c'est à dire les animations FlyStraight ?
        Comment fonctionne getCollisionPoint, je ne connaissais pas cette fonction ?
        • Partager sur Facebook
        • Partager sur Twitter
          27 juillet 2007 à 14:27:07

          Dans la demo y a une fonction tir avec les collisions.

          Tu ferais mieu d'utiliser un ITriangleSelector...
          • Partager sur Facebook
          • Partager sur Twitter
            27 juillet 2007 à 14:37:47

            Dans la demo les cibles sont statiques...Le système de tir dans la demo est très imparfait...Imagine une rocket, et une cible mouvante...
            J'aimerais quand je tire ma rocket que si le bot a bougé entre temps, la rocket ne lui explose quand même pas à la figure...
            • Partager sur Facebook
            • Partager sur Twitter
              27 juillet 2007 à 19:53:40

              Pour getCollisionPoint va voir ici

              Cette méthode utilise aussi un triangle selector, comme sa tout le monde est d'accord ^^
              Si je ne me trompe pas tu envoie une ligne virtuel(la direction ou tu pointe) et en gros la fonction teste si cette ligne entre en collision avec le selector(plusieurs triangle définie par ISceneManager::createTriangleSelector() ou par ISceneManager::createTriangleOctTreeSelector()).
              Si collision il y a le troisième argument(un vecteur 3D) se vois attribuer la position du point de collision le plus proche.
              Le quatrième argument se voit attribué le triangle avec lequel la ligne est entrée en collision, si collision il y a ^^

              Une fois que tu as fait sa tu connais le point de collisions entre ta visée et ta cible, c'est bien beau mais si ta cible bouge et bah elle explose quand même :p
              Pour y remedier il suffit de faire avancer la rocket jusqu'elle rencontre un obstacle(a moins que tu ne lui fixe une durée de vie), là tu teste si la position de ta rocket avoisine celle du point de collision.
              Je dis avoisine parceque une position exacte serat casiment toujours fausse, il vaut mieux tester si elle est comprise dans un cercle qui à pour rayon la largeur de ta roquette ;)

              Le mieux serais encore de rester un point de collision entre la roquette(et non la camera) et la cible a chaque fois qu'elle avance, parceque si elle bouge ton point définie précédement ne seras peut être plus dans le cecle mais un point plus sur l'exterieur de la cible lui le serat peut être ;)

              Voila je pense que sa pourrat aider.
              N'oublie pas de regarder la doc, je viens de la lire, je ne connait pas Irrlicht par coeur ;)
              • Partager sur Facebook
              • Partager sur Twitter
                28 juillet 2007 à 11:48:34

                Merci beaucoup !
                J'y vois plus clair.
                Avec cette methode, si je veux tirer plusieurs rockets, en m^me temps, ca risque pas de ralentir énormément le jeu de tester les collisions à chaque boucle, non ?
                De plus, pour tirer plusieurs rockets, ne faut il pas un tableau dynamique ?
                • Partager sur Facebook
                • Partager sur Twitter
                  28 juillet 2007 à 11:53:11

                  Si sa ralentis de tester a chaqe tout de boucle, après faut trouver une méthode plus optimiser, en limitant le nombre de testedans le temps par exemple.

                  Pour la gestion de plusieurs roquet tu peut faire une liste d'instance de classe roquette que tu stocke dans un conteneur(std::map, std::list..)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 octobre 2007 à 14:21:12

                    euuu tu pourais envoyer le code final car je comprend pas comment l'utiliser


                    merci a toi
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Irrlicht] Tir + collision

                    × 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