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 :
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
Salut
Pour la question 1 :
Moi prso je creer des variables du genre :
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 :
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 )
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)
Hors ligne
@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:
@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 ?
Hors ligne
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
Si tu fais une translation avec irrlicht il faut renvoyer la matrice modifiée de ton node à newton.
Hors ligne
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
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 ?
Hors ligne
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
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 :
m_Nperso->setTranslation(v); NewtonBodySetMatrix(m_bodyPerso, m_Nperso->pointer()); NewtonBodySetMassMatrix(m_bodyPerso,70,2,2,2); NewtonBodySetForceAndTorqueCallback(m_bodyPerso, ApplyForce);
Hors ligne
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).
Hors ligne
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
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)
Hors ligne
Utilise NewtonBodySetAutoFreeze(cubeseul->body, 0); pour controller toi-même l'arrêt du callback.
Hors ligne