#0 

17-09-2010 22:13:22

benjani13
Petit nouveau
Lieu: 92
Date d'inscription: 25-01-2010
Messages: 9

Bonjour, je suis en train de faire une caméra inspirée de celle de World of Warcraft, c'est à dire une caméra qui fixe toujours le personnage et qui tourne autour de lui, avec un clic pour tourner la caméra et le personnage, un clic pour ne tourner que la caméra, et la molette pour zoomer.

Même si il y a de plus ou moins gros détails à améliorer, ma caméra est fonctionnelle. Mais je me retrouve confronté à un mur quand j'essaie de gérer la sélection des SceneNode environnants avec cette caméra. J'ai essayé pas mal de chose en tâtonnant mais je n'ai jamais réussi à avoir quelque chose de concluant.

Les informations connus sont donc, la position du SceneNode du personnage, la position de la caméra (grâce a ces deux derniers on peut donc obtenir la direction de la vue), et la position du curseur à l'écran.

Le problème, je pense, vient du fait qu'on doive sélectionner un objet dans la 3D, avec un rendu "2D" (votre écran affiche une 2D créer à partir de la 3D, vous pouvez remarquez les lignes de fuites en regardant le sol de la map BSP fournie avec Irrlicht).

J'aimerais donc votre avis, si vous avez une piste sur comment passez de la sélection au curseur "2D", a la sélection en 3D. (Il faudrait j'imagine récupérer la direction de la vue, et la modifier (lui effectuer une rotation et/ou une translation) en fonction de la position du curseur à l'écran)

Merci de votre aide.

Hors ligne


#1 

18-09-2010 16:30:40

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

regard les example irrlicht sur les triange_selector

Hors ligne


#2 

18-09-2010 18:04:44

benjani13
Petit nouveau
Lieu: 92
Date d'inscription: 25-01-2010
Messages: 9

Ce n'est pas la sélection en elle même qui pose problème, je sais utiliser la fonction "getSceneNodeAndCollisionPointFromRay", le problème vient du "ray", je ne sais pas vraiment comment définir sa direction.

Hors ligne


#3 

18-09-2010 18:48:08

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

J'aime bien discuter sur les forums mais la franchement c'est le tuto officiel 7 (livré dans le sdk)
allez ! je file le bout interressant:

Code c++ :

// All intersections in this example are done with a ray cast out from the camera to
                // a distance of 1000.  You can easily modify this to check (e.g.) a bullet
                // trajectory or a sword's position, or create a ray from a mouse click position using
                // ISceneCollisionManager::getRayFromScreenCoordinates()
                core::line3d<f32> ray;
                ray.start = camera->getPosition();
                ray.end = ray.start + (camera->getTarget() - ray.start).normalize() * 1000.0f;

                // Tracks the current intersection point with the level or a mesh
                core::vector3df intersection;
                // Used to show with triangle has been hit
                core::triangle3df hitTriangle;

                // This call is all you need to perform ray/triangle collision on every scene node
                // that has a triangle selector, including the Quake level mesh.  It finds the nearest
                // collision point/triangle, and returns the scene node containing that point.
                // Irrlicht provides other types of selection, including ray/triangle selector,
                // ray/box and ellipse/triangle selector, plus associated helpers.
                // See the methods of ISceneCollisionManager
                scene::ISceneNode * selectedSceneNode =
                        collMan->getSceneNodeAndCollisionPointFromRay(
                                        ray,
                                        intersection, // This will be the position of the collision
                                        hitTriangle, // This will be the triangle hit in the collision
                                        IDFlag_IsPickable, // This ensures that only nodes that we have
                                                        // set up to be pickable are considered
                                        0); // Check the entire scene (this is actually the implicit default)

                // If the ray hit anything, move the billboard to the collision position
                // and draw the triangle that was hit.
                if(selectedSceneNode)
                {................

Dernière modification par TUpac (18-09-2010 18:49:32)


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

Hors ligne


#4 

18-09-2010 19:13:14

benjani13
Petit nouveau
Lieu: 92
Date d'inscription: 25-01-2010
Messages: 9

En fait vous n'avez pas compris mon problème mais je l'ai résolu grâce au forum anglais. Encore une fois je sais utiliser la fonction getSceneNodeAndCollisionPointFromRay, mon problème était de sélectionner un scene node avec le curseur avec une vue à la 3ème personne. C'est donc la partie mathématique qui me posait problème, définir la direction du vecteur "ray", et non la partie "technique".

Mais en fait, je n'ai même pas pensé à regarder dans la doc, et je n'ai donc pas vu qu'il y a des fonctions qui font le boulot toute seule. Voici le code pour une collision ray/box à partir de la position du curseur à l'écran:

Code c++ :

pickedNode = collMan->getSceneNodeFromScreenCoordinatesBB(m_device->getCursorControl()->getPosition(), IDFlag_IsPickable);


Et le code pour une collision ray/box et ray/triangle:

Code c++ :

ray = collMan->getRayFromScreenCoordinates(m_device->getCursorControl()->getPosition(), camera);
pickedNode = collMan->getSceneNodeAndCollisionPointFromRay(ray, intersection, hitTriangle, IDFlag_IsPickable, 0);

Hors ligne


#5 

18-09-2010 23:58:20

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

Ben je pense que tu t'exrime mieu en anglais parce-que j'ai toujours rien compris smile
Mais si tu as réussi .. tant mieu.

Dernière modification par TUpac (18-09-2010 23:58:51)


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

Hors ligne


#6 

19-09-2010 10:06:27

benjani13
Petit nouveau
Lieu: 92
Date d'inscription: 25-01-2010
Messages: 9

Lol bon bha merci quand même. Et je profite d'avoir votre attention pour vous entrainer sur ce topic ou personne ne m'a répondu:
http://irrlicht-fr.org/viewtopic.php?id=1451

Merci de regarder j'aimerais bien résoudre ce problème wink

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
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
89 invités en ligne
Aucun membre connecté
RSS Feed