Je te colle vite fait une fonction à la suite, les commetaires devraient suffir, la récupération du node et du maillage sont dans un ordre qui me va bien, tu peux évidemment la changer pour toi.
MVector3d GrIrrlicht::findPoint3D_withScreenPos(const MVector2d& cursor,ISceneNode* meshNode,triangle3df* triangleImpacted)
{
ISceneCollisionManager* collision = m_device->getSceneManager()->getSceneCollisionManager();
ISceneManager* manager = m_device->getSceneManager();
vector3df outCollisionPoint; // Sortie: coordonnées du point de collision.
triangle3df outTriangle; // Sortie: coordonnées du triangle de collision.
// On récupère la ligne de projection du curseur de souris par rapport au champ de vision de la caméra.
line3df line = collision->getRayFromScreenCoordinates( vector2d<s32>( (s32)cursor.x,(s32)cursor.y) , m_cameraFPS );
// Là, tu récupères le ITriangleSelector de ton maillage, son pointeur peut être
// stocké dans le node pour un accès plus facile.
ITriangleSelector* triangleSelector = meshNode->getTriangleSelector();
const ISceneNode* outNode;
// Ce premier "triangleSelector " correspond à la bounding box de ton objet,
// on fait ce premier test pour augmenter les performances, une boite ne
// contient que quelques triangles de maillages.
if(triangleSelector != 0)
if(collision->getCollisionPoint(line,triangleSelector,outCollisionPoint,outTriangle,outNode) == true)
{
IMesh* mesh = //Là, tu récupères le maillage à proprement dit avec ta propre technique.
if(mesh!=0)
{
// Ce second "triangleSelector" correspond au maillage exacte de ton objet,
// donc on a la possibilité de récupérer le point et le triangle de collision précisément.
triangleSelector = manager->createTriangleSelector(mesh,meshNode);
collision->getCollisionPoint(line,triangleSelector,outCollisionPoint,outTriangle,outNode);
triangleSelector->drop();
if(triangleImpacted != 0)
*triangleImpacted = outTriangle;
}
}
// Renvoi les coordonnées x, y et Z du point de collision trouvé sur le mailage.
return irrToVector(outCollisionPoint);
}
Bon courage.