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 :

fonction OSG getPosition


Sujet :

OpenSceneGraph

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut fonction OSG getPosition
    Bonjour,

    je souhaite à l'aide d'une caméra récupérer la position d'une mire (ou marqueur de type damier ou HIRO ou autre) via osg. J'ai vu que la fontion getPosition permet de faire cela (à l'instare de getAttitude qui donne la rotation)...je m'en suis servi, mais cela donne des résultats (vecteur position en x y z) qui ne semble pas très correcte.j'aimerai savoir en quelle unité le vecteur vec::osg::getPosition est il exprimé? avez vous davantage d'infos sur cette fonction, car ds les tutos elle n'est pas assez détaillée..
    merci de votre aide!
    Hélène

  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
    Alors dejà, seul les nodes de type osg:: PositionAttitudeTransform ont des méthodes getPosition() et getAttitude().

    Par définition, dans un graph de scene, les nodes de type transform sont relatifs, et n'expriment donc qu'une transformation par rapport a leur parent.
    Ainsi, getPosition() ne retourne que la translation induite par ce seul transform, sans prendre en compte tous ses parents qui, pouvant etre des transform aussi, peuvent induire d'autre transformations.

    Pour récupérer la position d'un node dans la scene, il faut faire un getWorldMatrices() qui va te retourner les matrices de transformations du repere monde au repere objet.
    Pourquoi des matrices et pas une seule ? parce que si un node a plusieurs parents, pour chaque "chemin" de la racine du graphe de scene a lui il sera rendu une fois, et aura donc plusieurs possibles transformations (en particulier si les parents sont des transform différents les uns des autres)

    Enfin, si tu veux récuperer le centre de la bounding Sphere de ton objet dans la scene, il faut récuperer les coordonnées du centre, et lui appliquer la matrice que tu as récuperé tantot.

    Si je ne suis pas clair fait le moi savoir.

    J'espere avoir répondu ou au moins t'avoir aidé.

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    merci pour ces explications...mais concrétement, les positions x y z données par getPosition -d'une manière générale- sont exprimées ds quelle unité (m, cm, pouces)?? (parce que je réutilise un code déjà existant, et j'aimerais vérifier la cohérence des résultats)

    merci!!

  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
    Ha pardon, je savais que j'avais oublié un bout de la question.

    En fait elle sont en unité.. OpenGl !
    A toi a mettre en place un systeme d'échelle pour faire en sorte que les unités OSG aient une correspondance dans ta scene...

    En gros, losrque tu fait une translation de 10, ben tu bouge de 10 unités dans la scene... Ensuite tu fait un getPosition et tu récupere 10... A partir de là, a toi de déterminer si les 10 unités représentent 1metre, 10 metre, 10 mm, 10 cm, 53453562 pouces, etc...

    Généralement on se base sur l'échelle des modeles 3D dans la scene pour déterminer l'échelle de la scene...
    En gros, un objet mesure 10m dans 3ds max. Dans ta scene OSG il aura une certaine taille, ce qui va te donner l'échelle de ta scene.. ou a l'inverse tu détermine l'échelle de ta scene d'abord, puis tu scale (setScale) ton objet pour qu'il corresponde a ton échelle.

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    En effet, le code que j'utilise contient déjà une mise à echelle à l'aide de setScale, le problème c'est que je ne sais pas du tout comment l'interpréter...

    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
    	//initializing the several parts of the scene
    	osg::ref_ptr<osg::PositionAttitudeTransform> SceneXTransfo = createScene(
    			0.04);
    
    	osg::ref_ptr<osg::PositionAttitudeTransform> CameraBoxVirtualXTransfo =
    			createIMU(osg::Vec3(0, 0, 0));
    
    	CameraBoxVirtualXTransfo->setScale(osg::Vec3(1, 1, 1) * 0.0003);    
    
    	osg::ref_ptr<osg::PositionAttitudeTransform> Axis =
    			new osg::PositionAttitudeTransform();
    	osg::Geode* Axis0 = osgART::testCube(80, osg::Vec4(0, 1, 0, 0.5));
    	Axis0->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);
    	Axis->addChild(Axis0);
    
    	//giving the reference of the first actor to the global parameter
    	SceneNode = SceneXTransfo;
    	CameraBoxVirtualNode = CameraBoxVirtualXTransfo;
    
    	AxisNode = Axis;
    En rouge, la ligne correspondant à l'echelle...auriez vous une idée de ce que cela signifie? je sais que c un peu difficile hors contexte

    Merci bcpp

  6. #6
    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
    Ben ça signifie juste que tu réduit l'échelle de ton objet 3333 fois par rapport a sa taille d'origine.
    En d'autres termes, il est a 0.0003% de sa taille d'origine.

    Ca signifie que soit ton cube est enorme, soit ta scene est toute petite, et donc pour que les deux soit utilisable dans la meme scene, l'un des deux doit ceder... et là manifestement c'est le cube qui s'est adapté

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    merci beaucoup!!!!

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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