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

Newton Discussion :

[Newton] Probleme de collision avec la map


Sujet :

Newton

  1. #1
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut [Newton] Probleme de collision avec la map
    Salut à tous,

    J'ai récemment découvert les tutoriaux sur Newton et je me suis dit que ca serait cool de l'intégrer à mon moteur 3D. Le moteur 3D dispose d'une classe qui gère des BSP et d'une classe qui gère des déplacement à pieds (genre FPS). Je me suis dis qu'en entourant ma caméra d'une sphère et en utilisant NewtonTreeCollision, j'arriverais probablement à un résultat meilleur que mes fonctions de collisions faite maison. Je me suis donc lancé dans l'aventure, mais je traverse les murs :\. C'est balo...

    Je suis certain que c'est moi qui utilise mal le moteur et donc toute information complémentaire me sera utile.

    La partie sur les TreeCollision me semble ok. Pour moi le probleme viens de la caméra mais je donne tout le code au cas ou...

    Fonction BSP::Load()

    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
     
    ...
    NewtonCollision * nCollision = NULL;
    NewtonWorld *nWorld=GSEPhysic->GetWorld();
    nCollision = NewtonCreateTreeCollision (nWorld, NULL);
    NewtonTreeCollisionBeginBuild (nCollision);
     
    GLint strideInBytes = sizeof(GLfloat) * 3;
    ...
    GLfloat *fVert=new GLfloat [polygonFaces[currentFace].numVertices*3];
     
    int vertexIndex=0;
    for(int indice=0;indice<polygonFaces[currentFace].numVertices*3;indice+=3)
    {
    			fVert[indice]=vertices[polygonFaces[currentFace].firstVertexIndex+vertexIndex].position.x;
    			fVert[indice+1]=vertices[polygonFaces[currentFace].firstVertexIndex+vertexIndex].position.y;
    			fVert[indice+2]=vertices[polygonFaces[currentFace].firstVertexIndex+vertexIndex].position.z;
    			vertexIndex++;
    }
     
    NewtonTreeCollisionAddFace (nCollision, polygonFaces[currentFace].numVertices, &fVert[0], strideInBytes, 0);
     
    delete [] fVert;
    ...
     
    NewtonTreeCollisionEndBuild (nCollision, 1);
     
    m_pBody = NewtonCreateBody (nWorld, nCollision);
     
    NewtonReleaseCollision (nWorld, nCollision);
    Constructeur de la caméra:
    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
     
    ...
    NewtonWorld *nWorld=GSEPhysic->GetWorld();
    NewtonCollision * nCollision = NULL;
     
    nCollision = NewtonCreateSphere (nWorld, 0.25, 0.25, 0.25, NULL);
     
    m_pBody = NewtonCreateBody (nWorld, nCollision);
     
    NewtonReleaseCollision (nWorld, nCollision);
     
    GSEMATRIX4X4 matrice;
    matrice.LoadIdentity();
    // 0  1   2   3
    // 4  5   6   7
    // 8  9   10 11
    // 12 13 14 15
    matrice.entries[14]=2.0;// float entries[16]
     
    NewtonBodySetMatrix(m_pBody, &matrice.entries[0]);
     
    NewtonBodySetMassMatrix(m_pBody, 15.0, 10.0, 10.0, 10.0);
     
    NewtonBodySetForceAndTorqueCallback (m_pBody, ForceAndTorqueCallback);
    Fonction Update de la caméra:
    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
     
    ...
    GSEMATRIX4X4 matrice;
    matrice.LoadIdentity();
    matrice.entries[12]=objCamera.mPos.x;
    matrice.entries[13]=objCamera.mPos.y;
    matrice.entries[14]=objCamera.mPos.z;
     
    //Modification de la position de la sphere dans Newton
    NewtonBodySetMatrix (m_pBody, &matrice.entries[0]);
     
    //A partir de la les 4 ligne qui suivent me paraissent bien bete
    //Mais je ne sais pas quoi mettre pour que la camera s'arrete lorsqu'elle
    //Rencontre un mur
    NewtonBodyGetMatrix (m_pBody, &matrice.entries[0]);
     
    glPushMatrix ();
    glMultMatrixf (&matrice.entries[0]);
    glPopMatrix();
     
    ...
    La callback ForceAndTorqueCallback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    static void ForceAndTorqueCallback (const NewtonBody * nBody)
    {
       float fMasse;
       float InertieX,InertieY,InertieZ;
     
       NewtonBodyGetMassMatrix (nBody, &fMasse, &InertieX, &InertieY, &InertieZ);
     
       float force[3]={0.0f,-fMasse*9.81,0.0f};
     
       NewtonBodyAddForce (nBody, force);
    }
    Merci

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    en fait, le problème, c'est que c'est toi qui set la position de la camera à chaque frame, du coup, tu écrase le résultat des collisions de newton.

    faire une camera qui se base sur un moteur physique est relativement dure. Il faut utiliser les forces pour déplacer ta sphere, mais tu peut aussi vouloir intervenir de temps en temps...

    dans un premier temps, commence par n'utiliser que des forces sur ta sphere, tu pourra ainsi la déplacer tout en tenant compte des collisions. Par contre, les premier résultats risquent d'être assez comique, et il faudra adapter...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    En fait, j'ai fais d'autres tests. J'ai chargé mon bsp avec le bout de code du dessus. J'ai ensuite créé une sphere que j'ai placé à une certaine hauteur à l'intérieur de la map, de manière à ce que le résultat souhaité soit que la sphere s'arrete en touchant le sol. Et bien ce n'est pas le cas...

    La sphere tombe normalement, traverse le sol et s'arrete une fois en dehors du monde (déterminé par NewtonSetWorldSize (nWorld, min, max) ). Si je place un cube immobile en dessous de la sphere, lorsque la sphere atterit sur le cube elle rebondit et fini par atteindre le point d'equilibre.

    Il y a donc bien un probleme lors du chargement de mon bsp mais je ne vois pas lequel.

    J'ai implémenté des fonctions qui permettent de voir ce que Newton voit. Les sommets semblent etre bien positionnés dans Newton.

    Les polygones de la map ne sont pas forcément des triangles mais ce sont forcément des polygones plat.

    Enfin j'ai réalisé un autre test. J'ai aggrandit le monde de newton et placé la sphere au dessus de la map (la map est complétement fermé, elle comporte un toit). La sphere tombe et lorsqu'elle rencontre la map, elle rebondit comme lors du test avec le cube et fini par atteindre le point d'equilibre.

    Je me suis alors dis que newton n'aimait pas l'ordre dans lequel je lui donne les vertices. Mais en fait il s'en fou lol.

  4. #4
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    C'est bon, j'ai réussi .

    En fait le probleme venait du fait que je ne passais pas bien les vertices dans le bon ordre.
    On ne peut pas passer les vertices à newton comme on les passe à la carte graphique. Pour newton, il faut que les polygones soient des triangles.

    Je pourrais mettre mon code, mais je trouve ca inutile car ca depend de comment chacun stocke les vertices et les indices. Si ca interesse quelqu'un je le posterai.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme avec mon mapping
    Par chady dans le forum Hibernate
    Réponses: 4
    Dernier message: 27/01/2009, 20h12
  2. probleme avec les maps
    Par teramp3 dans le forum SL & STL
    Réponses: 3
    Dernier message: 31/03/2008, 11h01
  3. Probleme avec std::map
    Par olive_le_malin dans le forum SL & STL
    Réponses: 14
    Dernier message: 27/02/2007, 09h58
  4. probleme avec le mapping d'association avec hibernate
    Par senediene dans le forum Hibernate
    Réponses: 2
    Dernier message: 10/08/2006, 13h59
  5. Probleme de auto_ptr avec les map
    Par Luther dans le forum C++
    Réponses: 8
    Dernier message: 08/04/2005, 10h49

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