IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

detection de collision en osg


Sujet :

C++/CLI

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut detection de collision en osg
    salut a tous ,voila j'ai un projet de fin d'étude le thème est "rendu d'effort dans un simulateur de chirurgie dentaire " j'utilise l'interface haptique phontom omni. la scène virtuelle est composée d'un modèle (dent+mâchoire) et l'outil "la fraise"
    je les ai chargé sur c++ en utilisant OSG (openscenegraph) le problème est comment faire la détection de collision entre les dents et la fraise ?????

    merci de m'aider, je ne vois plus d'issue !!!!

  2. #2
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Points : 30
    Points
    30
    Par défaut
    Tu aurais eu plus de chance en allant directement sur le forum d'OSG.

    OSG propose des outils pour faire des collision entre les bounding boxes ou directement au niveau des triangles. Tout dépend de la précision dont tu a besoin.
    Voici des tutoriels qui pouront surement t'aider (en anglais):
    - collision de BB: http://www.cs.clemson.edu/~malloy/co...ollisions.html
    - collision de traingle: http://www.cs.clemson.edu/~malloy/co...Collision.html

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    d'abord merci d'avoir pris la peine de me répondre.
    j'ai deja essayé de faire un test avec seulement une dent et une petite boule,j'ai englobé ma dent dans des petites sphères une a coté de l'autre ,mais j'ai eu un souci pour le calcul de la force de retour au point d'intersection entre les deux sphères,et en plus cette méthode n'est pas précise .j'aimerai bien être diriger vers des algorithmes de détection de collision plus précis ou le test serait fais sur les primitives .
    aussi j'aurai aimer savoir s'il y avait un moyen pour accéder aux primitives d'un objet (exemple la dent) avec osg .

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Points : 30
    Points
    30
    Par défaut
    Je ne suis pas sur de comprendre, tu a regardé le tutorial du second lien? Ca explique comment faire la détection de collision au niveau des triangles avec OSG. Il suffit de télécharger l'archive avec le code source. Regarde voir le fichier movableObject.cpp la fonction collidesWith.

    Sinon pour répondre a ta question, tu peux acceder aux primitives d'un osg::Geometry a l'aide des fonctions getPrimitiveSet, getVertexArray.

    J'imagine que tu connais déja la doc de référence ici: http://www.openscenegraph.org/docume...cs/a00267.html

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    bonjour, grand merci...

    j'ai essayé les programmes avec mes modèles (une boule entre en collision avec une dent), j'ai fait des modifications en ce qui concerne l'affichage (j'ai utilisé OSG au lieu SDL), je me suis trouvées confronté a plusieurs problèmes:
    - quand je change l'extension des objets (.osg au lieu de .obj) le programme ne marche pas(aucune détection).
    -le programme s'exécute très lentement.

    je voudrai aussi savoir s'il y a moyen pour que la boule ne pénètre pas dans la dent (la boule doit rester a la surface de la dent même si je continue a la faire avancer vers l'intérieur de la dent (effet de slinding)).

    merci pour vos conseils....

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    effet de sliding

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Points : 30
    Points
    30
    Par défaut
    Salut,

    Ca va etre assez difficille de t'aider sans avoir les models que tu utilise sous la main mais laisse moi essayer quand meme.

    - il ne devrait pas y avoir de différence quelque soit le format du fichier, tu es bien sur que les modèles sont exactement les même dans le fichier obj et osg? Tu es sur aussi que tu as tout les plugins qu'il faut afin de bien charger les différents formats de fichiers?

    - la collision de triangles n'est pas super optimisée c'est sur. Ca va etre beaucoup plus lent que ne faire que les collisions sur les boundingbox. Maintenant il doit y avoir moyen d'optimisé ça. Essaye de faire des recherche sur le net pour voir comment optimisé l'algo de collision entre les triangles.

    Pour le fait que la boule ne pénètre pas la dent, il faut que tu annule le mouvement manuellement dés que tu reçoit un signal de collision. Il n'y a pas moyen de faire ça automatiquement avec OSG.

    Maintenant si tu ne veux pas faire toi même d'optimisation ni de changement au niveau du mouvement il est toujours possible d’intégrer un moteur physique a ta simulation. Par exemple tu pourrais intégrer osgbullet. Ça te permettrai d'avoir de très bonne perfs mais ça gérerai aussi tout seul le sliding que tu désire avoir entre ta dent et la boule. Bien sur ça veux dire aussi qu'il faut tu intègre le moteur bullet donc il faut voir si c'est pas un peu overkill pour ce que tu désire faire.

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    salut, merci encore une fois pour votre aide...

    pour ce qui est des plugins, normalement y'a pas de problème puisque j'arrive a charger les objets .osg, c'est juste le programme ne détecte pas la collision.

    l'autre problème est que j'ai plusieurs dents que je charge séparément (une par une), je doit préserver leurs positions, c'est a dire que dans le programme je dois avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stationaryPAT->setPosition( position réelle de la dent );
    la question est comment récupérer la position exacte de la dent?

    pour accélérer la détection de collision, j'ai penser a ajouter un test juste après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      const osg::BoundingSphere& bs1 = pat->getBound();
      const osg::BoundingSphere& bs2 = obj->getPat().getBound();
      if (!bs1.intersects(bs2)) 
    ou je créais une autre boundingsphere (lors de l'intersection des deux boundingsphers précédentes) pour limiter les facettes sur lesquelles j'applique le test de la collision.

    merci d'avance...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Points : 30
    Points
    30
    Par défaut
    Pour le probleme avec ton fichier osg je ne vois pas. Est ce que ca s'affiche pareil a l'écran pour ton .obj et ton .osg? Comment a tu créer ton fichier osg a partir du fichier obj?


    Citation Envoyé par iroquoise rosa Voir le message
    l'autre problème est que j'ai plusieurs dents que je charge séparément (une par une), je doit préserver leurs positions, c'est a dire que dans le programme je dois avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stationaryPAT->setPosition( position réelle de la dent );
    la question est comment récupérer la position exacte de la dent?
    Que veux tu dire par position exacte? La position par rapport au root de ta scene? OSG utilise un scene graph dans la position de chaque PAT est relatif par rapport a la position du parent si c'est ca que tu veux dire?

    Je ne comprend pas non plus ce que tu veux dire par préserver la position des dents? Si tu ne les bouge pas manuellement elle ne devrait jamais bouger toute seule.

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    re
    alors moi j'ai des modèles .3DS c'est a dire que je peux les visualiser avec le logiciel 3DSmax,donc je peux de ce fait les exporter a n'importe quelle autre extension (soit .obj soit .osg soit .3DS (y'en a d'autre aussi) ).

    osg peux lire ces extensions que ce soit( .OSg ou .3DS ou .Obj) grâce a osgDB.

    le problème est que je vois pas pourquoi il peut les lire mais dés que j'applique le programme de détection de collision (du site) il détecte rien.!!!!!???? sachant que j'ai fait des modifications, j'ai pris que les fichiers "movableObject.cpp","movableObject.h","jgt.
    cpp","jgt.h", et le test de la collision

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        if(movingObject->collidesWith(stationaryObject))
         {
         cout<<"collision"<<endl;
          }
        else{
    	  cout<<"pas de collision"<<endl;
        }
    je vous explique ,le modèle dentier est composé de la gencive,et des 32 dents c'est des objets séparables et donc que je peux exporter un par un (c-a-d associer chaque objet a un node et les nodes au root).en les exportant de cette manière, au final si j'affiche le tout j'obtiendrai la gencive avec les dents bien en place (sachant que je les ai charger séparément).

    mais la au programme, les arguments d'entrées de MovableObject
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      stationaryObject = new MovableObject(model1.get(), stationaryPAT);
    sont "le modele"+"la transformation", mais pour les dents je connais pas leurs positions exactes pour les préciser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stationaryPAT->setPosition( Vec3d(la position de l'objet fixe) );
    précision: stationaryObject c'est la dent
    movingObject c'est la boule

    merci pour votre aide...

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    finalement j'étais bête,, je croyais qu'en déclarant une transformation et en ne précisant pas (setposition(une position)) qu'il va directement la poser a 0(zéro); mais ce n'est pas le cas.. j'ai pu positionner mes dents correctement dans la scène..
    il me reste a savoir comment la boule ne pénètre pas dans la dent quand elle la rencontre??!!!

    ce qui faut savoir c'est que l'interface haptique que j'utilise (phantom omni de la société sensable) a des bibliothèques qui contiennent des fonctions qui peuvent me fournir la position en continue de l'effecteur(genre souris 3D) ces positions la je les affecte a ma boule donc la boule bouge en continue...

    je veux que quand y a collision la boule reste a la surface de la dent c-a d que je puisse récupéré et maintenir la boule a la position(en surface) ou y a eu collision

    je vois pas comment stocké cette position la ...elle est donner en continue..!!!

    j'abuse de votre gentillesse,, merci beaucoup....

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Points : 30
    Points
    30
    Par défaut
    Ok pour les formats, donc tu exporte depuis 3DS vers .obj ou vers osg. Et d'après ce que je comprend quand tu exporte vers .obj la collision fonctionne mais pas quand tu exporte vers .osg. Qu'en est-il en utilisant directement le fichier .3ds, la collision marche ou pas? En tout cas il y a peut être un bug dans le plugin d'export de 3ds vers osg.

    Sinon pour le coup, quand tu récupère la position depuis l'interface haptique: tu sauvegarde la position OSG actuelle de la boule, tu affecte la nouvelle position a ta boule, tu test la collision, et si la collision existe tu réaffecte simplement la position précédente a ta boule que tu avais sauvegardé.

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    slt, et merci de me repondre...

    oui j'ai essayé avec l'extension .3ds mais ça marche pas la détection de collision.

    j'ai essayé de sauvegarder la position, et lors de la collision je la réaffecte a la boule mais elle ne bougera pas après, elle reste figer dans cette position...

  14. #14
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    bonjour ...

    voila le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
        HDdouble  pos[3];
        hdGetDoublev(HD_CURRENT_POSITION,pos);// la fonction qui recupére la  postion de l'interface haptique
    
    //création de l'objet mobile avec sa transformation
    
    osg::ref_ptr<osg::Group> modele3D = 
    	dynamic_cast<osg::Group*>(osgDB::readNodeFile("boule.obj"));//boule
    
    osg::PositionAttitudeTransform* movingPAT = new  osg::PositionAttitudeTransform;
        
        movingPAT->setPosition( osg::Vec3d(pos[0]/10,-pos[2]/10,pos[1]/10 )); //c'est la ou j'associe la positon de l'interface haptique a mon objet ( la boule)
       
     movingPAT->addChild(modele3D.get());
      root->addChild(movingPAT);
    		
    MovableObject* movingObject = new MovableObject(modele3D.get(), movingPAT);
    
    //creation de l'objet statique avec sa transformation
    
    osg::ref_ptr<osg::Group> modele3DD = 
    	dynamic_cast<osg::Group*>(osgDB::readNodeFile("dent.obj"));
    
    osg::PositionAttitudeTransform* stationaryPAT = new osg::PositionAttitudeTransform;
        
    	stationaryPAT->addChild(modele3DD.get());
    	root->addChild(stationaryPAT);
    	
    	MovableObject* stationaryObject = new MovableObject(modele3DD.get(), stationaryPAT);
    
    //premier teste de la collison 
    
    if( movingObject ->collidesWith(stationaryObject) )
    		{
    			cout<<"collision BOOOOOOMMMMMM"<<endl;
    			compt=1;
    	  
    		}
    		else{
    			cout<<"pas de collision "<<endl;
    			compt=0;
        
    			}
    //des fonction liée a l'affichage 
    	osgViewer::Viewer viewer;
    	viewer.setUpViewInWindow( 100,100, 512, 512 );
    	viewer.setCameraManipulator(new osgGA::TrackballManipulator());
    	viewer.setSceneData(root);
    	viewer.realize();
    
    //la je rentre dans la boucle =>genre l’équivalent de glmainloop de opengl
    
    while( !viewer.done() )
    	{
    		
    	viewer.frame();
    
        hdGetDoublev(HD_CURRENT_POSITION,pos);
    
    if(compt==1)// y'a collision 
    {
    	
    MovableObject* movingObject = new MovableObject(modele3D.get(), movingPAT);//en ecrivant ça j'ai gardé la postion (movingPAT qu'il avait au moment de la collision)
    
    }
    else //y'a pas collision
    {
       
        movingPAT->setPosition(osg::Vec3d(pos[0]/10,-pos[2]/10,pos[1]/10);//movingPAT prend les positions de l'interface haptique );      
    	
    	MovableObject* movingObject = new MovableObject(modele3D.get(), movingPAT);
    }
    le problème avec ce code c'est que des que ya collision la boule garde la positon au moment du contacte et elle ne bouge plus même si je fais bouger l'interface c'est a dire une fois que (compt=1) c'est bon compt ne reprend plus la valeur 0....

    j’espère que j'ai été explicite je sais que c'est pas vraiment évidement de comprendre la chose quand elle est pas devant nous ...mais merci beaucoup pour votre aide

  15. #15
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Points : 30
    Points
    30
    Par défaut
    Salut,

    C'est dur de voir ce qu'il ne va pas seulement avec un bout de code. Le mieux ce serait de m'envoyer le code entier par MP je pourrait regarder comme ca.

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    BONJOUR ,merci beaucoup pour votre aide ,c'est bon j'ai réussi a eviter que la boule pénétré la dent
    Je fais le test de la collision avec un 3eme objet crée, les positions de ce dernier sont toujours mis a jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    osg::ref_ptr<osg::Group> root = new osg::Group;
     
    	osg::ref_ptr<osg::Group> modele3D = 
    	dynamic_cast<osg::Group*>(osgDB::readNodeFile("boule_repere.obj"));   //boule
     
    	osg::ref_ptr<osg::Group> modele3DD = 
    	dynamic_cast<osg::Group*>(osgDB::readNodeFile("boule_repere.obj"));
     
     
    	HDdouble  pos[3];
        hdGetDoublev(HD_CURRENT_POSITION,pos);//position de l'interface haptique
     
    	osg::PositionAttitudeTransform* movingPAT = new osg::PositionAttitudeTransform;
     
        movingPAT->setPosition( osg::Vec3d(pos[0]/10,-pos[2]/10,pos[1]/10 )); //associer les positions de l'interface haptique a la boule
     
            movingPAT->addChild(modele3D.get());
    	root->addChild(movingPAT);
    	MovableObject* movingObject = new MovableObject(modele3D.get(), movingPAT);//crée un objet de la classe MovableObject
     
    ////////creation de l'objet statique 
    	osg::PositionAttitudeTransform* stationaryPAT = new osg::PositionAttitudeTransform;
    	const osg::BoundingSphere& bb2=modele3DD->getBound();
     
    	stationaryPAT->addChild(modele3DD.get());
    	root->addChild(stationaryPAT);
    	MovableObject* stationaryObject = new MovableObject(modele3DD.get(), stationaryPAT);
     
     
    	////////// la partie ajouter 
    	osg::PositionAttitudeTransform* tempPAT = new osg::PositionAttitudeTransform;
     
    	 tempPAT->setPosition( osg::Vec3d(pos[0]/10,-pos[2]/10,pos[1]/10 )); 
    	MovableObject* temp = new MovableObject(modele3D.get(),tempPAT);
       //////////
    	osgViewer::Viewer viewer;
    	viewer.setUpViewInWindow( 100,100, 512, 512 );
    	viewer.setCameraManipulator(new osgGA::TrackballManipulator());
    	viewer.setSceneData(root);
    	viewer.realize();
     
    	while( !viewer.done() )
    	{
     
    	viewer.frame();
     
    	HDdouble  pos[3];
        hdGetDoublev(HD_CURRENT_POSITION,pos);
    	osg::PositionAttitudeTransform* tempPAT = new osg::PositionAttitudeTransform;
     
    	 tempPAT->setPosition( osg::Vec3d(pos[0]/10,-pos[2]/10,pos[1]/10 ));
    	 tempPAT->addChild(modele3D);
    	 MovableObject* temp = new MovableObject(modele3D.get(),tempPAT);//crée un objet de la classe MovableObject
     
     
     
     
    	///teste de collision//// je teste temp non pas movableObject comme je faisais 
     
    	if( temp->collidesWith(stationaryObject) )
    	{
         //cout<<"collision boooooooooooooooooom"<<endl;
    		compt=1;
     
     
        }
        else{
    	  //cout<<"pas de collision "<<endl;
    	   compt=0;
     
        }
     
    if(compt==1)
    {
     
     
     
     
    	MovableObject* movingObject = new MovableObject(modele3D.get(), movingPAT);
     
    }
    else
    {
    	    movingPAT->setPosition( osg::Vec3d(pos[0]/10,-pos[2]/10,pos[1]/10 )); 
     
    	MovableObject* movingObject = new MovableObject(modele3D.get(),movingPAT);
     
    }
     
     
     
    	}
     
    }

  17. #17
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    re

    je voudrais savoir est ce qui serait possible d'optimiser le code que vous m'avez donner sur le site http://www.cs.clemson.edu/~malloy/co...Collision.html
    parce que dés qu'il s'agit d'objet avec un plus grand maillage (grand nombre de triangle) il devient lent c'est a dire le mouvement n'est plus temps réel j'ai pensé a faire cette modification dans la fonction "collidesWith" du fichier MovableObject.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    bool MovableObject::collidesWith(MovableObject* obj) 
    {
      float* v0;
      float* v1;
      float* v2;
      float* u0;
      float* u1;
      float* u2;
    
      //utilisation des boundingshepre  pour réduire  les tests 
      
      const osg::BoundingSphere& bs1 = pat->getBound();//l'objet qui bouge 
      
     
      
      const osg::BoundingSphere& bs2 = obj->getPat().getBound();
      
    
      if (!bs1.intersects(bs2))return false;
      setDirtyTrue();
    
      unsigned int numFaces, objNumFaces;
      // This whole process could be optimized for more complicated objects by
      // checking bounding boxes of individual geodes
      // Has not been tested for objects w/ more than 1 geode and drawable
      // Do the more precise triangle/triangle collision detection
      numFaces = faces.size();
    
    
      objNumFaces = obj->faces.size();
      
      updateVertices();
      obj->updateVertices();
       for (unsigned int i=0; i<numFaces; ++i) 
         {
         v0 = vertices[faces[i][0]].ptr();
         v1 = vertices[faces[i][1]].ptr();
         v2 = vertices[faces[i][2]].ptr();
    
    
         for (unsigned int j=0; j<objNumFaces; j++) 
    		 //U=> c'est les vertex de l'objet statique
    	 {
           u0 = obj->vertices[obj->faces[j][0]].ptr();
           u1 = obj->vertices[obj->faces[j][1]].ptr();
           u2 = obj->vertices[obj->faces[j][2]].ptr();
      
    
           if ( NoDivTriTriIsect( v0, v1, v2,u0, u1, u2)) 
    	   {
           //modification 
    		   i=objNumFaces;
    		   j=objNumFaces;
          //le forcer  a sortir du test dés qu'il trouve une fois une intersection 
    		   return true;
             
           }
    	  
         }
      }
      return false;
     
    }
    mais ça reste lent encore est ce que ça veut dire que je dois laisser tomber ce code ou y a encore de l'espoir !

    merci de m'aider

  18. #18
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Points : 30
    Points
    30
    Par défaut
    Alors plusieurs remarques:

    - j'ai peu etre louper un truc mais quand je vois ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if(compt==1)
    {
     	MovableObject* movingObject = new MovableObject(modele3D.get(), movingPAT);
     
    }
    else
    {
    	    movingPAT->setPosition( osg::Vec3d(pos[0]/10,-pos[2]/10,pos[1]/10 )); 
     
    	MovableObject* movingObject = new MovableObject(modele3D.get(),movingPAT);
     
    }
    Tu fait des new a chaque frames mais tu ne garde pas le pointeur vers l'objet créé, on est pas en managé ici et si c'est vraiment comme ca dans ton code tu a un bon gros memory leak et la memoire va grossir un peu a chaque frame. OpenSceneGraph a des SmartPointer exprès pour ça donc il serait mieux de s'en servir.

    pour l'optimisation de l'algo voici quelques idées:
    - ne faire le calcul de collision seulement si la boule a vraiment bougé, je ne sais pas si elle bouge vraiment a chaque frame

    - pour des grosse geometries, séparer la geometry en plus petite geometries avec chacune une bounding box propre, ensuite ne faire le calcul de collision au niveau des triangles seulement pour les petites geometry ou le calcul de collision de bounding box est positif.

    - si la calcul de collision est toujours trop lent, il serait peut etre mieux de faire l'update de la position de la boule ainsi que le calcul de collision dans un thread séparé de celui de l'affichage. Ainsi meme si le thread est plus lent tu gardera quand même tes 60FPS. Par contre un autre thread implique de faire attention à la concurrence

  19. #19
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    bonjour merci de m'avoir répondu encore une fois

    je vais vous envoyer le projet tout entier si vous pouvez jeter un coup d’œil ça serait sympa ...
    je sais pas vraiment comment gérer les pointeurs (je les utilise; mais apparemment de la mauvaise manière ...)

    et pour ce qui est des thread je sais pas du tout comment les utiliser,et ou les introduire !!

    merci de m’accorder un peu (beaucoup ) de votre temps

  20. #20
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    BONJOUR
    pour l’accélération de l'algorithme j'ai compris que je devais utiliser une Hiérarchie accélératrice c'est a dire comme vous avez dit diviser l'espace contenant l’ensemble des triangles a l’aide de volumes englobants...mon problème est comment cela peut se faire (point de vue implémentation )


    MovableObject
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    #include <iostream>
    #include <osg/Geometry>
    #include <osg/ShapeDrawable>
    #include <osg/PolygonMode>
    #include <osgDB/ReadFile>
    #include <osg/PositionAttitudeTransform>
    #include <osg/io_utils>
    
    
    #include "movableObject.h"
    #include "jgt.h"
    
      using namespace std;
    
    MovableObject:: MovableObject(osg::Group* mod,
        osg::PositionAttitudeTransform * pat)
      : model(mod),
        pat(pat),
        speed(5.0),
        x_facing(0.0),     //Set the initial facings to be 0 (default)
        y_facing(0.0),
        z_facing(0.0) {
        copyTriangles();
    }
    
    void MovableObject::setDirtyTrue() {
      dirty = true;
      computeLocalToWorldMatrix();
    }
    
    
    void MovableObject::computeLocalToWorldMatrix() 
    {
      worldTransMatrix = osg::Matrix::rotate(pat->getAttitude()) * osg::Matrix::translate(pat->getPosition());
    }
    //**********************************************
    //je recupére dans cette fonction la geometrie
    //*********************************************
    void MovableObject::copyTriangles(const osg::Geometry* g) //comme argument  une geometrie
    {
      const GLfloat* v = static_cast<const GLfloat*>(g->getVertexArray()->getDataPointer());
      unsigned int offset = vertices.size();
      //cout<<"offset"<<offset<<endl;
      unsigned int numVertices = g->getVertexArray()->getNumElements();
      unsigned int numIndices;
    
      for (unsigned int i=0; i<numVertices; ++i) 
      {
        vertices.push_back(osg::Vec3(v[i*3], v[i*3+1], v[i*3+2]));
      }
    
      const osg::PrimitiveSet* ps;
      unsigned int v0,v1,v2;
    
      for (unsigned int i=0; i<g->getNumPrimitiveSets(); ++i) 
      {
        ps = g->getPrimitiveSet(i);
        if (ps->getMode() == GL_TRIANGLE_STRIP) 
    	{
          v0 = ps->index(0);
          v1 = ps->index(1);
          numIndices = ps->getNumIndices();
          for (unsigned int j=2; j<numIndices; ++j) {
            v2 = ps->index(j);
            faces.push_back(osg::Vec3s(v0+offset, v1+offset, v2+offset));//je constitu la face dun triangle grace o 3points vetex
            v0 = v1;
            v1 = v2;
          }
        } else if (ps->getMode() == GL_TRIANGLES) {
          numIndices = ps->getNumIndices();
          for (unsigned int j=0; j<numIndices; j+=3) {
            v0 = ps->index(j);
            v1 = ps->index(j+1);
            v2 = ps->index(j+2);
            faces.push_back(osg::Vec3s(v0+offset, v1+offset, v2+offset));
          }
        } else {
         // Woops, only supporting triangles and triangle strips
         throw std::string("Not a triangle in copyTriangles");
        }
      }
    }
    
    //************************************************************************
    
    
    void MovableObject::copyTriangles() {
      const osg::Geode* g;
      const osg::Geometry* d;
      vertices.clear();
      faces.clear();
      for (unsigned int i=0; i<model->getNumChildren(); ++i) 
      {
        g = dynamic_cast<const osg::Geode*>(model->getChild(i));
        if (!g) continue;
        for (unsigned int j=0; j<g->getNumDrawables(); ++j) {
          d = dynamic_cast<const osg::Geometry*>(g->getDrawable(j));
          if (d) 
    	  {
            copyTriangles(d);
          }
        }
      }
    }
    
    
    void MovableObject::updateVertices() {
      if (dirty) {
        copyTriangles();//j'ai recupéré la geometrie
        for (unsigned int i = 0; i < vertices.size(); ++i) 
    	{
          vertices[i] = vertices[i] * worldTransMatrix;
        }
        dirty = false;
      }
    }
    
    //la collision
    
    bool MovableObject::collidesWith(MovableObject* obj) 
    {
      float* v0;
      float* v1;
      float* v2;
      float* u0;
      float* u1;
      float* u2;
    
      //englobe l'objet dans une sphere ,je voudrais que mon objet soit diviser en plusieurs petite sphere commet je fais ?
      
      const osg::BoundingSphere& bs1 = pat->getBound();//l'objet qui bouge 
      
     
      
      const osg::BoundingSphere& bs2 = obj->getPat().getBound();
    
    
      if (!bs1.intersects(bs2))return false;
      setDirtyTrue();
    
      unsigned int numFaces, objNumFaces;
      // This whole process could be optimized for more complicated objects by
      // checking bounding boxes of individual geodes
      // Has not been tested for objects w/ more than 1 geode and drawable
      // Do the more precise triangle/triangle collision detection
      numFaces = faces.size();
    
    
      objNumFaces = obj->faces.size();
      
      updateVertices();
      obj->updateVertices();
       for (unsigned int i=0; i<numFaces; ++i) 
         {
         v0 = vertices[faces[i][0]].ptr();
    
         v1 = vertices[faces[i][1]].ptr();
         v2 = vertices[faces[i][2]].ptr();
    
    
         for (unsigned int j=0; j<objNumFaces; j++) 
    		 //U=> c'est les vertex de l'objet statique
    	 {
           u0 = obj->vertices[obj->faces[j][0]].ptr();
           u1 = obj->vertices[obj->faces[j][1]].ptr();
           u2 = obj->vertices[obj->faces[j][2]].ptr();
      
    
           if ( NoDivTriTriIsect( v0, v1, v2,u0, u1, u2)) 
    	   {
           
    		   i=objNumFaces;
    		   j=objNumFaces;
    
    		   return true;
             
           }
    	  
         }
      }
      return false;
     
    }
    
    
    //les touche du clavier

    merci encore

Discussions similaires

  1. Detection de collisions
    Par julio02200 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 27/12/2009, 23h06
  2. Detection de collision de polygones 2d
    Par BruceBoc dans le forum Physique
    Réponses: 1
    Dernier message: 13/04/2007, 00h01
  3. Detection de collision entres deux cylindres.
    Par Sandro Munda dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/11/2006, 14h36
  4. ALGO detection de collision
    Par tetepoive dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/05/2006, 13h33
  5. Detecter des collisions
    Par jmoati dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 10/04/2005, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo