#0 

07-10-2009 20:07:29

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Bonjour a tous !
Je débute (ou plutôt début du niveau intermédiaire) avec Irrlicht et je voudrait poser 6 questions:
quartes sur Irrlicht, une sur une technique dont j'aimerai vraiment connaître le secret et les deux dernières portent sur Newton .

1) Est ce qu'il y a un évent qui capte le relâchement d'une touche ou au pire, qui gère une évent d'appuis sur une touche mais juste l'appuie (il ne se répète pas tant que le touche est appuyé) ?
2) Comment on fait pour parcourir tous les points d'un mesh (modèle 3D) en obtenant leurs coordonnées .
3) Pour les animations, je n y arrive pas, voici comment je procède :

Code:

m_Nperso->setFrameLoop(1, 38);

5) Je voudrait savoir de quel manière Qt a t-il créé ses slots .
6) Comment on déplace et rotationne un objet avec Newton (je suis un big débutant avec Newton), pour l'instant j'ai éssayé setTranslation() et setRotationDegree()  mais ça marche pas .
7) Newton a t-il un équivalent à NewtonCreateBox() mais qui prend pour option un mesh et qui adapte automatiquement le corp au mesh .

Hors ligne


#1 

07-10-2009 23:42:10

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

Salut

Pour la question 1 :
Moi prso je creer des variables du genre :

Code c++ :

bool toucheEspaceEstAppuye = false;


puis au moment ou j'apuie sue le touche "espace" j'execute l'action souhaiter que si toucheEspaceEstAppuye est égale a false.
Direct tu mets toucheEspaceEstAppuye a true, du coup l'action ne se répète pas. il faut aussi vérifier quand la touche espace n'est pas appuyé, pour remettre toucheEspaceEstAppuye a false. tu me suis ?
Un petit exemple :

Code c++ :

EventReceiver myReceiver;
toucheEspaceEstAppuye = false;

while (device->run())
{


    if(myReceiver.IsKeyDown(irr::KEY_SPACE) )
    {
            if(!toucheEspaceEstAppuye)       //si espace n'est pas appuyer
            {
                toucheEspaceEstAppuye = true;// on dit que espace est appuyer
                //on fait l' action qu'on a envie
                       
            }
    }
    else     //c'est que espace n'est plus appuyer
    {
        toucheEspaceEstAppuye = false;    //on remet donc notre variable a false
                                            // on peut meme verifier avant si la variable etait vrai, ce qui permet d'executer une action au relachement
    }
}


Ce n'est sans doute pas une/la meilleur solution, mais je trouve quel fonctionne pas mal (même si ça fait un peut brouillon)


Question 3:
m_Nperso est de quel type ?
Est tu sur que ton model est bien un model animer ? (c'est une question bête mais ça mais arrivé une fois d'avoir un model qui n'était plus animer après l'avoir convertie hmm )
sinon essaye pour voir setFrameLoop(2, 37); j'ai déjà vue des bug dans les animations avec la première frame ou la dernière (bug du model ou d'Irrlicht ? humm.. je me demande encore...) et vérifie la vitesse d'animation.

C'est tout ce que je peut t'apporter sur tes questions, bonne continuation.

Dernière modification par nabouill (13-10-2009 21:41:23)


mes sites: www.manga-vf.fr et www.series-vf.fr

Hors ligne


#2 

08-10-2009 08:42:04

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

@question2: regarde ce sujet, il t'apportera une grande partie des réponses que tu peux te poser sur cette quesiton
http://forum.irrlicht.fr/viewtopic.php?id=439

@question6:
Voici un petit exemple de code permettant de faire une translation:

Code c++ :


TranslateBody(NewtonBody *body, float posx, float posy, float posz)
{
    //recupère la matrice actuelle
    core::matrix4 mat;
    NewtonBodyGetMatrix(body, mat.pointer());

    // on en récupère la position
    core::vector3df pos = mat.getTranslation();
    // applique la translation
    pos = pos + core::vector3df( posx, posy,  posz);
    mat.setTranslation( pos );
   
    // applique la nouvelle attitude a ubody
    body_mesh->setPosition( pos );
    NewtonBodySetMatrix(body, mat.pointer());
}



@question7: Si c'est pour faire de l'adaptatif en temps réél, c'est pas possible. Si c'est pour ajouter au moteur
physique des objet qui ne sont pas des primitaives de bases (cube, sphère, cylindre, etc...), alors il te faut passer
par l'instruction NewtonCreateConvexHull().


Ou est la question 4 ? smile


Force et sagesse...

Hors ligne


#3 

13-10-2009 12:07:14

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Merci, grâce a vos réponses, j'ai réussis a ... déplacer mon personnage avec newton sur une map qui gère la collision (oui je sais, c'est moyen mais tout le monde est passé par la) .
Bon maintenant le problème c'est que quand je fait un translation sur ma map qui n'est pas droite (c'est une colline), mon personnage (pour l'instant symbolisé par un cube sur Newton) passe a travers la colline, comment on fait pour que la translation prenne en compte la collision .

Et aussi, quand le personnage a fini de tomber (qu'il a touché le sol), il ne veut plus tomber après un translation .

Dernière modification par Ilovechocolat (13-10-2009 12:08:34)

Hors ligne


#4 

13-10-2009 12:37:58

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Si tu fais une translation avec irrlicht il faut renvoyer la matrice modifiée de ton node à newton.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#5 

13-10-2009 16:38:52

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Autre chose de bizarre, contrairement a Irrlicht, il y a une limite de dégrée dans Newton , mais celle ci varie d'une manière mystérieuse (c'était plus simple avant), comment on fait pour régler ce problème .

Hors ligne


#6 

13-10-2009 19:07:36

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Ilovechocolat :

mon personnage (pour l'instant symbolisé par un cube sur Newton) passe a travers la colline, comment on fait pour que la translation prenne en compte la collision .


Comment gère tu ton truc. passes-tu uniquement par la gestion des collisions de Newton ou passes-tu par les fonctions physiques de Newton ?


Force et sagesse...

Hors ligne


#7 

13-10-2009 22:00:00

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Ben en fait, je fais comme ça (je vous mets mes portions de code) :
(le second est sans doute le plus important, c'est surement la qu'il y a l'erreur)

Bon, ça c'est comment j'initialise Newton

Code:

    
void ApplyForce(const NewtonBody *nbody)
{
    float mass, ixx, iyy, izz;
    NewtonBodyGetMassMatrix(nbody, &mass, &ixx, &iyy, &izz);
    float force[3] = {0, mass * -90.82, 0};
    NewtonBodyAddForce(nbody, force);
}
NewtonCollision* CreateCollisionFromTreeMesh(NewtonWorld *nWorld, irr::scene::IMesh *m_mesh)
{
    using namespace irr;
    using namespace core;
    using namespace gui;
    using namespace io;
    using namespace scene;
    using namespace video;

    NewtonCollision * collision = NULL;

    collision = NewtonCreateTreeCollision (nWorld, NULL);

    NewtonTreeCollisionBeginBuild (collision);
    int nMeshBuffer = 0; //Mesh Buffer count
    int v_index[3] = {0,0,0}; //vertex indices
    IMeshBuffer *mesh_buffer = NULL;
    float array[9]; //Array to store 3 vertices

     //Get m_mesh buffers and copy face by face to collision mesh
     for( nMeshBuffer=0 ; nMeshBuffer < (int)m_mesh->getMeshBufferCount() ; nMeshBuffer++ )
     {

         mesh_buffer = m_mesh->getMeshBuffer(nMeshBuffer);

         //Get pointer to vertices and indices
         S3DVertex *vertices = (S3DVertex*)mesh_buffer->getVertices();
         u16 *indices = mesh_buffer->getIndices();

         //Fill collision mesh
         for(int i=0; i<(int)mesh_buffer->getIndexCount(); i+=3)
         {
             v_index[0] = indices[i];
             v_index[1] = indices[i + 1];
             v_index[2] = indices[i + 2];

             // 1st position vertex
             array[0] = vertices[ v_index[0] ].Pos.X;
             array[1] = vertices[ v_index[0] ].Pos.Y;
             array[2] = vertices[ v_index[0] ].Pos.Z;

             // 2nd position vertex
             array[3] = vertices[ v_index[1] ].Pos.X;
             array[4] = vertices[ v_index[1] ].Pos.Y;
             array[5] = vertices[ v_index[1] ].Pos.Z;

             // 3rd position vertex
             array[6] = vertices[ v_index[2] ].Pos.X;
             array[7] = vertices[ v_index[2] ].Pos.Y;
             array[8] = vertices[ v_index[2] ].Pos.Z;

             //Add new face to collision mesh
             NewtonTreeCollisionAddFace(collision, //collision mesh to add face to
                    3, //number of vertices in array
                    (float*)array, //pointer to vertex array
                    3*sizeof(float),//size of each vertex
                    1); //ID of the face

         }
    }
    NewtonTreeCollisionEndBuild(collision, 0);

    return collision;
}

    [...]

    //moteur physique de la map
    bodyMap = NewtonCreateBody(world,CreateCollisionFromTreeMesh(world, room));
    matMap.setTranslation(irr::core::vector3df(0,0,0));
    NewtonBodySetMatrix(bodyMap,&matMap.M[0]);
    NewtonBodySetMassMatrix(bodyMap,0,2,2,2);
    NewtonBodySetForceAndTorqueCallback(bodyMap, ApplyForce);
    //moteur physique du perso
    bodyPerso = NewtonCreateBody(world,NewtonCreateBox(world,1,1,1,0));
    matPerso.setTranslation(positionPerso);
    NewtonBodySetMatrix(bodyPerso,&matPerso.M[0]);
    NewtonBodySetMassMatrix(bodyPerso,70,2,2,2);
    NewtonBodySetForceAndTorqueCallback(bodyPerso, ApplyForce);

ça c'est comment je fait la translation :

Code:

        m_Nperso->setTranslation(v);
        NewtonBodySetMatrix(m_bodyPerso, m_Nperso->pointer());
        NewtonBodySetMassMatrix(m_bodyPerso,70,2,2,2);
        NewtonBodySetForceAndTorqueCallback(m_bodyPerso, ApplyForce);

Hors ligne


#8 

14-10-2009 17:58:58

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Quand tu fais une translation tu n'as pas besoin de refaire un NewtonBodySetMassMatrix(m_bodyPerso,70,2,2,2); et un NewtonBodySetForceAndTorqueCallback(m_bodyPerso, ApplyForce); car la masse est retenue par newton et le callback est réactivé à chaque mouvement du body (remarque : le callback devient inactif lorsque le body à trouver sa position d'équilibre).


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#9 

14-10-2009 18:52:45

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Ok, mais si je les enlève, mon perso passe quand même a travers les murs lors d'une translation, il y a aussis toujours le problème de la gravité qui s'arrête quand mon perso touche le sol

EDIT : je viens de comprendre pourquoi mon perso s'arrête de tomber une fois qu'il a touché le sol, par ce que le calback s'arrête . Comment on fait pour empêcher ça ?

Dernière modification par Ilovechocolat (14-10-2009 21:16:51)

Hors ligne


#10 

15-10-2009 09:45:38

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Je me suis trompé, même en lui appliquant une collision, une force ou un moment pour que le callback réagissent, il ne réagit pas. Avec NewtonBodySetVelocity, NewtonBodyAddForce ou NewtonBodyAddTorque on devrait pouvoir le faire bouger. J'ai remarqué que lorsque le body est stable le callback ne peut plus être appelé. Ou alors je ne comprends pas pourquoi.

Dernière modification par johnplayer (15-10-2009 10:15:20)


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#11 

15-10-2009 10:24:04

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Utilise NewtonBodySetAutoFreeze(cubeseul->body, 0); pour controller toi-même l'arrêt du callback.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
29 invités en ligne
Aucun membre connecté
RSS Feed