Pages: 1
- Accueil forums
- » Camera
- » Sélection de SceneNode avec une caméra de type WOW
17-09-2010 20:13:22
- benjani13
- Membres
- Date d'inscription:
- Messages: 9
- IP: 93.10.127.55
- Courriel
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
18-09-2010 14:30:40
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
regard les example irrlicht sur les triange_selector
Hors ligne
18-09-2010 16:04:44
- benjani13
- Membres
- Date d'inscription:
- Messages: 9
- IP: 93.10.127.55
- Courriel
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
18-09-2010 16:48:08
- TUpac
- Membres

- Date d'inscription:
- Messages: 387
- IP: 88.168.3.38
- Courriel
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)
{................
"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."
Hors ligne
18-09-2010 17:13:14
- benjani13
- Membres
- Date d'inscription:
- Messages: 9
- IP: 93.10.127.55
- Courriel
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
18-09-2010 21:58:20
- TUpac
- Membres

- Date d'inscription:
- Messages: 387
- IP: 88.168.3.38
- Courriel
Ben je pense que tu t'exrime mieu en anglais parce-que j'ai toujours rien compris ![]()
Mais si tu as réussi .. tant mieu.
"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."
Hors ligne
19-09-2010 08:06:27
- benjani13
- Membres
- Date d'inscription:
- Messages: 9
- IP: 93.10.127.55
- Courriel
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 ![]()
Hors ligne



