Je reprends, puisqu'il s'agit d'un déplacement de topic.
J'ai une scène 3D représentant un arbre de classification phylogénétique d'espèces, la 3D permet plein de manipulations très intéressantes (ça c'était pour préciser le domaine d'application, et merci Irrlicht smile )
L'idée est de permettre à l'utilisateur de tracer un lasso à mains levée pour sélectionner un ensemble d'espèces, qui ne sont ni plus ni moi que des node de ma scène.
Pour l'instant je travaille sur le tracé du lasso, mais je suis obliger le réaliser en mode pixellaire (vu qu'irrlicht ne fournis pas de tels outils, enfin pas à ma connaissance). Je me retrouve avec la problématique de savoir quels sceneNode sont dans le lasso. (qui lui je le rappelle est en 2D).
J'attends des idées de solutions.
Hors ligne
Hello,
Le problème c'est que ton lasso peut avoir n'importe quelle forme si je comprends bien ?
A la rigueur il faudrait déterminer une zone ronde ou carré après avoir fait le tracé au lasso et faire une projection de coordonée 2D vers 3D.
Bon le soucis c'est qu'il te faudra déterminer une profondeur maximale en Z sinon ça va bouffer les ressources.
Cherche à "Project 2D coords to 3D coords" ou quelque chose comme ça sur google, tu trouveras sans doute des codes facilement adaptable...Au pire des cas, je dois avoir un vieux code en basic pour faire se genre de chose, mais il faut que je farfouine dans mes vieux cd...
http://www.mvps.org/directx/articles/rayproj.htm
Hors ligne
- projeter les coords 3d de la node a tester. ca te donne un point (2d donc ) noté P ;( a l'aide des martices View Project et World )
- prendre une droite passant par P quelconque , D;
- trouver les points d'intersection entre cette droite D et le contours , points X1...Xn.
- classer les points X1...Xn selon s'ils sont ou pas du meme coté de la droite par rapport a P;
- compter les Xi qui sont du meme cote ( l'un ou l'autre ), N;
- si N pair X n'est pas dans le contours , sinon il l'est.
Attention tout de meme au cas ou D est tangente au countours , ne pas ajouter au point d'intersection , et compter de l'autre coté , si seulement un point tangent de charque coté, pas dans la zone.
Une petite illustration pour mille mots :
Edit : elles sont infectes les couleurs
Dernière modification par firnafin (31-05-2008 19:17:35)
Hors ligne
Super ! J'avais entendu parlais de cet algo.
Maintenant, je n'ai plus qu'a l'implémenter. Thanks !
Hors ligne
Je clos le sujet en disant que cela fonctionne à merveille.
Une petite précision, on peut transformer des coordonnées 3D en coordonnées 2D en utilisant simplement cette fonction :
core::position2d<s32 > 2DPos = smgr->getSceneCollisionManager()->getScreenCoordinatesFrom3DPosition(node->getAbsolutePosition(), camera);
L'algorithme dont firnafin parle s'appelle l'algorithme du Crossing Number et on peut en trouver une implémentation simple à cette adresse : http://www.geometryalgorithms.com/Archi … ithm_0103/
Si ça peut aider quelqu'un d'autre par la suite.
Merci encore à tous pour votre aide précieuse.
Hors ligne
A vrai dire je l'ai cherchée et trouvée tout seul , je ne voulais pas m'aider du net ,ravi qu'elle pour un si jolie nom.Je presume que celle donnée sur le lien est améliorée.. enfin a quand la demo du lassso
Hors ligne
La démo arrive dans les jours qui viennent. J'optimise et je rend ça un peu paramétrable et je fourni tout ça
Hors ligne