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 :

Node mask vs bounding sphere


Sujet :

OpenSceneGraph

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut Node mask vs bounding sphere
    salut,

    je voudrais savoir la différence entre le node mask et un bounding dans openscenegraph ?.


    si je cree une camera avec une boundingsphere comment interagir avec un node mask ?

    merci !

  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 : 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
    Salut,

    Je vois qu'OSG te donne encore du fil à retordre ;-)

    Alors encore une fois il manque des informations pour t'aider, mais ce que je peux t'assurer, c'est que les nodeMask et les boundingSphere n'ont absolument rien à voir de pres comme de loin !

    Pour faire court, voilà quelques détails:

    • Les Bounding Volume (boundingSphere ou BoundingBox) ne sont qu'une réprésentation abstraite (non graphique) des volumes englobants permettant des calculs de collision, de proximité, etc...

    • Les mask sont des propriétés des nodes, cameras et intersectors qui permettent de "filtrer" les nodes concernés. En gros, une comparaison bit à bit entre le mask du node et celui de la camera permet de savoir si le node sera rendu dans la scene. Idem pour les intersectors.
      Ca permet d'exclure des nodes ou des morceaux complet du graph de scene du rendu et du picking/intersector sans avoir besoin de les décrocher du graph.

    Alors maintenant, quel est ton soucis exactement ?
    "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 actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut
    salut Ange_blond,

    j'exporte ma scene a l'aide de l'utilitaire osgexp, dans l' utilitaire osgexp , il y a un helper permettant de creer des collisions a un objet :

    voici la page : http://sourceforge.net/apps/mediawik...e=OSG_NodeMask

    je voudrais savoir comment ça fonctionne ? et comment l'utilser avec un "bounding"


    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 : 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
    Ok, je vois le soucis.

    Ma remarque reste valable quand à la corrélation indirecte des nodeMask et des bounding sphere

    Visiblement, tu cherche à faire de la detection de collision.

    D'abord, un Helper est une geometrie de 3ds max qui n'a pas de représentation graphique. Quel en est l'interet ? on peut l'utiliser comme noeud parent dans un graph de scene, ou comme "localisateur" dans un systeme, ou autrement encore.

    Pour expliquer

    : En gros moi je les utilise pour leur position. Je créé dans 3ds max des objets, que je relie par des liens de parenté. les liens de parenté dessinent petit à petit un graph de scene. En supposant que mon modele soit un avion, je met un helper dans la cabine a la place de la tete du pilote. J'attache le helper au reste en tant qu'enfant. Ainsi, si dans ma scene 3D OSG l'avion bouge, mon helper restera à sa place dans la cabine.
    Ensuite, à n'importe quel moment dans le code, je récupere un pointeur sur mon helper et en tant que node, je récupere sa position dans la scene. Je peux donc y emmener ma camera par exemple.
    Revenons en à nos moutons : le helper est donc un Node sauf qu'il ne représente rien à lui tout seul. Il est d'ailleurs probablement exporté en osg::Group par osgExp.

    Chaque node ou type dérivé dans osg a un champ NodeMask (http://www.openscenegraph.org/docume...32e1038d951e23).
    Si tu regarde dans le code osg, tu trouveras quelques lignes qui expliquent en détail le fonctionnement des nodeMask que je résume ainsi :
    Le mask est int, qui représente un nombre binaire. Pour cette raison, on l'écrit généralement directement en hexadécimal (par défault 0xffffffff). Lors de chaque opération de rendu, de picking, etc... le graph de scene est parcouru de haut en bas par des osg::NodeVisitors automatiquement pour collecter les infos requises. Chaque osg::nodeVisitor dispose d'un mask lui aussi. Les nodeVisitors ne sont pas des nodes, mais des méthodes de parcours du graph (classe virtuelle : http://www.openscenegraph.org/docume...cs/a00438.html).
    Le mask qu'ils ont leur sert à déterminer quel élément du graph parcourir et lesquels ignorer.
    Comme le graph est parcouru de la racine (root) aux geodes, si un node a un mask qui empêche le parcours d'un visitor, alors le node ainsi que tout ses enfants seront ignorés. Comme le visitor descend dans le graph, dès qu'il rencontre un node qui a un mask qui lui empêche de le traverser, le visitor oublie cette branche et continue sur les autres.

    Comment les masks empêchent les parcours ? bonne question ! voilà pourquoi on les écrit en binaire. Lors du parcours, sur chaque node qu'il s'apprete à parcourir, le nodeVisitor compare son propre mask de visitor et celui du node qu'il s'apprete à traverser. il s'agit d'une comparaison binaire, bit à bit. l'Opérateur ET est utilisé. Si le résultat est 000000...0 alors le node n'est pas traversé.


    Exemple 1 :

    Node : 0xfffffffe (soit en binaire 1111...11110)
    Visitor: 0x1 (soit en binaire 0000.....0000001)

    Si on fait un ET logique, on obtient en binaire 000....0000 donc le node n'est pas traversé.

    Exemple 2
    :

    Node1 : 0xfffffffe
    Node2 : 0xffffffff
    Visitor : 0x1

    Le visitor va parcourir Node2 mais pas Node1
    Reprenons à présent sur les collisions. Les tests de collisions sont généralement fait avec osgUtil::intersector et ses classes dérivées (http://www.openscenegraph.org/docume...cs/a00343.html). Un intersector est lui meme dérivé de nodeVisitor. Ainsi, un intersector utilisera lui aussi un mask.

    Ainsi, il est possible de détecter la collision de certains nodes en ignorant les autres.

    Exemple :

    Dans ma scene, j'ai une voiture qui roule dans une plaine pleine de buissons et de maisons parsemées (ben oui il est tard je fait ce que je peux hein...).
    Je vais donc décider que la voiture traversera les buissons alors qu'elle entrera en collision avec les maisons.

    Voiture : 0xffffffff
    Maisons : 0xffffffff
    buissons : 0xfffffffe
    Intersector : 0x1

    A chaque frame je vais calculer l'éventualité d'une nouvelle collision entre la voiture et le reste.
    Je vais donc utiliser un intersector qui va utiliser la position de la voiture pour calculer les collisions avec toute la scene. Comme mon intersector a un mask qui va ignorer les buissons, ils ne seront jamais retournés comme element de collision, alors que les buisson et meme les autres voitures (s'il y en a) seront des obstacles.

    Bien sur, ce n'est qu'un test de collision, ensuite à toi de coder ce qu'il faut pour que la voiture s'écrabouille sur la maison....
    Pour ce qui est des BoundingSphere, cette classe à une méthode intersect() qui permet de retourner un booléen si la collision entre la boundingSphere actuelle et celle passée en paramètre à bien eu lieu.
    Les BS ne gerent aucun mask à ma connaissance.
    Tu peux les utiliser comme moyen de pré-detecter une collision car le calcul est tres peu couteux, mais pour avoir un calcul précis il te faudra passer aux intersectors.
    Il n'est d'ailleurs pas fait allusion aux BS dans http://sourceforge.net/apps/mediawik...e=OSG_NodeMask


    Tâchons de résumer
    : les mask permettent de définir des "set" de node qui ont des caractéristiques communes. tout simplement. Sagement utilisés, ils permettent de faire des choses plutot poussées sans effort.


    Extention
    : les cameras ont leur propre mask aussi... si le mask du node n'est pas en accord avec celui de la camera, le node n'est pas rendu dans la scene. (ou comment masquer un node sans le décrocher du graph, opération qui est nettement plus couteuse que juste changer un champ int de la classe node)


    Remarque
    : Pour faire simple j'ai utilisé le masque 0x1. tu peux mixer les masques à souhait pour faire des choses complexes. tu peux rendre un node invisible pour une camera, mais pourtant intersectable par un visitor ou inversement. Le plus simple c'est de prendre un bout de papier et d'écrire le mask en binaire et de faire l'opération avec les mask des intersectors/cameras... et tu verra qu'avec juste 2 ou 3 bits de changés tu peux générer plein de combinaisons.
    Par défaut dans osg, le mask est de 0xffffffff pour les nodes.
    Le mask 0x0 est le plus radical : quelque soit celui du visitor, il ne sera pas traversé.


    Voilà !
    J'espere n'avoir pas dis de connerie et t'avoir aidé.

    Ange_blond.
    "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 actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut
    salut Ange_blond,

    je te remercie beaucoup pour cette longue explication.

    je pense avoir bien compris .

    merci encore, je vais tester.

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

Discussions similaires

  1. Bounding sphere hierarchy
    Par epsilon68 dans le forum Développement 2D, 3D et Jeux
    Réponses: 24
    Dernier message: 23/02/2008, 18h29
  2. [Struts]Bean populate & array index out of bound
    Par djoukit dans le forum Struts 1
    Réponses: 7
    Dernier message: 02/11/2006, 11h03
  3. Sphere et masque
    Par BenderJay dans le forum OpenGL
    Réponses: 3
    Dernier message: 25/03/2004, 23h24
  4. []générer et LIRE du xml avec vb: sélection d'un node
    Par chris21 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/09/2003, 13h14
  5. template match="node() mais pas text()"
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/03/2003, 10h52

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