190 likes | 365 Views
OpenSceneGraph. Benoît POULARD <ben.poulard@gmail.com>. OpenSceneGraph. chargement d'un objet et ajout dans la scène positionner un objet création d'un viewer événement clavier/souris callback et visitor. Benoît POULARD <ben.poulard@gmail.com>. OpenSceneGraph.
E N D
OpenSceneGraph Benoît POULARD <ben.poulard@gmail.com>
OpenSceneGraph chargement d'un objet et ajout dans la scène positionner un objet création d'un viewer événement clavier/souris callback et visitor Benoît POULARD <ben.poulard@gmail.com>
OpenSceneGraph chargement d'un objet et ajout dans la scène positionner un objet création d'un viewer événement clavier/souris callback et visitor Benoît POULARD <ben.poulard@gmail.com>
Charger un Objet // fichier à charger std::string file(''objet.osg''); //le chargement d'un fichier retourne un pointeur sur un nœud, // si on ne peut pas charger le fichier retourne NULL osg::ref_ptr<osg::Node> model = osgDB::readNodeFile(file); if(!model) std::cout<<'' Impossible de charger ''<<file<<std::endl; // ajout du node dans le graphe osg::ref_ptr<osg::Group> root = new osg::Group(); root->addChild(model.get()); format 3D: osg, ive, 3ds, obj, flt, ... osgDB : extensible ( voir plugins osgdb_xxx) Benoît POULARD <ben.poulard@gmail.com>
OpenSceneGraph chargement d'un objet et ajout dans la scène positionner un objet création d'un viewer événement clavier/souris callback et visitor Benoît POULARD <ben.poulard@gmail.com>
Positionner un Objet somme des transformations rencontrées dans le graphe de la racine jusqu'au nœud correspondant à l'objet les transformations sont des nœuds du graphe parent enfant osg::PositionAttitudeTransform position : osg::Vec3 orientation : osg::Quat Benoît POULARD <ben.poulard@gmail.com>
Positionner un Objet RACINE Tranformation1 Soleil Terre Tranformation2 Lune Benoît POULARD <ben.poulard@gmail.com>
Positionner un Objet // racine de la scene osg::ref_ptr<osg::Group> scene = new osg::Group; // racine du sous graphe osg::ref_ptr<osg::Group> racine = new osg::Group; //on considère les objets suivant chargés correctement osg::ref_ptr<osg::Node> Soleil = osgDB::readNodeFile(''...''); osg::ref_ptr<osg::Node> Terre = osgDB::readNodeFile(''...''); osg::ref_ptr<osg::Node> Lune = osgDB::readNodeFile(''...''); // on considère les transformations suivantes correctes osg::ref_ptr<osg::PositionAttitudeTransform> transformation1 = new PositionAttitudeTransform osg::ref_ptr<osg::PositionAttitudeTransform> transformation2 = new PositionAttitudeTransform // on construit le graphe racine->addChild( Soleil.get() ); racine->addChild( transformation1.get() ); transformation1->addChild( Terre.get() ); transformation1->addChild( transformation2.get() ); transformation2->addChild( Lune.get() ); // on ajoute le sous graphe a la scene. scene->addChild( racine.get() ); Benoît POULARD <ben.poulard@gmail.com>
OpenSceneGraph chargement d'un objet et ajout dans la scène positionner un objet création d'un viewer événement clavier/souris callback et visitor Benoît POULARD <ben.poulard@gmail.com>
Création d'un Viewer // déclaration et initialisation du viewer osgViewer::Viewer viewer(arguments); // racine de la scene osg::ref_ptr<osg::Group> root = new osg::Group(); // on passe la scene au viewer viewer.setSceneData(root.get()); ... permet de visualiser le rendu de la scène utilisation de osgViewer Benoît POULARD <ben.poulard@gmail.com>
Création d'un Viewer ... // init de la fenetre viewer.realize(); // on rentre dans la boucle de rendu viewer.run(); Benoît POULARD <ben.poulard@gmail.com>
OpenSceneGraph chargement d'un objet et ajout dans la scène positionner un objet création d'un viewer événement clavier/souris callback et visitor Benoît POULARD <ben.poulard@gmail.com>
événements clavier/souris osgGA type d'événement: DOUBLECLICK, DRAG, MOVE, KEYDOWN, KEYUP, FRAME, RESIZE, SCROLL, ajout d'un gestionnaire au viewer class KeyboardMouseManager : public osgGA::GUIEventHandler { public: ... virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa) Benoît POULARD <ben.poulard@gmail.com>
événement clavier/souris bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa) { switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::KEYDOWN): // appui sur une touche switch(ea.getKey()) { case osgGA::GUIEventAdapter::KEY_Left: } break; case osgGA::GUIEventAdapter::PUSH: // clic souris // coordonnées écran du clic ea.getX(); ea.getY(); break; } } Benoît POULARD <ben.poulard@gmail.com>
événement clavier/souris // initialisation du gestionnaire clavier/souris osg::ref_ptr<KeyboardMouseManager> keyboard_mouse_manager = new KeyboardMouseManager(); // ajout du gestionnaire a la liste des gestionnaire d'evenement du viewer viewer.getEventHandlers().push_front(keyboard_mouse_manager.get()); Ajout du gestionnaire au viewer Benoît POULARD <ben.poulard@gmail.com>
OpenSceneGraph chargement d'un objet et ajout dans la scène positionner un objet création d'un viewer événement clavier/souris callback et visitor Benoît POULARD <ben.poulard@gmail.com>
callback/visitor traverse le graphe de façon cyclique : callback de façon ponctuelle : visitor Benoît POULARD <ben.poulard@gmail.com>
callback/visitor // declaration d'un callback class MonCallback : public osg::NodeCallback { public: MonCallback(); virtual void operator()(osg::Node* node, osg::NodeVisitor* nv); //... }; // on associe le callback a un node node->setUpdateCallback(new MonCallback ); callback Benoît POULARD <ben.poulard@gmail.com>
callback/visitor // déclaration d'un visitor class MonVisitor: public osg::NodeVisitor { public: UpdateCallbackVisitor(); // regarder la declaration de osg::NodeVisitor pour les surcharge possible de apply(...). virtual void apply(osg:: ... obj); }; // on applique le visitor a un node node->accept(new MonCallback ); visitor Benoît POULARD <ben.poulard@gmail.com>