#0 

21-04-2009 20:29:49

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Bonjour,
J'utilise Irrlicht depuis quelques mois et je suis (encore XD) confronté à un problème.
Voilà mon problème :
J'ai 3 cubes, et je veux faire en sorte que lorsque l'on clique sur un des cubes, celui-ci s'illumine.
Mais voilà, comment faire pour que le programme détecte si la position de la souris est placée sur le cube 3D ??
Je pensais à un truc comme la ligne 3D pour faire comme dans les tutos officiels, mais je ne vois rien qui puisse relier la souris à la 2D :S . Quel serais alors la méthode ?

Merci d'avance,
Cordialement

Capry

Hors ligne


#1 

22-04-2009 00:37:15

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

"getSceneNodeFromScreenCoordinatesBB" devrait t'aider, sinon va voir les sources de "getSceneNodeFromCameraBB"
les fonctions, sont accessible via "smgr->getSceneCollisionManager()->"

franchement regard la doc ... sa ma prit 20 sec si ses bon ... cherche un peut quand même car ton poste laisse croire le contraire smile
et l'exemple sur les collisions l'utilise.

Dernière modification par Magun (25-04-2009 06:20:03)

Hors ligne


#2 

22-04-2009 00:40:18

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

line3df ray = pScene->getSceneCollisionManager()->getRayFromScreenCoordinates(core::vector2di(MouseX,MouseY),pCamera);
    pScene->getSceneCollisionManager()->getSceneNodeAndCollisionPointFromRay(ray,blabla....)


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#3 

22-04-2009 12:11:13

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Merci pour vos réponses big_smile !

Mais j'ai besoin encore de quelques précisions :

line3df ray = pScene->getSceneCollisionManager()->getRayFromScreenCoordinates(core::vector2di(MouseX,MouseY),pCamera);

Que retourne cette ligne ? Un vector 3df qui contient quelles positions ?

pScene->getSceneCollisionManager()->getSceneNodeAndCollisionPointFromRay(ray,blabla....)

Et celle-ci à quoi sert-elle ? On y place comme argument la variable "ray" définie plutôt, donc ça dois détecter une collision mais quoi ?

EDIT: après recherche dans la doc, la seconde ligne retournerais apparemment le node(mesh) le plus proche de la collision avec la ligne 3D, et la première crée cette ligne 3D en partant de la position du curseur et de la caméra ? Merci beaucoup à tous (surtout pour la rapidité big_smile ),

Dernière modification par capry (22-04-2009 12:16:52)

Hors ligne


#4 

22-04-2009 18:51:37

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

Code:

line3df ray = pScene->getSceneCollisionManager()->getRayFromScreenCoordinates(core::vector2di(MouseX,MouseY),pCamera);

Cette ligne se contante de transposer des coordonnées 2D sur l'écran (fournis par exemple par une position
d'un pointeur de souris) en une ligne 3D situé dans ton univers 3D.
Cette routine permet par exemple de préparer un test de picking.


Force et sagesse...

Hors ligne


#5 

26-04-2009 17:32:31

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

J'ai oublié de demander quelque chose. Comment savoir où la collisions à été faite ? Par exemple si elle à heurtée le node1 à l'emplacement (23,92,68) , comment le savoir, et comment donné à un node cette direction ? Merci d'avance.

Hors ligne


#6 

26-04-2009 18:19:59

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

je sais pas trop comment ses foutue, donc pas forcement juste ...
"line3df ray = pScene->getSceneCollisionManager()->getRayFromScreenCoordinates(core::vector2di(MouseX,MouseY),pCamera);" donc je suppose que le début de la ligne est la position de la camera et la fin c'est la ou a lieu la collision ... enfin je suppose smile

pour la direction j'avais un truc pour ça, mais je les plus, tu doit tant douté il faut utiliser cos,  sin ou/et tan ... bien que certain arrive sans wink

Hors ligne


#7 

26-04-2009 20:30:04

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Dans ce cas comment obtenir la fin de cette ligne ?
Pour la direction j'ai fais un truc comme ça (je veux juste avoir celle autour de l'axe y) :

//"position" est la position du node et "point" est la position du point où s'est faite la collision

rotation.Y=(point.Z-position.Z, point.Y-Position-Y)*180/math_PI

Mais cette formule n'a pas l'air de marcher neutral ...

Hors ligne


#8 

26-04-2009 20:53:38

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

Il y a une méthode quelque peu bourrine. A chaque fois que tu inseres un mesh dans irrlicht tu créé un triangle selector que tu stockes dans un array et tu stockes dans un autre array le node associé. Ensuite dans ta boucle de rendu tu fais une boucle de test de collision pour tout les triangle selectors et lorsque qu'il y a collision tu recupère le node dans le array.
Enfin, c'est loin d'être top mais c'est une idée de départ.


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


#9 

26-04-2009 22:01:47

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

ça pourrais marcher mais c'est beaucoup trop long étant que si je fais ça rien qu'avec la map par exemple, ça fais des centaines (peut-être milliers ??) de triangle à vérifiés :S .
J'aimerais si possible avoir une autre solution plus pratique, et se faisant plus rapidemment.

Hors ligne


#10 

26-04-2009 23:19:24

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

Hors ligne


#11 

27-04-2009 08:53:26

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Ah pardon, merci beaucoup ! J'avais pas cherché ça par contre, désolé :S.
Et pour la direction que dois prendre le node (le personnage en fait) ?

Dernière modification par capry (27-04-2009 08:54:27)

Hors ligne


#12 

27-04-2009 09:12:07

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

Voici un de mes multiples petit code bien utiles.
Ce code oriente un node vers une position donnée ( on fournis juste les coordonnée dans l'espace de la position choisie).
C'est volontairement détaillé ligne à ligne.
Cela devrait t'aider dans ce que tu cherche à faire, à toi d'adapter pour ton usage perso wink


Code:

PointTargetNode(scene::ISceneNode *node1, float px, float py, float pz, float roll)
{
    core::vector3df target = node1->getPosition();

    float x=target.X;
    float y=target.Y;
    float z=target.Z;

    float xdiff=px-x;
    float ydiff=py-y;
    float zdiff=pz-z;

    float dist22=sqrt( (xdiff*xdiff) + (zdiff*zdiff) );
    float pitch=atan2(ydiff,dist22);
    float yaw=atan2(xdiff,zdiff);

    node1->setRotation(  core::vector3df(RAD2DEG(-pitch), RAD2DEG(yaw) , RAD2DEG(roll)) );
}

Force et sagesse...

Hors ligne


#13 

27-04-2009 09:20:14

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Merci beaucoup !! C'est pile ce que je voulais ^^. Juste une dernière précision : qu'est-ce que le "roll" que l'on doit fournir en argument à la fonction ?

EDIT : C'est bon en fait je n'en avais pas besoin de toute façon puisque je voulais juste la direction autour de Y ^^.

Merci beaucoup à tous big_smile !

Dernière modification par capry (27-04-2009 10:12:46)

Hors ligne


#14 

27-04-2009 11:20:06

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

capry :

Merci beaucoup !! C'est pile ce que je voulais ^^. Juste une dernière précision : qu'est-ce que le "roll" que l'on doit fournir en argument à la fonction ?


petite réponse quand même, en fait c'est si tu souhaite appliquer un roulis à ton node lors de son orientation (mettre 0 par défaut)  wink


Force et sagesse...

Hors ligne


#15 

27-04-2009 16:51:33

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Ah d'accord merci je saurais à l'avenir big_smile .
Par contre pour en revenir à la ligne 3D, maligne3d.start, va bien me donné le point de départ de la ligne, mais maligne3d.end va me donner LA FIN de la ligne (ce qui ne correspond pas forcement à l'impacte de la collision). Ce que je voulais c'est l'impact, car la ligne continue même après la collision avec un objets :S ...

Hors ligne


#16 

27-04-2009 18:59:35

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

Copland :

line3df ray = pScene->getSceneCollisionManager()->getRayFromScreenCoordinates(core::vector2di(MouseX,MouseY),pCamera);
    pScene->getSceneCollisionManager()->getCollisionPoint(ray,blabla....)


Copland t'a donnée la réponse. La fonction getCollisionPoint te donne le position exacte de la collision sur ton objet. wink
Donc pas de soucis, zieute la doc sur cette fonction et tu trouveras ton bonheur.


Force et sagesse...

Hors ligne


#17 

27-04-2009 19:46:38

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Ah ouin effectivement j'avais pas pensé à aller dans les trucs de scène. Je n'avais cherché que dans la classe "line3d" . Mais en ce qui concerne le getCollisionPoint(), il retourne un booléen (qui veut sans doute dire si la collision est détecté ou pas). Mais moi je sais qu'une collision est détectée, et après je veux savoir où. Ce n'est donc pas la bonne fonction, non ?

Hors ligne


#18 

27-04-2009 19:58:35

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

Oui pour le booléen. Mais si tu regarde de plus près la fonction te permet de récupérer dans 'outCollisionPoint' et 'outTriangle' le point de contact ainsi que le triangle percuté.


Force et sagesse...

Hors ligne


#19 

27-04-2009 20:40:39

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Le programme crash quand j'utilise la fonction :S.
de plus OutCollisionPoint et OutTriangle passés en arguments ne sont pas des pointeurs, comment je fais pour les récupérer alors ?

Hors ligne


#20 

27-04-2009 21:07:52

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

capry :

OutCollisionPoint et OutTriangle passés en arguments ne sont pas des pointeurs, comment je fais pour les récupérer alors ?


faut faire simple wink

Code:

core::vector3df outCollisionPoint;
core::triangle3df outTriangle;
...
... smgr->getSceneCollisionManager()->getCollisionPoint( ray, tri, outCollisionPoint, outTriangle);
...

c'est tout.


Force et sagesse...

Hors ligne


#21 

28-04-2009 07:44:46

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Oui mais si je veux récupérer la valeur de outCollisionPoint. La fonction ne va pas donner une nouvelle valeur à la variable. On fournit donc une valeur à la fonction qu'elle ne peut modifier car n'étant pas un pointeur...

Hors ligne


#22 

28-04-2009 08:45:12

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

capry :

Oui mais si je veux récupérer la valeur de outCollisionPoint. La fonction ne va pas donner une nouvelle valeur à la variable. On fournit donc une valeur à la fonction qu'elle ne peut modifier car n'étant pas un pointeur...


Si justement, essais tu verras bien. Tu ne fournis aucune valeurs, mais deux données par le biais d'un  'const core::vector3df &out...'
Je sais, en C++ la transmission des info n'est pas toujours super intuitives, mais cela fonctionne bien. wink


Force et sagesse...

Hors ligne


#23 

28-04-2009 12:00:45

capry
Membre
Date d'inscription: 14-02-2009
Messages: 83

Ah ? ok d'accord, mais ça ne résous pas le porblème du crash. D'où peut-il provenir ???

Hors ligne


#24 

28-04-2009 13:22:25

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

Faudrait donner ton bout de code wink

Souvent, les crash sont liées à des pointeurs invalides. Mais sans plus d'info, pas facile à dire.


Force et sagesse...

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
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
19 invités en ligne
Aucun membre connecté
RSS Feed