Historique des modifications - Message

Message #10632

Sujet: problemes de picking


Type Date Auteur Contenu
Dernière modification 02-08-2012 18:10:45 Gehogor
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.
Création du message 01-08-2012 20:40:39 Gehogor
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.

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
194 invités en ligne
membre en ligne: -
RSS Feed