Historique des modifications - Message

Message #10632

Sujet: problemes de picking


TypeDateAuteurContenu
Dernière modification02-08-2012 18:10:45Gehogor
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 message01-08-2012 20:40:39Gehogor
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

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
91 invités en ligne
membre en ligne: -
RSS Feed