Comment implémenter la friction dans un moteur physique basé sur la «physique avancée des caractères»


8

J'ai implémenté un moteur physique basé sur les concepts du texte classique Advanced Character Physics de Thomas Jakobsen. La friction n'est discutée que très brièvement dans l'article et Jakobsen lui-même note comment "d'autres modèles de friction meilleurs que ceux-ci pourraient et devraient être mis en œuvre".

En général, comment pourrait-on mettre en œuvre un modèle de friction crédible en plus des concepts de l'article mentionné? Et comment traduire le frottement trouvé en rotation sur un cercle?


Je ne veux pas que cette question concerne ma mise en œuvre spécifique mais comment combiner les idées de Jakobsens avec un grand système de friction plus généralement. Mais voici une démo en direct montrant l'état actuel de mon moteur qui ne gère en aucune façon les frottements: http://jsfiddle.net/Z7ECB/embedded/result/


Ci-dessous, une image montrant et un exemple sur la façon dont la détection de collision pourrait fonctionner dans un moteur basé sur le document. Dans l'intégration Verlet, la position actuelle et précédente est toujours stockée. Sur cette base, une nouvelle position est calculée. Dans chaque image, je calcule la distance entre les cercles et les lignes. Si cette distance est inférieure à un rayon de cercles, une collision s'est produite et le cercle est projeté perpendiculairement à la ligne incriminée en fonction de la taille du chevauchement (décalage sur l'image).

La vitesse est implicite en raison de l'intégration de Verlet, donc le changement de position change également la vitesse. Ce que je dois savoir, c'est déterminer en quelque sorte la quantité de frottement sur le cercle et le déplacer vers l'arrière parallèlement à la ligne afin de réduire sa vitesse. image montrant comment la collision se produit


Très bel article! Quelle est votre friction en ce moment?
Mikael Högström

Oui. C'est un super article. C'est très simple, mais j'ai pourtant un moteur complet adapté à mon objectif, basé sur celui-ci. Sauf friction;)
paldepind

Et belle vidéo aussi. Cela semble prometteur!
Mikael Högström

Réponses:


4

Vous devriez jeter un œil à l'article de Mathias Mueller et all sur la "dynamique basée sur la position". C'est fondamentalement la même chose que le papier de Jacobsons et il pourrait vous donner plus d'informations sur la friction.

http://www.matthiasmueller.info/publications/posBasedDyn.pdf

Ils affirment que le frottement amortit fondamentalement la vitesse des particules dans le plan de la collision d'une valeur scalaire.

Notez que cela ne vous donne aucun effet de frottement coulombien (la quantité de mouvement dans la collision n'affecte pas l'ampleur de la force de frottement), mais vous pourriez être en mesure de l'obtenir en considérant la vitesse des particules dans le plan de collision.


1
Et si, lors de l'application d'une impulsion à un corps par ailleurs stationnaire, vous vérifiez un certain seuil. Si le composant de l'impulsion sur la surface de contact est inférieur à ce seuil, vous pouvez le mettre à zéro pour atténuer les effets du frottement statique . Dès lors, le frottement dynamique est exactement comme vous l'avez décrit. +1
teodron

0

Dans un moteur à corps rigide "normal", vous modéliseriez le frottement sous forme d'impulsions perpendiculaires à la normale. Je suppose que dans ce contexte, cela signifierait au lieu d'impulsions définir la position de la particule affectée de manière appropriée. Avec les contraintes en place, cela devrait, si je comprends bien l'article, atteindre un état itératif où le frottement a également affecté la rotation. Je suppose que par «meilleur modèle», l'auteur entend une meilleure façon de déterminer la quantité de frottement qu'une projection linéaire d'interpénétration. C'est cependant une supposition de mon côté car je n'ai jamais moi-même implémenté la physique par cette approche.

ÉDITER:

Pour calculer la taille des forces de friction, vous avez la valeur de décalage dans votre image. Comme vous utilisez le verlet avec un pas de temps fixe, nous savons que ce décalage est en fait la vitesse que le contact avait dans la direction du contact normal (enfin pas exactement, et je pense que c'est ce que l'auteur veut dire en faisant une meilleure approximation du frottement ). Connaître la vitesse le long de la normale de contact est essentiel car nous pouvons l'utiliser pour déterminer l'impulsion. La meilleure façon est d'appliquer un frottement sous forme d'impulsions dans chaque image où il y a un contact. La taille du frottement dans les axes parallèles au plan de contact est déterminée par le coefficient de frottement (déterminé par les matériaux, par exemple 0,7 pour un frottement assez élevé). Le frottement maximum que vous pourriez avoir est le coefficient de frottement multiplié par le décalage. Notez que cette valeur peut être supérieure à la vitesse réelle le long d'un des axes. Dans ce cas, vous avez un frottement statique et la particule ne doit pas bouger du tout dans cet axe. Si la valeur est inférieure à celle-ci, la particule se déplacera un peu mais sera ralentie, c'est-à-dire le frottement dynamique.


Vous avez raison. La partie la plus délicate, pour moi du moins, est de déterminer comment "régler correctement la position de la particule affectée".
paldepind

Ahh ok, alors je vois où tu es. J'ai une idée de solution, je vais éditer la réponse
Mikael Högström

C'est exactement la technique décrite dans l'article;). Je pense que je vais essayer de l'implémenter et voir si c'est assez bon pour mon projet.
paldepind

Ahh je suppose que oui ... On dirait que la méthode est presque la même que pour un moteur à carrosserie rigide, il suffit de prendre en compte l'intégration du verlet et d'appliquer des impulsions lorsque la position change à la place.
Mikael Högström
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.