Pages: 1
- Accueil forums
- » Evénements
- » Problême pour récupérer un Node après clic sur lui
02-08-2009 18:50:29
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.233.100
- Courriel
Bonjour à tous ![]()
Je suis en train de coder un début d'éditeur de niveau avec Irrlicht mais j'ai un petit problême pour ce qui est de récupérer le node sur lequel l'utilisateur clique .
J'ai une caméra FPS (le bouton échap permet de la désactiver pour pouvoir bouger la souris) , et un node dans ma scène (c'est sydney :p) .Le but est de récupérer le node "sydney" lorsque je clique dessus avec le bouton gauche de la souris et de l'entourer d'un rectangle (avec setDebugDataVisible(scene::EDS_BBOX); )
Mon problême est que lorsque je clique dessus , il ne se sélectionne pas , ou alors il faut que je déplace ma caméra juste devant le modèle
Voici ma portion de code , qui se trouve dans OnEvent :
if(event.MouseInput.Event== EMIE_LMOUSE_PRESSED_DOWN)
{
irr::core::line3df ray;
ray = device->getSceneManager()->getSceneCollisionManager()->getRayFromScreenCoordinates(device->getCursorControl()->getPosition());
irr::scene::ISceneNode* Node;
Node=device->getSceneManager()->getSceneCollisionManager()->getSceneNodeFromRayBB(ray,0);
Node->setDebugDataVisible(scene::EDS_BBOX);
}Si quelqu'un pouvait m'éclairer , je lui en serais extrèmement reconnaissant ^^
merci d'avance ,
ramis
Hors ligne
03-08-2009 05:51:36
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.137.104
- Courriel
C'est peut-être pas la réponse que tu attendais, mais que donne l'emploi de la fonction 'getSceneNodeFromCameraBB' ?
Force et sagesse...
Hors ligne
03-08-2009 09:02:18
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.233.100
- Courriel
Exactement la même chose , il faut que j'ai la caméra quasiment collée au modèle pour qu'il se sélectionne .
Hors ligne
03-08-2009 14:57:37
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 86.204.52.169
- Courriel
Alors c'est peut-être du à la camera type FPS. Avec une camera standart, as-tu le même soucis ?
Force et sagesse...
Hors ligne
03-08-2009 15:24:45
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.233.100
- Courriel
Même problême , autant avec la caméra standard qu'avec la maya ![]()
j'ai bien essayé de modifier quelques paramêtres , mais je n'ai vraiment aucune idée de ce qui peut bien clocher .
Hors ligne
03-08-2009 15:34:30
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 86.204.52.169
- Courriel
Quand j'ai ce genre de soucis, j'essaie de créer un code réduit, juste pour reproduire le soucis, avec un codage minimaliste et des media réduits au plus possible.
On y vois souvent plus clair. Cela serait cool si tu pouvais faire la même chose, cela permettrait qui plus est de facilement le poster pour aider à débbuguer, non ?
Force et sagesse...
Hors ligne
05-08-2009 16:12:53
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.198.99.111
- Courriel
Ton vecteur ne va pas plus loin que ta camera donc un normalize et un multiplicateur par la distance de détection voulue devrait marcher.
irr::core::line3df ray;
ray = device->getSceneManager()->getSceneCollisionManager()->getRayFromScreenCoordinates(device->getCursorControl()->getPosition());
ray.normalize();
ray *= 1000.0f;
core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."
Hors ligne
07-08-2009 19:19:06
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 82.250.87.125
- Courriel
En fait j'ai le même genre de problème, en utilisant n'importe quel getSceneNode* du manager de collision et en fait il séléctionne par défault régulièrement un mesh qui est derrière au lieu de celui de devant.
J'ai testé en calculant les collisions avec les bounding box et le ray intersecte bien les deux.
Je suppose que c'est un bug de irrlicht ou alors je sais pas trop.
Hors ligne
08-08-2009 07:50:59
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.17.55
- Courriel
Bon, je sais pas si cela peut aider, mais dans N3xtD, pour faire un test de picking j'utilise cette façon de faire:
Code c++ :
// pickType est un flag qui spécifie si l'on fait un picking seulement sur les boundingBox de MEsh (plus rapide quand
// même, ou si l'on veut quand même un picking sur les faces de l'objet
core::position2d<s32> pos(mousex,mmousey);
scene::ISceneNode *node = NULL;
node = globenv.smgr->getSceneCollisionManager()->getSceneNodeFromScreenCoordinatesBB( pos );
if( node == globenv.smgr->getRootSceneNode() ) return NULL;
if( node == camera ) return NULL;
if (pickType == ENT_PICKBOX) return node;
core::vector3df vPickRayDir;
core::vector3df vPickRayOrig;
// compute les vecteur 3D Ray, routine perso
CameraVectorCompute3D(mx, my, &vPickRayOrig, &vPickRayDir);
vPickRayDir = (vPickRayDir*distance) + vPickRayOrig;
const core::line3d< f32 > ray(vPickRayOrig.X, vPickRayOrig.Y, vPickRayOrig.Z, vPickRayDir.X, vPickRayDir.Y, vPickRayDir.Z);
scene::IMeshSceneNode *mesh = (scene::IMeshSceneNode*) node;
scene::ITriangleSelector *tri = globenv.smgr->createTriangleSelector( mesh->getMesh(), mesh );
bool res = globenv.smgr->getSceneCollisionManager()->getCollisionPoint( ray, tri, outCollisionPoint, outTriangle);
tri->drop();
if(res) return mesh;
return NULL;
Cela fonctionne, du moins jusqu'a preuve du contraire, et je n'ai pas de soucis de profondeur des mesh, il me selectionne toujours le mesh au premier
plan. (j'utilise toujours la version 1.5.0 d'Irrlicht).
a+
Force et sagesse...
Hors ligne
10-08-2009 15:52:51
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 82.248.40.112
- Courriel
Je trouve l'algo d'irrlicht vraiment bizarre de toute manière vu qu'il utilise les sommets de la bounding box enfin je vais tester ça par ce que ma version de l'algo de picking marche mieu pour ma scène mais c'est pas la panassé donc je vais tester ta méthode et je verrais bien.
Hors ligne
10-08-2009 16:33:09
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.13.245
- Courriel
Ok, tiens nous au courant ![]()
Force et sagesse...
Hors ligne
14-08-2009 09:21:30
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 82.249.7.170
- Courriel
Bon ta méthode étant basé sur celle d'irrlicht me fais exactement pareil, donc du coup j'utilise ma propre méthode avec intersection de triangle scene node avec ray et ça marche bien mais sa doit pas être très optimisé.
Hors ligne
08-01-2011 21:52:52
- mmorpglefilm
- Membres

- Date d'inscription:
- Messages: 162
- IP: 78.122.228.229
- Courriel Site web
Voila enfin, j'ai fini pas trouver la réponse à mon problème !
Je sais maintenant comment "sélectionner" un mesh et pouvoir continuer à programmer mon jeu, merci à tous !
Hors ligne
08-01-2011 22:24:31
- Gehogor
- Membres

- Date d'inscription:
- Messages: 130
- IP: 79.93.131.37
- Courriel
Bonsoir,
dark calculator, j'ai eu le même problème obscure sur RoboticsCell pour la sélection d'objet, j'ai fini par développer ma propre méthode comme toi.
Bon courage.
Et hop...
Hors ligne
17-01-2011 10:39:07
- sandydc
- Membres
- Date d'inscription:
- Messages: 1
- IP: 78.233.225.24
- Courriel
Bonjour ^^
Du coup quelle est la solution ?
Hors ligne
17-01-2011 11:39:17
- TUpac
- Membres

- Date d'inscription:
- Messages: 387
- IP: 88.168.3.38
- Courriel
Pour ramis ça n'a pas marché mais c'est bien getSceneNodeFromCameraBB comme l'a dit tmyke.
Pour moi ça a toujours marché. Sinon c'est à la mimine ![]()
"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."
Hors ligne



