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
    Membre averti
    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
    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
    Membre confirm�
    Inscrit en
    Ao�t 2003
    Messages
    17
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 17
    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
    Membre averti
    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
    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
    Membre confirm�
    Inscrit en
    Ao�t 2003
    Messages
    17
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 17
    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
    Membre averti
    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
    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
    Membre averti
    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
    Par d�faut
    effet de sliding

  7. #7
    Membre confirm�
    Inscrit en
    Ao�t 2003
    Messages
    17
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 17
    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
    Membre averti
    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
    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
    Membre confirm�
    Inscrit en
    Ao�t 2003
    Messages
    17
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 17
    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
    Membre averti
    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
    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
    Membre averti
    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
    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
    Membre confirm�
    Inscrit en
    Ao�t 2003
    Messages
    17
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 17
    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
    Membre averti
    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
    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
    Membre averti
    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
    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
    Membre confirm�
    Inscrit en
    Ao�t 2003
    Messages
    17
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 17
    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
    Membre averti
    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
    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
    Membre averti
    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
    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
    Membre confirm�
    Inscrit en
    Ao�t 2003
    Messages
    17
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 17
    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
    Membre averti
    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
    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
    Membre averti
    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
    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