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 :

Problème pour les collisions avec la caméra


Sujet :

OpenSceneGraph

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 506
    Par défaut Problème pour les collisions avec la caméra
    salut,

    j'ai pas mal de difficulté avec les callback ,

    voici le code principale du 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /* 
     * File:   updateCollision.h
     * Author: modde
     *
     * Created on 16 février 2010, 23:48
     */
     
    #ifndef _UPDATECOLLISION_H
    #define    _UPDATECOLLISION_H
     
    #include <osg/NodeCallback>
    #include <osg/Geode>
    #include "camera.h"
     
     
    class updateCollision : public osg::NodeCallback {
    public:
        updateCollision( Camera * cam, osg::Geode geode, osg::BoundingBox &bb);
     
        Camera * camera;
        osg::BoundingBox & bbhouse;
        osg::ref_ptr<osg::Geode> personnage;
     
        void operator()( osg::Node* node, osg::NodeVisitor* nv ){
     
            if((personnage.get().getBoundingBox().intersect(bbhouse))&&camera->moveForward()){
     
                camera->stopMoveForward();
            }
            if((personnage.get().getBoundingBox().intersect(bbhouse))&&camera->moveBack()){
                camera->stopMoveback();
            }
     
            if((personnage.get()->getBoundingBox().intersect(bbhouse))&&camera->moveRight()){
                camera->stopMoveRight();
            }
     
            if((personnage.get().getBoundingBox().intersect(bbhouse))&&camera->moveleft()){
                camera->stopMoveLeft();
            }
        }
    };
     
    #endif    /* _UPDATECOLLISION_H */
    le fichier cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "updateCollision.h"
     
    updateCollision::updateCollision(Camera* cam, osg::Geode geode, osg::BoundingBox &bb) {
        camera = cam;
        personnage =geode;
        bbhouse =bb;
     
    }
    j'ai l'erreur suivante :
    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
    updateCollision.h: In member function ‘virtual void updateCollision::operator()(osg::Node*, osg::NodeVisitor*)’:
    In file included from updateCollision.cpp:8:
    updateCollision.h:26: error: request for member ‘getBoundingBox’ in ‘((updateCollision*)this)->updateCollision::personnage.osg::ref_ptr<T>::get [with T = osg::Geode]()’, which is of non-class type ‘osg::Geode*’
    updateCollision.h:30: error: request for member ‘getBoundingBox’ in ‘((updateCollision*)this)->updateCollision::personnage.osg::ref_ptr<T>::get [with T = osg::Geode]()’, which is of non-class type ‘osg::Geode*’
    updateCollision.h:34: error: no match foroperator&&’ in ‘((const osg::BoundingBox*)((updateCollision*)this)->updateCollision::personnage.osg::ref_ptr<T>::get [with T = osg::Geode]()->osg::Geode::getBoundingBox())->osg::BoundingBoxImpl<VT>::intersect [with VT = osg::Vec3f](((const osg::BoundingBoxImpl<osg::Vec3f>&)((const osg::BoundingBoxImpl<osg::Vec3f>*)((updateCollision*)this)->updateCollision::bbhouse))) && ((updateCollision*)this)->updateCollision::camera->Camera::moveRight()’
    updateCollision.h:34: note: candidates are: operator&&(bool, bool) <built-in>
    updateCollision.h:38: error: request for member ‘getBoundingBox’ in ‘((updateCollision*)this)->updateCollision::personnage.osg::ref_ptr<T>::get [with T = osg::Geode]()’, which is of non-class type ‘osg::Geode*’
    updateCollision.cpp: In constructor ‘updateCollision::updateCollision(Camera*, osg::Geode, osg::BoundingBox&)’:
    updateCollision.cpp:10: error: uninitialized reference member ‘updateCollision::bbhouse’
    updateCollision.cpp:12: error: no match foroperator=’ in ‘((updateCollision*)this)->updateCollision::personnage = geode’
    /usr/local/include/osg/ref_ptr:35: note: candidates are: osg::ref_ptr<T>& osg::ref_ptr<T>::operator=(const osg::ref_ptr<T>&) [with T = osg::Geode]
    /usr/local/include/osg/ref_ptr:47: note:                 osg::ref_ptr<T>& osg::ref_ptr<T>::operator=(T*) [with T = osg::Geode]
    make[2]: *** [build/Debug/GNU-Linux-x86/updateCollision.o] Erreur 1
    make[2]: quittant le répertoire « /home/modde/NetBeansProjects/Camera »
    make[1]: *** [.build-conf] Erreur 2
    make[1]: quittant le répertoire « /home/modde/NetBeansProjects/Camera »
    make: *** [.build-impl] Erreur 2
    BUILD FAILED (exit value 2, total time: 2s)
    merci !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 506
    Par défaut
    désolé, j'ai pas mal de probleme a apréhender osg .et peut de pratique en c++



    explication de mon callback :


    1) j'ai creé un cube qui se rattache au mouvement de la camera : simplement :

    les coordonnées X et Y : longueur et largeur .


    2) je crée un boundingBox a mon cube

    3) dans la scene j'ai crée un boundingbox a une maison .


    le callback :

    la variable geode represente mon cube .

    la variable camera represente la camera.

    la variable bbhouse represente le boundingbox de la maison


    test :

    si la boundingbox de mon cube intercepte la boundingbox de la maison et que j'appuis sur la touche avant "mouvement de la camera" : je stop le movement avant.

    si la boundingbox de mon cube intercepte la boundingbox de la maison et que j'appuis sur la touche arriere "mouvement de la camera": je stop le movement en arriere.

    ainsi de suite .




    merci !

  3. #3
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 901
    Par défaut
    Heu avant tout, oublie pas le tag [osg] si tu veux attirer l'attention des personnes qui peuvent te répondre.

    Ensuite, tes erreurs de compilation sont justifiées, tu utilise l'operateur . au lieu de ->

    Ensuite, le .get() n'est pas indispensable pour les osg::ref_ptr<>
    l'operateur . sur l'objet renvoie les méthodes du ref_ptr, l'opérateur -> sur les méthodes du node/geode/group/... lui meme.

    Moi je le tenterais donc ainsi :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /* 
     * File:   updateCollision.h
     * Author: modde
     *
     * Created on 16 février 2010, 23:48
     */
     
    #ifndef _UPDATECOLLISION_H
    #define	_UPDATECOLLISION_H
     
    #include <osg/NodeCallback>
    #include <osg/Geode>
    #include "camera.h"
     
     
    class updateCollision : public osg::NodeCallback {
    public:
        updateCollision( Camera * cam, osg::Geode geode, osg::BoundingBox &bb);
     
        Camera * camera;
        osg::BoundingBox & bbhouse;
        osg::ref_ptr<osg::Geode> personnage;
     
        void operator()( osg::Node* node, osg::NodeVisitor* nv ){
     
            if((personnage->getBoundingBox().intersect(bbhouse))&&camera->moveForward()){
     
                camera->stopMoveForward();
            }
            if((personnage->getBoundingBox().intersect(bbhouse))&&camera->moveBack()){
                camera->stopMoveback();
            }
     
            if((personnage->getBoundingBox().intersect(bbhouse))&&camera->moveRight()){
                camera->stopMoveRight();
            }
     
            if((personnage->getBoundingBox().intersect(bbhouse))&&camera->moveleft()){
                camera->stopMoveLeft();
            }
        }
    };
     
    #endif	/* _UPDATECOLLISION_H */



    Citation Envoyé par Asmod_D Voir le message
    1) j'ai creé un cube qui se rattache au mouvement de la camera : simplement :

    les coordonnées X et Y : longueur et largeur .
    Heuu pô compris comment ça marche ton truc là...

    Citation Envoyé par Asmod_D Voir le message
    si la boundingbox de mon cube intercepte la boundingbox de la maison et que j'appuis sur la touche avant "mouvement de la camera" : je stop le movement avant.

    si la boundingbox de mon cube intercepte la boundingbox de la maison et que j'appuis sur la touche arriere "mouvement de la camera": je stop le movement en arriere.

    Perso, pour avoir déjà implémenter qqch dans ce genre là j'ai fait un poil plus simple:
    dans le callback, je créé une bounding sphere autour de la position actuelle de la camera, et je teste la collision avec mon truc dans la scene. (qui était aussi une sphere ça tombe bien)
    Suite à quoi, une fois la collision détectée, je calculais la réaction de la collision sphere-sphere en déplaçant la camera un poil, ce qui au final fait glisser la camera sur la sphere en fonction de la direction dans laquelle elle se dirige.

    En gros tu as pas besoin de créer un cube autour de ta camera. tu peux juste créé une boundingsphere/cube dans le callback avant de faire le test de collision.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 506
    Par défaut
    Salut Ange_blond,


    merci mais j'ai quelques problemes à implementer mon callback

    le premier callback que j'avais crée prenait la fonction osg:: PositionAttitudetransform ,il y avait pas de probleme pour l'implémenter avec osg:: PositionAttitudeTransform qui possede une fonction de retour de callback :
    setsetUpdateCallback( );


    1) pour le callback updateCollision , je ne sais pas ou je dois l'implémenter ?


    2)comme t'as pu le constater ,je ne suis pas trés doué en c++ :

    j'aurais voulu savoir lorsque que l'on crée un pointeur ou une allocation dynamique exemple : Camera * camera = new Camera();

    lorsqu'il y a plusieurs methodes qui se suivre faut 'il faire un . ou un ->

    ex:
    camera->getcamera()->getmove();

    ou

    camera->getcamera().getmove();


    3)peut 'on crée autant de callback que l'on veut ou y'a t'il une limite ?.




    désolé, merci !

  5. #5
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 901
    Par défaut
    Citation Envoyé par Asmod_D Voir le message
    le premier callback que j'avais crée prenait la fonction osg:: PositionAttitudetransform ,il y avait pas de probleme pour l'implémenter avec osg:: PositionAttitudeTransform qui possede une fonction de retour de callback :
    setsetUpdateCallback( );
    Toute classe qui herite de osg::Node a la méthode setUpdateCallaback().
    Donc tous les groups, transform, etc... ont cette méthode

    Citation Envoyé par Asmod_D Voir le message
    1) pour le callback updateCollision , je ne sais pas ou je dois l'implémenter ?
    Une fois que tu as écrit ton callback, tu fait un setUpdateCallabck sur un node. tu peux donc mettre ton callback sois sur la camera, sois sur l'objet sur lequel tester les collisions.
    Le callback a 2 parametres dont un Node*, qui est le node auquel tu as attaché le dit callback. donc tu as acces au node courant, et il suffit d'ajouter un champ avec un pointeur sur l'autre node et tu as tout ce qu'il faut pour tester tes collisions.

    Citation Envoyé par Asmod_D Voir le message
    2)comme t'as pu le constater ,je ne suis pas trés doué en c++ :

    j'aurais voulu savoir lorsque que l'on crée un pointeur ou une allocation dynamique exemple : Camera * camera = new Camera();

    lorsqu'il y a plusieurs methodes qui se suivre faut 'il faire un . ou un ->

    ex:
    camera->getcamera()->getmove();

    ou

    camera->getcamera().getmove();
    En effet c'est les bases du C++, auquelles osg ajoute la notion de ref_ptr.
    Pour faire simple, les ref_ptr sont juste une aide à la gestion de la mémoire. ils ne sont pas obligatoires, mais sans eux tu t'expose à des fuites mémoire.
    Toute classe qui herite de osg::Referenced peut etre utilisée avec des ref_ptr.
    Les ref_ptr sont une maniere de ne jamais avoir à apeller delete sur tes objets.
    Plutot que me lancer dans une explication pas claire, je t'encourage à parcourir au moins en diagonale ce document : http://andesengineering.com/OSG_Prod...fPointers.html

    Ensuite, pour le probleme de savoir quand utiliser . ou -> je t'encourage à revenir au bases du C++. l'operateur . donne acces aux méthodes et membres si ton objet n'est pas un pointeur, et l'operateur-> donne acces aux membres et méthodes si ton objet et un pointeur.

    Tres (tres) Grossierement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    osg::Camera camLocal = osg::Camera;
    camLocal.setUpdateCallback(...);
     
    osg::Camera* cam = new osg::Camera:
    cam->setUpdateCallback(...);
    //ou
    (*cam).setUpdateCallback(...);

    Citation Envoyé par Asmod_D Voir le message
    3)peut 'on crée autant de callback que l'on veut ou y'a t'il une limite ?.
    Chaque node peut avoir un callback. si il a un callback il est possible d'ajouter un NestedCallaback. Pas plus.
    Il existe les UpdateCallback, EventCallback, Cullcallback qui correspondent chacun à un parcours du graph en préparation du rendu.
    L'update callback est le "standart" mais pour des chose plus avancées tu peux utiliser les autres.


    J'espere avoir répondu à toutes tes questions.

    Ange_blond.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2010, 09h37
  2. [encoding] Problème pour les fichiers XML avec notepad
    Par lehamster dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 21/11/2006, 15h56
  3. [VB.NET]Problème pour les feuilles MDI
    Par Skieur38 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/02/2006, 14h10
  4. Réponses: 1
    Dernier message: 30/11/2005, 14h57

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