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] Velocite VS Force


Sujet :

Newton

  1. #1
    Futur Membre du Club
    Inscrit en
    septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 12
    Points : 9
    Points
    9
    Par défaut [Newton] Velocite VS Force
    Bonjour,

    Voila, j'ai un petit problème avec Newton.

    Voici un petit résumé de l'architecture que j'utilise pour déplacer mes objets :
    J'ai une classe mère Objets qui comprend la méthode ApplyForceAndTorqueCallback().
    Tous mes objets (y compris mon personnage et ma caméra) héritent de cette classe parceque je souhaite qu'ils soient Collidable (solides). Ils sont donc soumis aux memes forces (pratique pour la gravité).

    Maintenant, je souhaite déplacer mon personnage à l'aide de la souris et de touches du clavier. J'utilise la vélocité de Newton : NewtonBodySetVelocity(m_pBody, &mouvement.x);

    Tout marche correctement, hormis ceci :
    quand la vélocité est élevée, mes objets mouvants traversent des objets normalement Collidable. (notament la caméra puisque liée aux mouvements de la souris, donc vélocité élevée).

    Pour palier à ce problème, j'ai lu sur plusieurs forums qu'il valait mieux utiliser les forces que la vélocité pour déplacer des objets. Le problème est le suivant :
    NewtonBodyAddForce() ne marche que dans la fonction ApplyForceAndTorqueCallback(), qui est propre à Newton.

    Est-ce vraiment nécessaire de passer par les forces ?
    Si oui, comment récupérer alors une variable de mon personnage dans une fonction de classe mère avec le bon nBody ?

    Merci d'avance..

  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 : 38
    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
    ton problème ne viens pas des force mais du fait que les détection de collision se font de façon discrète. donc un objet avec une grande vélocité peut, à un moment T être avant l'objet à collisionner, et à T+1 être derrière cet objet. le moteur ne va donc pas détecter de collision. Pour résoudre ce problème, il faut utiliser un moteur physique qui supporte les détection de collisions continues
    * 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
    Futur Membre du Club
    Inscrit en
    septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    D'ohh !
    J'avoue que j'aime bien Newton et que j'aimerais bien continuer avec...
    Si je devais changer qu'est-ce que tu me conseillerais ?

  4. #4
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 38
    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
    reduit le pas d'evolution de la simulation...
    * 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

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    mars 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : mars 2005
    Messages : 249
    Points : 349
    Points
    349
    Par défaut
    Réduire le pas de temps serait en effet une solution à condition que cela ne ralentisse pas trop le jeu.

    Je connais rien à Newton, mais sais tu comment fonctionne le moteur de collision, quelle forme géométrique (GeometryBound) utilise-t-il pour délimiter les contours des colliders? Certains moteurs permettent de générer une sphère ou un cylindre autour de l'objet pour faire une approximation des contours (utiliser la forme exacte de l'objet se révélant souvent trop couteux en performances).

    J'ai pas de solution toute trouvée, mais une piste de recherche : si tu peux définir toi-même la forme utilisée pour la détection des collisions, tu pourrais essayer de créer une forme à partir des vertices de ton objet à l'instant T-1 et à l'instant T, pour "dé-discrétiser" (ça se dit?) le mouvement.

  6. #6
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 386
    Points : 2 628
    Points
    2 628
    Par défaut
    Utilise le mode continuous. Si tu n'utilises pas les matériaux de Newton, actives juste ce mode pour les objets qui vont trop vite : NewtonBodySetContinuousCollisionMode (leCorps, 1), et 0 pour le désactiver.

    En gros Newton extrapole les points de contact afin de déterminer si le corps qui a une trop grande vitesse rentre en collision avec un objet.

    Ca va entraîner une baisse du framerate si tu utilises trop d'objets avec ce mode, mais ça te permettra d'éviter pas mal ce problème (évidemment si les objets vont trop vite, ça ne changera rien, et n'importe quel autre moteur temps-réel réagira de la même façon je pense).

    Si tu utilises les matériaux, il faut que tu définisses ce mode entre deux types de matériaux :

    void NewtonMaterialSetContinuousCollisionMode(
    const NewtonWorld* world,
    int id0,
    int id1,
    int state)

    ou id0 est le groupe de matériaux n°1 et id1 le groupe de matériaux n°2. Pour state, pareil : 1 tu actives le mode, 0 tu désactives.

    Bon courage

  7. #7
    Futur Membre du Club
    Inscrit en
    septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci à tous pour ces conseils.
    Bakura, j'ai suivi ton conseil et j'ai placé ma carte et ma caméra en mode collision continue. Cela a effectivement amélioré la collision entre les objets concernés. Par contre, le fait d'avoir placé la paire de matériaux en mode collision continue n'a pas changé grand chose...

    Cependant, ma caméra peut toujours passer à travers ma carte en forçant un peu avec la souris. Je me pose ces questions :
    - Est-ce que cela peut venir du fait que j'utilise un arbre de collision pour ma carte ?
    - Lorsque j'augmente la taille de ma caméra, elle passe plus difficilement à travers le sol (mais je perds en réalisme). Pour le moment, j'utilise une sphère, mais est-ce que la collision serait plus effective avec une boite ?
    - Avec la gestion des matériaux newton, il est possible de récupérer une collisison et d'y associer une action dans le contact process. Est-ce que je purrais utiliser ca pour, par exemple, annuler la vélocité de la caméra lorsqu'elle touche le sol ?

  8. #8
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 386
    Points : 2 628
    Points
    2 628
    Par défaut
    Par contre, le fait d'avoir placé la paire de matériaux en mode collision continue n'a pas changé grand chose...
    Ah... Normalement ça doit activer le mode continue pour les objets possédant tel type de matériel et rentrant en collision avec l'autre matériel.

    - Est-ce que cela peut venir du fait que j'utilise un arbre de collision pour ma carte ?
    Non.

    - Avec la gestion des matériaux newton, il est possible de récupérer une collisison et d'y associer une action dans le contact process. Est-ce que je purrais utiliser ca pour, par exemple, annuler la vélocité de la caméra lorsqu'elle touche le sol ?
    J'ai pas trop essayé mais en effet c'est sûrement du côté des matériaux qu'il faut gérer ça.

  9. #9
    Futur Membre du Club
    Inscrit en
    septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    En fait, il est normal que le mode continuous des materiaux n'ait pas changé grand chose : il est en mode activé par défaut :

    void NewtonMaterialSetContinuousCollisionMode(
    const NewtonWorld* newtonWorld,
    int id0,
    int id1,
    int state)

    int state - state for this material: 1 = continue collision on; 0 = continue collision off, default mode is on

    Je continue les tests.

  10. #10
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2004
    Messages : 499
    Points : 425
    Points
    425
    Par défaut
    non il faut lire ce qu'il y a après

    oui c'est par défaut pour les matériaux mais:


    Remarks
    for continue collision to be active the continue collision mode must on the material pair of the colliding bodies as well as on at least one of the two colliding bodies.

    Remarks

Discussions similaires

  1. [Newton] Camera controlé par les forces
    Par drcd dans le forum Newton
    Réponses: 7
    Dernier message: 13/04/2008, 22h21
  2. Arrêt forcé dans une boucle
    Par cquadjul dans le forum C++Builder
    Réponses: 20
    Dernier message: 21/07/2005, 09h15
  3. [JFileChooser]Sauver un fichier avec extension forcée
    Par FLCEOAP dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 03/03/2005, 01h11
  4. Gérer un volant a retour de force ...
    Par olive-sjs dans le forum OpenGL
    Réponses: 2
    Dernier message: 26/02/2004, 08h10

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