#0 

02-08-2009 20:50:29

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

Bonjour à tous smile
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 hmm
Voici ma portion de code , qui se trouve dans OnEvent :

Code:

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


#1 

03-08-2009 07:51:36

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


#2 

03-08-2009 11:02:18

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

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


#3 

03-08-2009 16:57:37

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


#4 

03-08-2009 17:24:45

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

Même problême , autant avec la caméra standard qu'avec la maya hmm
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


#5 

03-08-2009 17:34:30

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


#6 

05-08-2009 18:12:53

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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


#7 

07-08-2009 21:19:06

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

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


#8 

08-08-2009 09:50:59

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


#9 

10-08-2009 17:52:51

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

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 

10-08-2009 18:33:09

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Ok, tiens nous au courant wink


Force et sagesse...

Hors ligne


#11 

14-08-2009 11:21:30

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

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


#12 

08-01-2011 22:52:52

mmorpglefilm
Abonné
Lieu: la galaxie UDFy-38135539
Date d'inscription: 18-05-2010
Messages: 162
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


#13 

08-01-2011 23:24:31

Gehogor
Abonné
Lieu: Paris
Date d'inscription: 02-06-2009
Messages: 130
Corrections: 7

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... wink

Hors ligne


#14 

17-01-2011 11:39:07

sandydc
Petit nouveau
Date d'inscription: 17-01-2011
Messages: 1

Bonjour ^^

Du coup quelle est la solution ?

Hors ligne


#15 

17-01-2011 12:39:17

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

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 wink


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
99 invités en ligne
Aucun membre connecté
RSS Feed