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 !
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 !
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 ?
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 !
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
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.: 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.
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 :
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.Node1 : 0xfffffffe
Node2 : 0xffffffff
Visitor : 0x1
Le visitor va parcourir Node2 mais pas Node1
Ainsi, il est possible de détecter la collision de certains nodes en ignorant les autres.
Exemple :
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.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....
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.
salut Ange_blond,
je te remercie beaucoup pour cette longue explication.
je pense avoir bien compris .
merci encore, je vais tester.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager