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 :

Manipulation d'une partie d'un objet 3d.


Sujet :

OpenSceneGraph

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut Manipulation d'une partie d'un objet 3d.
    Bonjour,

    En utilisant des exemples d'osg, (l'exemple où on peut avoir de une a trois vue de la même scène!) J'ai remarquer que dans la vue 2 qui intègre un PickHandler, lorsque je clic sur mon robot (au format .obj). La partie sur laquelle j'ai cliqué se met en surbrillance. Elle représente en fait la forme utiliser lors de la conception du robot. Pour exemple, mon robot dispose d'un bras en deux parties,(avant bras et bras, attachés par un coude) donc lorsque je clic sur l'une d'elle, elle se met en surbrillance. Ma question est donc de savoir si il est possible d'agir directement sur cette partie afin par exemple de faire plier le bras. Car cela me simplifira grandement la tache, car je n'aurai plus a importer pièce par pièce mais je pourrais directement importer ma conception.

    Merci d'avance.

  2. #2
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Personne ne peut m'aider ou peut être je me suis mal exprimé??

  3. #3
    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 : 38
    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
    lorsque tu importe ton modele, s'il est bien geré, ton graph sera composé de group reliés par des PAT (PositionAtitudeTransform).

    Un PAT c'est un quaternion et un vecteur...

    si tu modifie ces derniers, tu bouge ton modele... Reste à récuperer ton PAT... mais avec la structure de graph c'est pas dur sous OSG...
    "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"

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    En fait le problème ce n'est pas de faire bouger mon modèle entier. Mais c'est de faire bouger simplement une partie du modèle.

    Quand j'utilise un pickhandler() (pris dans l'exemple picking) sur mon modèle, je vois apparaître l'une des formes utilisées pour mon modèle. Et j'aimerai pouvoir agir juste sur cette forme et non le modèle entier. Par exemple faire plier juste une partie d'un bras.

  5. #5
    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 : 38
    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
    en fait selon moi tu mélange 2 notions, ou alors tu n'est pas assez précis

    par plier tu entend : déformer la géométrie existante ? ou faire pivoter une géométrie par rapport à une autre ?

    selon moi c'est le second cas.. et donc imagine la structure en arbre suivante :

    bras -->PAT-->avant-bras.

    Si tu modifie l'angle et l'axe de rotation du quaternion de ton PAT, alors ton avant bras va pivoter par rapport à ton bras (PAT est en relatif par défaut).
    "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"

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    En effet je ne parle pas de déformer la géométrie. Je parle de faire bouger une partie par rapport à une autre. Le problème n'est pas d'utiliser le PAT, mais d'agir directement sur la forme du bras.

    Voila le code:

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     #include <iostream>
    #include <osgDB/ReadFile>
    #include <osgViewer/Viewer>
    #include <osgFX/Scribe>
    #include <osg/Geode>
    #include <osg/Drawable>
    #include <osg/NodeVisitor>
     
     
    // class to handle events with a pick
    class PickHandler : public osgGA::GUIEventHandler {
    public: 
     
        PickHandler():
            _mx(0.0f),
            _my(0.0f) {}
     
        ~PickHandler() {}
     
        bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
        {
            osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
            if (!view) return false;
     
            switch(ea.getEventType())
            {
                case(osgGA::GUIEventAdapter::PUSH):
                {
                    _mx = ea.getX();
                    _my = ea.getY();
                    break;
                }
                case(osgGA::GUIEventAdapter::RELEASE):
                {
                    if (_mx==ea.getX() && _my==ea.getY())
                    {
                        pick(view, ea.getX(), ea.getY());
                    }
                    break;
                }
                default:
                    break;
            }
            return false;
        }
     
        void pick(osgViewer::View* view, float x, float y)
        {
     
            osg::Node* node = 0;
            osg::Group* parent = 0;
     
            osgUtil::LineSegmentIntersector::Intersections intersections;
            if (view->computeIntersections(x, y, intersections))
            {
                osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
                osg::NodePath& nodePath = intersection.nodePath;
                node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
                parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;
            }        
     
            // now we try to decorate the hit node by the osgFX::Scribe to show that its been "picked"
            if (parent && node)
            {
     
                osgFX::Scribe* parentAsScribe = dynamic_cast<osgFX::Scribe*>(parent);
                if (!parentAsScribe)
                {
                    // node not already picked, so highlight it with an osgFX::Scribe
                    osgFX::Scribe* scribe = new osgFX::Scribe();
                    scribe->addChild(node);
                    parent->replaceChild(node,scribe);
     
                    // à retirer si il ya un problème
     
                    // Connaître le nom du noeud
                    std::cout<<"le nom de la forme est: "<<node->getName()<<"\n";
     
                }
                else
                {
                    // node already picked so we want to remove scribe to unpick it.
                    osg::Node::ParentList parentList = parentAsScribe->getParents();
                    for(osg::Node::ParentList::iterator itr=parentList.begin();
                        itr!=parentList.end();
                        ++itr)
                    {
                        (*itr)->replaceChild(parentAsScribe,node);
                    }
                }
            }
     
        }
     
        float _mx, _my;
     
    };
     
    int main()
    {
        osgViewer::Viewer viewer;
     
        osg::ref_ptr<osg::Group> root(new osg::Group());
     
        osg::ref_ptr<osg::Node> cayman = osgDB::readNodeFile("data/cayman_smoby.obj");
        if(!cayman)
        {
            std::cerr << "Problem opening\n";
            exit(1);
        }
     
        root->addChild(cayman.get());
     
        viewer.setSceneData(root.get());
        viewer.addEventHandler(new PickHandler());
     
        viewer.realize();
        viewer.run();
     
        system("PAUSE");
        return 0;
     
    }
    Comme vous pouvez le voir sur la photo, j'arrive à mettre en surbrillance une partie du bras (grâce à au code ci-dessus). Et mon but est de faire bouger cette partie du bras sans faire bouger les autres partie. Sachant que je charge le modèle complet et non partie par partie.

    Images attachées Images attachées  

  7. #7
    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 : 38
    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
    Alors on revient bien sur un point important :

    il faut vérifier que ton modele est bien composé de groups et de PAT... donc pour etre sur exporte le en .osg et ouvre le et tu verra la structure du graph.

    Ensutie et si c'est bon, alors au moment où tu pick ton node, tu as le pointeur sur lui. en cherchant dans ses parents tu peux remonter au PAT le plus proche, et ensuite comme je le disais modifier les parametres du PAT. et le tour est joué.

    PS : balise CODE stp...
    "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"

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Mais je n'ai pas trouvé de PAT.

    J'obtiens ce genre de chose:

    Group {
    name "cayman_smoby.obj"
    nodeMask 0xffffffff
    cullingActive TRUE
    num_children 11
    Geode {
    name "1"
    nodeMask 0xffffffff
    cullingActive TRUE
    num_drawables 1
    Geometry {
    etc....

    En fait chaque geode correspond à une partie de mon robot. Mais je sais pas si il est possible de la faire bouger. J'arrive à obtenir les adresses des différentes geode.

  9. #9
    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 : 38
    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
    donc apparement, apres ton import, ton modele n'est pas mobile du tout, et aucun point de pivot n'est geré....

    donc 2 solutions à ça :
    • Soit tu modifie ton modele et défini des relations de parenté et de mobilité, et tu exporte ensuite ton modele en .ive depuis osgexp (avec 3DS ça marche tres bien, tu peux meme importer des animations...)
    • Soit tu définit ta hiérarchie toi meme depuis OSG, en reprenant des geodes et en les "classant" et construisant un nouveau graph basé sur des PAT mais ça sous entend que tu dois connaitre les noms des geodes de ton modele et que tu connais la hiérarchie à obtenir...


    ensuite tu auras enfin le bon graph et tu pourra faire ce qu'on disait plus haut...
    "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"

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Donc en gros je devrais rechargé mon modèle pièce par pièce et redéfinir toutes leurs positions ainsi que leur. Ou au contraire je peut réutiliser mon modèle déjà charger et y appliqué les PAT nécessaires??

  11. #11
    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 : 38
    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
    a mon avis si tu t'y prend correctement, tu peux utiliser le modele chargé... le point pénible sera de calculer les positions relative (ou alors la mettre en absolu) pour les PAT mais ça reste tout à fait fesable aussi !

    tu charge tout, isole les Geode, et les attache aux PAT que tu créé selon ta hiérarchie, et positionne les PAT comme il faut.... pi 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"

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    En fait selon toi je pourrais récupérer les geodes du modèle charger (sachant que le modèle 3d complet est créé par un autre logiciel) et redéfinir mon arbre comme je le souhaite!!

  13. #13
    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 : 38
    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
    Bien sur.

    D'apres ton fichier ta strucure est la suivante : un group, et ce groupe a pour enfant toutes tes géodes.
    Donc tu parcours les enfant du group, tu créé en parallele ton graph et tu ajoute au fur et à mesure tes geodes dans ton nouveau graph.
    C'est juste un jeu de pointeurs...

    Ce que je veux t'expliquer, c'est que ta géométrie est déjà créé, donc tu n'a pas à manipuler les vertices et autres... il "suffit" de créer une petite routine qui va extraire du graph actuel tes données pour les remettre dans le grpah de ton choix...
    "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"

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    J'ai réussi à récupérer mes formes. Je leur ai rajouté un PAT à toutes, mais maintenant j'ai un autre problème qui se pose. En effet je n'arrive pas à gérer leur positions. En fait quand je fais un setposition rien ne se passe et un setAttitude fonctionne mais pas comme je le voudrais. J'ai l'impression que le point de pivot n'est pas bon, mais quand j'essaye de le changer rien ne se passe.

    Peut être que j'ai mal récupérer mes formes?

    Voilà le bout de code pour ma récupération de forme.
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    class MyVisitor : public osg::NodeVisitor
    {
    public:
    	MyVisitor() : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN)
    	{ 
    		myNode = new osg::Group();
    		node11PAT = new osg::PositionAttitudeTransform();
    		node13PAT = new osg::PositionAttitudeTransform();
    		node15PAT = new osg::PositionAttitudeTransform();
    		myNodePAT = new osg::PositionAttitudeTransform();
    		myNodePAT->addChild(myNode);
     
     
    	}
     
    	virtual void apply(osg::Geode &node)
    	{
     
    		std::cout << "nom du noeud: " << node.getName() <<"\n";
    		if(node.getName() == "15")
    		{
    			std::cout << "la piece 15\n";
     
    			node15PAT->setAttitude(osg::Quat(1.57,osg::Vec3(0.0,0.0,1.0)));
    			node15PAT->setPosition(osg::Vec3(10.0, 10.0, 10.0));
    			myNode->addChild(node15PAT);
    			node15PAT->addChild(&node);
     
    		}
     
    		if(node.getName() == "13")
    		{
    			std::cout << "la piece 13\n";
    			myNode->addChild(node13PAT);
    			node13PAT->addChild(&node);
    			node13PAT->setReferenceFrame(osg::Transform::RELATIVE_RF);
    			//node13PAT->setPosition(node15PAT->getPosition());
    			//node13PAT->setAttitude(osg::Quat(1.0,osg::Vec3(0.0,0.0,1.0)));
     
    		}
     
    		if(node.getName() == "11")
    		{
    			std::cout << "la piece 11\n";
    			myNode->addChild(node11PAT);
    			node11PAT->addChild(&node);
    			//node13PAT->setPivotPoint(node13PAT->getPosition());
    			node11PAT->addChild(node13PAT);
    		}
    	}
     
    	virtual void apply(osg::Node &node)
    	{
    		std::cout << "It's just a boring, non-geode node.\n";
    		traverse(node); 
    	}
     
    	virtual void apply(osg::Group &node)
    	{
    		std::cout << "It's a group Node and his name is: " << node.getName() <<"\n";
    		traverse(node);
    	}
     
    	osg::Group *getMyNode()
    	{
    		return myNode;
    	}
     
    private:
    	osg::Group *myNode;
    	osg::PositionAttitudeTransform *node15PAT;
    	osg::PositionAttitudeTransform *node13PAT;
    	osg::PositionAttitudeTransform *node11PAT;
    	osg::PositionAttitudeTransform *myNodePAT;
    };
    et mon main:
    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
     
    int main()
    {
    	osgViewer::Viewer viewer;
     
    	osg::ref_ptr<osg::Group> root(new osg::Group());
     
    	osg::ref_ptr<osg::Node> cayman = osgDB::readNodeFile("data/cayman_smoby.osg");
    	if(!cayman)
    	{
    		std::cerr << "Problem opening\n";
    		exit(1);
    	}
     
     
    	//root->addChild(cayman.get());
     
    	MyVisitor mv;
    	cayman->accept(mv);
    	root->addChild(mv.getMyNode());
     
    	viewer.setSceneData(root.get());
    	viewer.addEventHandler(new PickHandler());
     
    	viewer.realize();
    	viewer.run();
     
    	//system("PAUSE");
    	return 0;
     
    }
    PS:Le code n'est peut etre pas super propre mais j'effectue des tests pour pouvoir faire une conception objet beaucoup plus propre.

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    J'ai oublier de montrer le problème en image désolé. Comme vous pouvez le voir le centre de rotation n'est pas le bon (j'ai utilisé un setAttitude de 0.5 au lieu de 1.57). Et le setPosition ne sert strictement a rien.
    Images attachées Images attachées  

  16. #16
    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 : 38
    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
    heuu je ne suis pas familier avec les nodevisitor, alors je suppose que ton code est bon...

    Sinon toujours pareil, exporte ton nouveau graph en fichier et vérifie si la hiérarchie est bien celle que tu attend.

    ensuite, le point de pivot est défini par l'axe de rotation (il me semble) et celui ci est défini par le quaternion du PAT... donc écrit le bon quaternion.

    Par contre pour le set Position, moi je n'ai jamais eu de soucis donc je vois pas trop là comme ça...
    "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"

  17. #17
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Si tu n'utilise pas les noeuds alors comment tu fais pour récupérer les différentes geodes d'un modèles??

  18. #18
    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 : 38
    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
    si j'utilise les noeuds, mais pas avec un visitor.

    je me fait mes petites boucles à la main genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i = 0 ; i < group->getNumChildren(); ++i)
        PAT->addchild(group->getchild(i))
    enfin ce genre de choses quoi...
    "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"

  19. #19
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    J'ai refait un code en utilisant une autre façon de retrouver les child et j'obtient la même chose. Le pire c'est que quand je change setReferenceFrame de relative en absolue, ma pièce disparais.

    Voilà mon nouveau code:

    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
    45
    46
    47
     
    #include <iostream>
    #include <osgDB/ReadFile>
    #include <osgViewer/Viewer>
    #include <osgFX/Scribe>
    #include <osg/Geode>
    #include <osg/Geometry>
    #include <osg/Drawable>
    #include <osg/NodeVisitor>
    #include <osgSim/DOFTransform>
    #include <osg/Node>
    #include <osg/Billboard>
    #include <osg/PositionAttitudeTransform>
     
    #define NUMOFPART 11
    int main()
    {
    	osgViewer::Viewer viewer;
     
    	osg::ref_ptr<osg::Group> root(new osg::Group());
     
    	osg::Group *cayman = dynamic_cast<osg::Group*>(osgDB::readNodeFile("data/cayman_smoby.osg"));
    	if(!cayman)
    	{
    		std::cerr << "Problem opening\n";
    		exit(1);
    	}
     
    	osg::ref_ptr<osg::PositionAttitudeTransform> part8PAT(new osg::PositionAttitudeTransform());
    	osg::ref_ptr<osg::PositionAttitudeTransform> part9PAT(new osg::PositionAttitudeTransform());
     
    	part8PAT->addChild(cayman->getChild(8));
    	part9PAT->addChild(cayman->getChild(9));
    	part9PAT->setReferenceFrame(osg::Transform::ABSOLUTE_RF_INHERIT_VIEWPOINT);
     
    	root->addChild(part9PAT.get());
    	root->addChild(part8PAT.get());
     
    	part9PAT->setPosition(osg::Vec3(0.0, 0.0, 0.0));
     
    	viewer.setSceneData(root.get());
     
    	viewer.realize();
    	viewer.run();
     
    	return 0;
    }
    et je remet aussi le début du fichier osg:
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    Group {
      name "cayman_smoby.obj"
      nodeMask 0xffffffff
      cullingActive TRUE
      num_children 11
      Geode {
        name "1"
        nodeMask 0xffffffff
        cullingActive TRUE
        num_drawables 1
        Geometry {
          DataVariance STATIC
          useDisplayList TRUE
          useVertexBufferObjects FALSE
          PrimitiveSets 113
          {
            DrawElementsUShort TRIANGLE_STRIP 4
            {
              9 10 8 13 
            }
            DrawElementsUShort TRIANGLE_STRIP 4
            {
              13 10 14 16 
    ...........
     
      DrawElementsUShort TRIANGLES 30
            {
              34 35 30 72 73 74 163 164 151 166
              167 168 170 171 172 64 174 71 161 272
              162 343 344 339 350 349 3 423 413 416
            }
          }
          VertexArray Vec3Array 428
          {
            62.0053 226.617 178.5
            62.0053 341.17 52
            62.0053 94.1698 52
            -0.994714 154.17 52
            62.0053 94.1698 52
            62.0053 341.17 52
            62.0053 -255.846 -125
            62.0053 94.1698 -115
    ....................
       134.658 -108.086 237.5
            156.685 -236.01 237.5
            104.005 -257.83 237.5
            73.3523 -108.086 237.5
          }
          NormalBinding PER_VERTEX
          NormalArray Vec3Array 428
          {
            -1 -0 0
            -1 -0 0
            -1 -0 0
            0 -0 1
            0 -0 1
            0 -0 1
    ..............................................
        0 0 1
            0 0 1
            0 0 1
            0 0 1
            0 0 1
          }
          TexCoordArray 0 Vec2Array 428
          {
            0.056396 0.3308
            0.154696 0.354116
            0.087387 0.11709
            0.121533 0.480409
            0.087387 0.11709
            0.154696 0.354116
    ...........................
           }
    Peut être que je devrais descendre encore plus loin dans la hiérarchie et récupérer le geometry ou directement les vertices.

  20. #20
    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 : 38
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Group {
      name "cayman_smoby.obj"
      nodeMask 0xffffffff
      cullingActive TRUE
      num_children 11
      Geode {
    a priori tu as 11 Geodes... donc ça se tient.

    Ensuite, le probleme doit venir surement de la configuration des PAT je suppose... je t'avour que là je ne vois pas trop pourquoi ça ne bouge pas comme il faut... en tout cas que ça ne bouge pas selon une cetaine cohérence...

    ton graph a l'air tout à fait bon...

    je dirais que le probleme se situe au nivau des PAT, car tes objets sont ds la scene, sont en place, et le seul soucis c'est qu'ils ne bougent pas comme il faut...

    peut etre tout simplement que tes PAT, initialisé à l'origine, positionnent leur géodes en relatif par rapport à eux... donc normal que ça bouge bizzarement. Essaye de positionner ton PAT au centre de la Bounding sphere/box de tes géodes, et fait des rotations, ça devrait tourner autour de ce centre...
    "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"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Utilisation de findobj avec condition basée sur une partie de la propriété Name de l'objet
    Par roudoudounette dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 01/11/2012, 12h43
  2. [Concept] Modifier une partie d'un objet 3D
    Par saikouk dans le forum 3D
    Réponses: 9
    Dernier message: 11/09/2009, 15h24
  3. supprimer une partie d'un objet 3D
    Par Minouchka dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 13/08/2009, 12h09
  4. Réponses: 6
    Dernier message: 05/09/2007, 17h40
  5. Réponses: 1
    Dernier message: 24/05/2007, 21h20

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