2009-10-21 4 views
3

J'écris un moteur physique qui utilise l'intégration de Verlet, et je ne peux pas obtenir certaines contraintes pour bien fonctionner. Certains (comme une contrainte de liaison/soudure) sont extra "détrempés" et ne sont pas assez rigides, tandis que d'autres (comme une contrainte de zone) sont très gonflables et envoient des atomes voler. Le code pour ma mise à jour ODE dans mon simulateur de physique est comme ceci:Ordre de calcul et itérations pour les moteurs physiques

ProcessRemovedItems(); 
    ProcessAddedItems(); 
    _colliderManager.Update(timestepSize); 
    foreach (Atom atom in _atomList) 
    { 
     atom.Update(timestepSize); 
    } 
    for (int i = 0; i < _iterations; i++) 
    { 
     foreach (IConstraint constraint in _constraintList) 
     { 
      constraint.Update(); 
     } 
    } 

J'ai essayé toutes les combinaisons idfferent de commandes de mise à jour et aucune aide. J'ai une vague idée de quelque chose à propos de l'utilisation des itérations, mais je n'ai aucune idée de ce qui pourrait aider. Aucune suggestion?

+0

Eh bien, qu'est-ce que vous essayez de réaliser exactement? Impossible de relier votre code à la description de votre problème. Quels sont les résultats que vous attendez de vos codes? –

+0

J'essaie de faire en sorte que les contraintes se comportent comme je le veux. – RCIX

Répondre

3

Vous avez raison dans vos suppositions d'itérations. En exécutant plusieurs fois la partie intégrateur verlet dans une trame, plus la simulation est rigoureuse et meilleure). Ceci est dû à ce qui suit: disons que vous avez 5 atomes l'un à côté de l'autre, et lorsque le dernier atome est intégré, il est légèrement déplacé. malheureusement, il est déplacé vers l'atome à côté de lui. Il faut un cadre complet, avant que l'intégration soit à nouveau effectuée et ceci est corrigé (en raison des contraintes). Quoi qu'il en soit, les chances sont, les atomes sont à nouveau placés à l'intérieur des autres.

pour ainsi contrer cet effet, plus les itérations que vous faites (donc plus fois par image que vous appelez l'intégrateur), plus la simulation va fonctionner et se conformer à vos contraintes,

cependant, vous remarquerez Plus vous exécutez l'intégrateur par image, plus la puissance du processeur sera importante. Donc, il y a un sweet spot quelque part que vous devez trouver manuellement

+0

si j'appelle la méthode de mise à jour de chaque atome 5 fois avec 1/5ème le timestep chaque trame puis il se sentira beaucoup plus raide? – RCIX

+0

J'ai mis à jour mon code mais maintenant il n'a pas vraiment aidé et explose après quelques secondes. Aucune idée pourquoi ... – RCIX

+0

Partout il y a une méthode de mise à jour (contraintes, le gestionnaire de collision) J'ai ajouté le timestep comme un facteur dont je multiplie la force avant d'appliquer des forces aux atomes, et j'ai le problème ci-dessus. : confus: – RCIX

Questions connexes