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 :

[Irrlicht + Newton] Collision entres modeles 3D


Sujet :

Newton

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [Irrlicht + Newton] Collision entres modeles 3D
    Bonjour,

    J'éssaye depuis quelques jours déjà de réaliser un algo de collision entre deux mesh. J'utilise donc Newton et Irrlicht. J'ai d'abord commencer par faire celui entre les formes de bases (boite et cylindre) mais je désire maintenant m'attaquer aux meshs. Cependant mon code compile mais les collisions ne sont pas détectées entre mes meshs. J'utilise pour cela une classe dont voici les méthodes qui touche a la collision. (l'organisation du code et des méthodes n'est que très provisoires, j'éssaie d'abord de faire marcher la collision et je réorganise apres :p)

    la méthode qui init la physique de mon mesh :

    (je précise que le mesh ne doit pas être déplacer lors d'une collision, il est déplacé a l'aide des touches fléchées uniquement pour l'instant)

    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
            switch(m_Nmodele->getType())
            {
                case ESNT_MESH:
                {
                    IMeshSceneNode *msn = (IMeshSceneNode*)m_Nmodele;
                    m_collision = makeCollisionFromMesh(nWorld, msn->getMesh());
                    break;
                }
                case ESNT_ANIMATED_MESH:
                {
                    IAnimatedMeshSceneNode *amsn = (IAnimatedMeshSceneNode*)m_Nmodele;
                    m_collision = makeCollisionFromMesh(nWorld, amsn->getMesh()->getMesh(0));
                    break;
                }
                default:
                {
                    printf("TUMLE: passed node has no mesh\n");
                }
            }//switch node->getType
    /*
            //make a newton body
            NewtonBody *body = makeNewtonBody(collision, masse,
                                              m_Nmodele->getPosition(),
                                              m_Nmodele->getRotation(),
                                              m_Nmodele->getBoundingBox().getCenter());
    */
     
            // On initialise le corps avec la boite de collision
            m_pBody = NewtonCreateBody (nWorld, m_collision);
     
            if (m_pBody == NULL)
                cerr << "Impossible d'initialiser le corps.";
     
            // On détruit la boite de collision, on n'en a plus besoin
            NewtonReleaseCollision (nWorld, m_collision);
     
            //matrix4 matrice; // On créé une matrice
            float matrice[4][4];
     
            //On initialise la matrice, qu'on définit comme matrice identité
            for (int x = 0 ; x < 4 ; ++x)
                for (int y = 0 ; y < 4 ; y++)
                {
                    if (x == y)
                        matrice [x][y] = 1.0f;
                    else
                        matrice [x][y] = 0.0f;
                }
     
            matrice [3][0] = m_Nmodele->getPosition().X;
            matrice [3][1] = m_Nmodele->getPosition().Y;
            matrice [3][2] = m_Nmodele->getPosition().Z;
     
            // Enfin, on affecte notre matrice (qui représente donc sa position dans l'espace)
            // à notre corps grâce à la fonction NewtonBodySetMatrix
            NewtonBodySetMatrix (m_pBody, &matrice [0][0]);
    voilà la fonction qui créer une collision depuis un mesh :

    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
    //! make a newton collision from an irrlicht mesh
    NewtonCollision* makeCollisionFromMesh(NewtonWorld *nWorld, IMesh *irr_mesh )
    {
    int nMeshBuffer = 0; //Mesh Buffer count
    IMeshBuffer *mesh_buffer = NULL;
    float *vertices; //Array to store vertices
     
    u32 nVertices = 0;
     
    //Get number of vertices
    for( nMeshBuffer=0 ; nMeshBuffer < irr_mesh->getMeshBufferCount() ; nMeshBuffer++ )
    {
    nVertices += irr_mesh->getMeshBuffer(nMeshBuffer)->getVertexCount();
    }
     
     
    //create buffer for vertices
    vertices = new float[nVertices * 3];
    u32 tmpCounter = 0;
     
    //Get (irr_)mesh buffers and copy face vertices
    for( nMeshBuffer=0 ; nMeshBuffer < irr_mesh->getMeshBufferCount() ; nMeshBuffer++ )
    {
     
    mesh_buffer = irr_mesh->getMeshBuffer(nMeshBuffer);
     
    //Get pointer to vertices and indices
    S3DVertex *S3vertices = (S3DVertex*)mesh_buffer->getVertices();
     
     
    //copy vertices from mesh to buffer
    for(int i=0; i<mesh_buffer->getVertexCount(); i++)
    {
     
    vertices[tmpCounter++] = S3vertices[i].Pos.X;
    vertices[tmpCounter++] = S3vertices[i].Pos.Y;
    vertices[tmpCounter++] = S3vertices[i].Pos.Z;
    }
    }
     
    //Create Newton collision object
    NewtonCollision *collision_obj = NewtonCreateConvexHull(nWorld,nVertices,vertices,sizeof(float)*3,NULL);
     
    //delete vertices
    delete [] vertices;
     
    return collision_obj;
    }
    Merci d'avance a ceux qui essaieront de m'aider

    ps: Ne faites pas attention aux commentaires multilangues, j'ai pompé ces codes sur des tutos et j'ai mélangé suivant mes besoins mais ca ne fonctionne jamais :X

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, je ne peux pas t'aider sur ton code, mais ce dont je suis sûr, c'est que si tu fais du calcul scientifique, oublie les float et utilise des double

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Salut, merci de ta réponse mais toutes les fonctions de newton se servent de float, il faudrait de toute façon que je cast mes floats en double lors de l'appel des fonctions. Par ailleurs, j'ai récupérer des morceaux de code sur les tutos officiel d'irrlicht et newton donc je pense que si il utilise des floats c'est que ca passe.

    a plus

Discussions similaires

  1. Irrlicht Collision entre 2 Mesh
    Par suyeon dans le forum Irrlicht
    Réponses: 3
    Dernier message: 07/07/2010, 12h40
  2. Collision entre 2 modeles
    Par saturn1 dans le forum XNA/Monogame
    Réponses: 6
    Dernier message: 24/12/2009, 21h06
  3. Réponses: 6
    Dernier message: 13/09/2005, 18h59
  4. GLScene et les collisions entre les objets
    Par HopeLeaves dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/06/2005, 19h45
  5. Réponses: 4
    Dernier message: 25/09/2004, 09h58

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