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][irrlicht]déplacer un cube sensible à la collision


Sujet :

Newton

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut [Newton][irrlicht]déplacer un cube sensible à la collision
    bonjour à tous
    j'ai créé un projet newton-irrlicht dans lequel des cubes tombent du ciel et percutent un sol. Pour essayer de l'améliorer, j'ai voulu faire que l'on puisse déplacer un cube. J'ai hérité la classe qui gère les évènements sous irrlicht et j'ai implémenté la méthode qui capte les évènements. Dans cette méthode j'ai codé que lorsqu'un bouton est appuyé, la position du cube est récupérée, et selon l'axe x incrémenté de un.

    Seulement, lorsque je lance mon programme, il y a 2 cas :
    Le cube qui peut bouger est en train de tomber et lorsque j'appuie sur la touche il se déplace un instant de son axe de chute, puis la frame il y revient.

    le cube est sur le sol, et lorsque j'appuie, il se déplace parfaitement mais ne percute plus aucun objet.

    Je pense avoir compris pourquoi : c'est parce que la matrice du corps n'est pas modifiée lors de l'appui sur la touche, et donc ça foire, alors comment faire pour pouvoir parvenir à mes fins (je ne vous demande pas de code, juste une structure en français pour y parvenir, et éventuellement quelles fonctions j'ai besoin)

    J'ai beau lire et relire la doc, je m'arrache les cheveux
    J'ai essayé de stopper le freeze automatique pour supprimer le 2è cas, car une fois l'objet stable il est bloqué dans sa position, mais c'est du bricolage et ça ne sert à rien (je débute avec newton)

    Merci pour vos futures réponses

  2. #2
    Membre régulier Avatar de tmyke
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Points : 118
    Points
    118
    Par défaut
    Perso, j'ai un petit peu de mal à te suivre, du moins de façon précise. Pour clarifier les choses, ne pourrais-tu pas
    poster un bout de code, cela illuminerais à coups sûr ma réflexion

    __________________________
    Admin de http://www.irrlicht.fr

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    voici mon implémentation de la méthode OnEvent :
    m_cube est le cube que je veux déplacer
    m_quitter est la variable qui me permet en fonction de son état de quitter le programme

    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
    bool CEventReceiver::OnEvent(const irr::SEvent &event)
    {
       if(event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_KEY_E)
      {
        m_quitter = true;
        return true;
      }
      else if(event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_KEY_Z)
      {
          irr::core::vector3df v;
          v=m_cube->getPosition();
          v.X+=1;
          m_cube->setPosition(v);
     
     
        return true;
      }
     
    return false;
     
    }
    dis moi si tu as besoin d'autre code mon projet est constitué de la classe Cube.cpp (et son header associé) et bien sur CEventReceiver qui contient cette méthode, et enfin du main

  4. #4
    Membre régulier Avatar de tmyke
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Points : 118
    Points
    118
    Par défaut
    En fait je comprend mieux. Effectivement, tu modifie la position de ton cube, alors qu'en même
    temps la matrice de ton cube est certainement mise à jour par la physique qui tourne elle aussi, d'ou
    le conflit entre le moteur graphique et le moteur physique. Il faut dans ce cas voir pour
    employer un system commun, pour pouvoir déplacer tes objets sans rencontrer ce genre de conflit.
    Si j'ai le temps, je verais pour un petit code demain



    __________________________
    Admin de http://www.irrlicht.fr

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    ok merci! je pensais justement faire ce système : si il n'y a pas d'évènement d'appui de touche, alors applique la gravité, sinon applique le déplacement puis la gravité.

    Autre option : appliquer une force pour engendrer un déplacement horizontal mais ça risque de ne pas être trés efficace niveau performances pour un fps ça, non?

  6. #6
    Membre régulier Avatar de tmyke
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Points : 118
    Points
    118
    Par défaut
    A au fait, dernière question, tu utilises irrNewt ou tu passe directement par les fonctions natives
    de Newton ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    non j'utilise directement les fonctions natives

  8. #8
    Membre régulier Avatar de tmyke
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Points : 118
    Points
    118
    Par défaut
    Pour commencer, si tu modife la position de ton cube, as-tu essayé de répercuter la nouvelle aussi pour le
    moteur physique position par un NewtonBodySetMatrix() ?

    __________________________
    Admin de http://www.irrlicht.fr

  9. #9
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Ben j'ai fait ça, mais ça ne change rien je ne sais pas trop ce qui va pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    else if(event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_KEY_Z)
      {
          irr::core::vector3df v;
          v=m_cube->getPosition();
          v.X+=1;
          m_cube->setPosition(v);
          irr::core::matrix4 matrice;
          matrice.setTranslation(v);
          NewtonBodySetMatrix(m_body, &matrice[0]);
     
     
     
        return true;
      }

  10. #10
    Membre régulier Avatar de tmyke
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Points : 118
    Points
    118
    Par défaut
    Bon, voici une methode qui fonctionne chez moi sans soucis, je te le file en speudo code:

    - NewtonWorldFreezeBody( tonWorld, cubeBody)
    - éventuellement mais normalement non indispensable, récupération de la matrice Newton du body, via un
    NewtonBodyGetMatrix. pour la ré-injecter sur le mesh (graphique=physique).

    La en suite tu peux employer les fonctions Irrlicht de modifications d'attitude de ton mesh (Cube).

    Une fois termené ton mouvement, tu fais l'inverse:
    - NewtonBodySetMatrix sur le body avec la matrice de transfo de ton Cube.
    - NewtonWorldUnfreezeBody(tonWorld, cubeBody).

    et ton cube rentre de nouveau dans la simulation physique via Newton.

    __________________________
    Admin de http://www.irrlicht.fr

  11. #11
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    j'ai un autre problème. Je doit récupérer dans la classe CEventreceiver qui gère les évents le body de marcel, qui est un objet de type Cube. J'ai donc crée une méthode recupBody(NewtonBody *body) dans ma classe cube, mais lorsque j'essaye de récupérer le pointeur du body ça me dit :
    "request for member `recupBody' in `marcel', which is of non-class type `Cube*'"

    dans CEventReceiver.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    marcel.recupBody(corps);
    dans Cube.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Cube::recupBody(NewtonBody *body)
    {
     body = m_body;
    }
    corps est un Newton body crée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NewtonBody *corps;
        NewtonCollision *col;
        col = NewtonCreateBox(world, 1, 1, 1, 0);
        corps = NewtonCreateBody(world,col);
    saurais tu quel est mon problème? Merci de ton aide trés précieuse

  12. #12
    Membre régulier Avatar de tmyke
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Points : 118
    Points
    118
    Par défaut
    Personnelement, j'aurais plutôt écris un truc du genre:

    Cube.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NewtonBody* Cube::recupBody()
    {
      return this->m_body;
    }
    puis par la suite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewtonBody *body = cube->recupBody();
    voir carrement (même si les puristes aiment moins), sauf si 'm_body' est private bien sûr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewtonBody *body = cube->m_body;
    Il n'y a pas de raison que cela ne fonctionne pas, après c'est plutôt des histoires de header
    ou de linkage

    __________________________
    Admin de http://www.irrlicht.fr

  13. #13
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    ok ça compile ! par contre (euh je deviens relou la...) comment fait on pour déclarer une matrice irrlicht et une matrice newton? j'ai lu la doc mais je ne crois pas avoir bien compris il y en a des dizaines différentes.
    Pour irrlicht est ce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    irr::core::vector3df v;
    pour newton je ne sais pas...

    Pour le déplacement on m'a proposé une autre méthode en ajoutant des forces. Je pense que ça irait encore mieux, car avec le système que tu m'as donné si j'active la continuité dans l'appui des touches et que j'avance en continu, le cube ne tombera dans le vide que si la touche n'est pas appuyée, mais je verrais ça plus tard...

  14. #14
    Membre régulier Avatar de tmyke
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par overdrivr Voir le message
    ok ça compile ! par contre (euh je deviens relou la...) comment fait on pour déclarer une matrice irrlicht et une matrice newton? j'ai lu la doc mais je ne crois pas avoir bien compris il y en a des dizaines différentes.
    Pour irrlicht est ce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    irr::core::vector3df v;
    pour newton je ne sais pas...
    pour Irrlicht, c'est plutôt core::matrix4. Pour Newton, à ma connaissance il n'y a pas de type
    matrice déclarée, il s'agit tout simplement d'un tableau float[16].

    Citation Envoyé par overdrivr Voir le message
    Pour le déplacement on m'a proposé une autre méthode en ajoutant des forces. Je pense que ça irait encore mieux, car avec le système que tu m'as donné si j'active la continuité dans l'appui des touches et que j'avance en continu, le cube ne tombera dans le vide que si la touche n'est pas appuyée, mais je verrais ça plus tard...
    C'est aussi une solution tout à fait valable en effet, mais je dirais que les deux solution n'ont
    pas vraiment le même objectif ni le même effet sur les mesh des scene


    __________________________
    Admin de http://www.irrlicht.fr

  15. #15
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Voila mon 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
    else if(event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_KEY_Z)
      {
     
          dFloat mat[16];
          NewtonWorldFreezeBody(m_world, m_body);
          NewtonBodyGetMatrix(m_body,mat);
          irr::core::vector3df v;
          v=m_cube->getPosition();
          v.X+= 1;
          m_cube->setPosition(v);
          mat[12]+=1;
          NewtonBodySetMatrix(m_body, mat);
          NewtonWorldUnfreezeBody (m_world, m_body);
     
     
        return true;
      }
    Toujours le même bug...
    Je pense que c'est la fonction NewtonWorldFreezeBody qui n'est pas éxecutée, alors pour tester j'ai rajouté cette instruction dans la détection d'évènements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else if(event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_KEY_S)
      {
      NewtonWorldFreezeBody(m_world, m_body);
      return true;
      }
    Et lorsque j'appuie sur la touche S il ne se passe rien, le mesh continue de tomber, alors que logiquement il devrait s'arrêter, non?

  16. #16
    Membre régulier Avatar de tmyke
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par overdrivr Voir le message
    Et lorsque j'appuie sur la touche S il ne se passe rien, le mesh continue de tomber, alors que logiquement il devrait s'arrêter, non?
    Oui, en effet, il devrait s'arreter... Le pointeur de Body est-il valable, ainsi que celui de ton World?

    __________________________
    Admin de http://www.irrlicht.fr

  17. #17
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    C'est bon en fait pour une raison inconnue, le programme ne se recompilait pas, maintenant que c'est corrigé, plus de problème
    Par contre le mouvement et la collision n'est pas encore comme je le voudrais, mais je re-posterais si je ne trouve vraiment pas...
    Merci à toi

  18. #18
    Membre régulier Avatar de tmyke
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Points : 118
    Points
    118
    Par défaut
    Pas de soucis, bonne continuation. Passe faire un tour sur Irrlicht.fr, histoire de nous tenir au
    courant, et sache qu'il y a une version de IrrNewt ré-actualisé pour la dernière version d'Irrlicht (1.4.2)




    __________________________
    Admin de http://www.irrlicht.fr

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

Discussions similaires

  1. [Irrlicht + Newton] Collision entres modeles 3D
    Par Masadow dans le forum Newton
    Réponses: 2
    Dernier message: 16/04/2009, 11h00
  2. [Newton + Irrlicht]Où trouver des tutos?
    Par [ANBU]Ralph dans le forum Newton
    Réponses: 5
    Dernier message: 21/08/2008, 23h58
  3. [Irrlicht] Difficulté collision et apesanteur
    Par babar63 dans le forum Irrlicht
    Réponses: 1
    Dernier message: 08/02/2007, 17h28
  4. Détection de collision entre un cube et un carré
    Par Mat 74 dans le forum Physique
    Réponses: 15
    Dernier message: 17/03/2006, 15h01
  5. [Irrlicht] Caméra / collisions
    Par alex6891 dans le forum Irrlicht
    Réponses: 2
    Dernier message: 24/02/2006, 14h14

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