Salut !
J'utilise Irrlicht dans une application MFC (l'utilisation des MFC m'est obligatoire, dans le cadre d'un projet de Fac).
L'affichage est nickel, et j'arrive à avoir 34 FPS pour une utilisation de 4% du CPU en moyenne, ce qui est, je trouve, plutôt bien.
Je dois gérer les clics souris dans l'environnement 3D affiché par Irrlicht. Pour ça, je récupère les clics souris via la bibliothèque MFC (obligé, sinon Irrlicht prend en compte un clic sur 10) et je le transforme en évènement souris irrlicht avec le code suivant :
void ClasseView::OnLButtonDown(UINT nFlags, CPoint point)
{
// Conversion des coordonnées Zone Client -> Ecran
ClientToScreen( &point );
SEvent evt;
evt.EventType = EET_MOUSE_INPUT_EVENT;
evt.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN;
evt.MouseInput.Wheel = 0;
evt.MouseInput.X = point.x;
evt.MouseInput.Y = point.y;
gestion_evt3d->OnEvent( evt );
}
Dans mon gestionnaire d'évènement Irrlicht, je récupère le point correspondant sur l'objet sur lequel on a cliqué, avec la fonction getSceneNodeFromScreenCoordinatesBB sur les coordonnées passées plus haut.
Suit ensuite l'appel à getCollisionPoint, pour avoir les coordonées correspondantes sur le mesh.
Et enfin un addCubeSceneNode pour les tests.
Le problème est que j'ai un décalage entre l'endroit où je clique sur l'écran et l'endroit où s'affiche le cube.
Le décalage a l'air de se faire sur l'axe des X, mais pas sur les Z.
Aucun problème au niveau de l'axe des Y : je clique sur un plan et la valeur est bonne.
Le seul point qui me fait douter c'est le fait que ma camera est inclinée par rapport au plan :
- position : (10, 150, 200)
- look_at : (0,0,0)
Est-ce que ça pourrait expliquer le problème ? Est-ce qu'il y a des fonctions particulières pour passer d'un clic 2D à un point 3D ?
Merci pour les réponses.
Le code de gestion du clic :
line3d<f32> ligne = smgr->getSceneCollisionManager()->getRayFromScreenCoordinates( position2d<s32>(evt.MouseInput.X, evt.MouseInput.Y) ); ISceneNode *selected = smgr->getSceneCollisionManager()->getSceneNodeFromScreenCoordinatesBB( position2d<s32>(evt.MouseInput.X, evt.MouseInput.Y) ); vector3df point; triangle3df triangle; smgr->getSceneCollisionManager()->getCollisionPoint( ligne, selected->getTriangleSelector(), point, triangle ); smgr->addCubeSceneNode( 10.0f, 0, -1, point );
Hors ligne