IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenSceneGraph Discussion :

Comment gérer les collisions ?


Sujet :

OpenSceneGraph

  1. #1
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut Comment gérer les collisions ?
    Bonjour à tous.

    Voila notre tank avance, recule, tourne... mais il arrive même à traversé le décor !
    Donc mes questions sont :

    - comment gérer les collision avec OSG ?
    - existe il des librairie gérant les collisions, et ainsi ne pas tout recréer ?
    - sinon auriez vous des idées pour cette gestion ?

    Merci a vous !

  2. #2
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Hello,

    Actuellement, osg n'est qu'un moteur de rendu, donc il n'a pas pour vocation de gerer la physique...
    Cependant, tu as acces au intersectors qui permettent le lancer de rayon ou les intersections entre bounding shperes...

    Donc soit tu integre un moteur de physique (genre ODE, ce qui a déjà été fait avec OSG mais je ne me rapelle plus le nom de la lib qui fait ça)
    Soit tu use de callbacks et d'intersections pour gerer ça manuellement.

    Si c'est des choses simples, c'est fesable manuellement ... à toi de juger.
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  3. #3
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Salut ange_blond !

    Je pense m'attardé plus tôt sur les callback, car il reste peu de temps... on doit rendre le projet dans une semaine... c'est court.

    Heu niveau callback pourrais-tu me donner un peu d'aide ?

    J'ai suivi le post sur les callback de white.staff, mais je voudrais avoir confirmation:

    alloccation + boundingsphere:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tankNode = osgDB::readNodeFile("../NPS_Data/Models/t72-tank/t72-tank_des.flt");
       //gestion collision
       const osg::BoundingSphere& bs1 = (tankNode->getBound());
     
     apoloNode = osgDB::readNodeFile("./273689main_lunarlandernofoil_c/lunarlandernofoil_carbajal.3ds");
       //gestion collision
       const osg::BoundingSphere& bs2 = apoloNode->getBound();

    Voici ma fonction collision:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    bool Collision(const osg::BoundingSphere& bs10 ,const osg::BoundingSphere& bs20  )
    {
     
    	if(bs10.intersects(bs20))
    	{
    		std::cout << "COLLISION ! COLLISION ! "<< std::endl;
        runtran(-5.);  
     
    		return true;	
    	}
    	return false;
    }
    le callback:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class colliCallback : public osg::NodeCallback 
        {
        public:
           virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
           {
              osg::ref_ptr<osg::Geode> geode = 
              dynamic_cast<Geode*> (node);
              if(!geode.valid())
              {
                  Collision(bs2,bs1);
              }
           }
        };


    Qu'en pense tu ?

    Merci pour ta réponse rapide en tout cas !

  4. #4
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Citation Envoyé par Dodin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tankNode = osgDB::readNodeFile("../NPS_Data/Models/t72-tank/t72-tank_des.flt");
       //gestion collision
       const osg::BoundingSphere& bs1 = (tankNode->getBound());
     
     apoloNode = osgDB::readNodeFile("./273689main_lunarlandernofoil_c/lunarlandernofoil_carbajal.3ds");
       //gestion collision
       const osg::BoundingSphere& bs2 = apoloNode->getBound();
    Attention, les BS ne sont pas necessairement const. elle peuvent evoluer au fil du temps si ton objet se modifie dynamiquement.

    Citation Envoyé par Dodin Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class colliCallback : public osg::NodeCallback 
        {
        public:
           virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
           {
              osg::ref_ptr<osg::Geode> geode = 
              dynamic_cast<Geode*> (node);
              if(!geode.valid()) //soucis ... 
              {
                  Collision(bs2,bs1);
              }
           }
        };
    Tu teste la collision si c'est pas une geode ? pourquoi ça ?
    Les BS sont dispo sur les nodes... elles couvrent toute les gometries des enfants du node en question. tu peux donc les utiliser sur les geodes, comme sur les groups, transform ... donc je ne vois pas pourquoi tu teste le type de node.

    ensuite, Collision(bs1,bs2) retourne un bool donc fait en quelque chose.
    Le soucis là c'est que tu teste la collision entre 2 BS const, dans une scene dynamique...

    Je verrais plutot qqch comme ça moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    class colliCallback : public osg::NodeCallback 
        {
        public:
             colliCallback(osg::Node* node)
             {
                  intersectornode = node;
             }
     
           virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
           {
              if(intersectornode)
                 if( Collision(node->getBound(),intersectornode->getBound());)
                 {
                      std::cout << "BOUM" << std::endl;
                 }
           }
     
    private:
           osg::ref_ptr<osg::Node> intersectornode;
     
        };
     
     
    //...
     
    tank->setUpdateCallback(new colliCallback(oploNode.get()); //ou inversement, peu importe dans ce cas.
    Voilà.
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  5. #5
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Salut ange blond !

    En tout cas un grand merci à toi, sans quoi notre projet ne serai pas la ou il en est ! Désolé pour mon code j'ai essayé de faire de mon mieux .

    Nous devons rendre notre projet Lundi midi, code, rapport, présentation... donc je vais utiliser ton callback pour faire exploser, différents modèles posés sur la map. (détection collision puis explosion avec osgparticle)

    J'ai posé un post sur un shoot à partir du tank sur des bâtiment, car même si on rend le projet cela serait intéressant d'ajouter cette fonctionnalité!

    Merci à toi encore un fois !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. jeu de platte forme 2D : comment gérer les collisions
    Par dawadam dans le forum Physique
    Réponses: 12
    Dernier message: 27/06/2008, 16h43
  2. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 10h40
  3. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h02
  4. Méthode simple pour gérer les collisions
    Par Hyoga dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/02/2005, 13h43
  5. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo