#1 

02-08-2009 18:50:29

ramis
Membres
Date d'inscription:
Messages: 92
IP: 92.133.233.100
Courriel

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 :

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


#2 

03-08-2009 05:51:36

tmyke
Administrateurs
Avatar de tmyke
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


#3 

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


#4 

03-08-2009 14:57:37

tmyke
Administrateurs
Avatar de tmyke
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


#5 

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


#6 

03-08-2009 15:34:30

tmyke
Administrateurs
Avatar de tmyke
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


#7 

05-08-2009 16:12:53

johnplayer
Membres
Avatar de johnplayer
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


#8 

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


#9 

08-08-2009 07:50:59

tmyke
Administrateurs
Avatar de tmyke
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 

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


#11 

10-08-2009 16:33:09

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 92.130.13.245
Courriel

Ok, tiens nous au courant wink


Force et sagesse...

Hors ligne


#12 

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


#13 

08-01-2011 21:52:52

mmorpglefilm
Membres
Avatar de mmorpglefilm
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


#14 

08-01-2011 22:24:31

Gehogor
Membres
Avatar de Gehogor
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... wink

Hors ligne


#15 

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


#16 

17-01-2011 11:39:17

TUpac
Membres
Avatar de TUpac
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 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é
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
119 invités en ligne
membre en ligne: -
RSS Feed