Comment calculer la rotation causée par la friction de rebond?

15

Dans le prolongement de ma question précédente : j'ai la balle qui rebondit de façon assez réaliste sur les surfaces qu'elle frappe. Maintenant, je voudrais faire tourner le frottement du coup .

Montrer cela est assez simple: je fais tourner la balle par sa vitesse angulaire à chaque tick et applique la même rotation lorsqu'elle est rendue.

Quand une balle frappe un mur, je sais que la vitesse de rotation est affectée par ...

  • la vitesse initiale de la balle en frappant la surface
  • les coefficients de frottement de la balle et de la surface (constantes physiques)
  • l' angle d'incidence (l'angle entre le vecteur de vitesse entrant de la balle et la normale à la surface).

L'angle d'incidence est approximé par le produit scalaire des vecteurs d'impact et de vitesse de sortie de la balle. (1 signifie spin élevé, -1 signifie pas de spin, et tout le reste relativement entre les deux)

En multipliant tous les éléments ci-dessus et en veillant à ce qu'ils soient ensuite transformés dans la plage de 0 à 1, et multipliés par la vitesse de rotation maximale, la balle semblait répondre à la vitesse de rotation comme prévu. Sauf pour une chose: il tournerait toujours dans le sens horaire (à cause des valeurs positives).


Est-ce une bonne méthode? Pouvez-vous penser à un moyen plus simple?

Si cette méthode semble correcte, que me manque-t-il? Comment savoir quand la balle doit tourner dans le sens antihoraire?

codemonkey
la source

Réponses:

2

Votre méthode est agréable, car elle est très simple. Une chose dont vous pourriez avoir besoin est la dépendance à l'égard du spin précédent sur la balle, dont vous ne tenez pas compte. La boule en rotation représente l'énergie de rotation, donc une simulation réaliste devrait probablement la conserver avec les autres énergies.

Cependant, si la balle ne tourne pas à l'impact, je ne peux pas imaginer une situation dans laquelle elle commence à tourner contre la direction de l'angle incident. C'est-à-dire que "dans le sens horaire" ou "dans le sens antihoraire" doit être relatif à n'importe quel côté de la normale de l'angle d'incidence.

Je pense que multiplier simplement le résultat par le vecteur original de direction x (+1 si vous voyagez de gauche à droite, -1 si vous voyagez de droite à gauche) devrait le faire.

Modifier: vous pouvez utiliser le produit croisé pour cela. Incident cross normalfournit un vecteur dans la direction Z uniquement (si nous sommes sur le plan 2D xy). Regardez l'élément z: s'il est positif, l'approche de la balle devrait la faire tourner dans le sens des aiguilles d'une montre. S'il est négatif, la balle doit tourner dans le sens antihoraire.

eli
la source
Hey eli Premièrement, je prends en considération le spin original de la balle, j'ai juste oublié de le mentionner dans mon post Deuxièmement, je ne pense pas que le système de direction x fonctionnerait. J'ai essayé cela, mais si la balle frappe la surface par le bas en allant vers la gauche, le vecteur x serait -1, cela signifierait une rotation dans le sens antihoraire, alors qu'en réalité, il devrait tourner dans le sens horaire
codemonkey
Comment tenez-vous compte de la rotation originale de la balle? S'il tourne très rapidement, il pourrait se lancer dans une direction totalement différente. Le problème avec le produit scalaire dans votre cas est qu'il utilise le cosinus (une fonction paire). Vous avez besoin d'autre chose pour définir le signe de la relation entre vos vecteurs (incident et normal). Vous pouvez utiliser un produit croisé (produit vectoriel) à cet effet. J'ai modifié ma réponse pour inclure une méthode multi-produits.
eli
relire la réponse après la modification je l'aime bien. Je l'ai essayé et cela a très bien fonctionné. En ce qui concerne le spin original, je ne parlais que de rendre le changement de rotation progressif ... quant au spin original affectant le vecteur de sortie, eh bien, c'est ma prochaine étape :)
codemonkey
Aïe, le montage était l'une des 3 solutions différentes que j'ai suggérées, et j'ai expliqué pourquoi vous deviez le faire (le point ne donne que l'amplitude, pas la direction de l'angle). Hélas, je devrais être plus concis.
Kaj
désolé pour ce kaj, il m'a glissé ... aucune infraction prévue :)
codemonkey
3

Obtenez d'abord la surface tangente à la surface normale: t = (ny, -nx)

Ensuite, vous pouvez obtenir la composante de vitesse le long de la surface sous la forme vt = v dot t .

Vous pouvez maintenant calculer la rotation de la balle: w = | ( normal * r) traverser vt |, où r est le rayon de la balle.

Ici, je suppose que la balle n'a pas d'inertie en rotation et commence à tourner instantanément à la vitesse qu'elle aurait si elle roulait le long de la surface. Vous pouvez utiliser un coefficient de frottement pour le rendre plus réaliste et, si vous le souhaitez, prendre en compte l'inertie en rotation de la balle.

Danik
la source
Merci pour la réponse Danik. Je prends déjà en compte l'inertie rotationnelle de la balle (en l'ajoutant à la nouvelle rotation) ainsi que le frottement de la surface comme coefficient à multiplier par la vitesse de rotation totale. Plus le frottement est élevé, plus la vitesse de rotation est élevée, non?
codemonkey
2

Ok, cela peut sembler stupide, mais vous n'utilisez pas le produit scalaire du vecteur de la balle et la surface normale et vous faites juste un arccos pour calculer l'angle, n'est-ce pas? Parce que l'angle serait positif, qu'il soit positif (jusqu'à 90 degrés) ou négatif (idem) car le cosinus est symétrique autour de 0.
Si tel est le cas, au lieu d'utiliser la normale du plan, utilisez la direction du plan elle-même et soustrayez 90 degrés de l'angle, de sorte que 0 à 180 deviendrait de -90 à +90 degrés (ou de moitié PI à + moitié PI si vous êtes radialement incliné).

Kaj
la source
Eh bien, considérons ce cas: x + ve a raison, y + ive est en baisse; Vecteur de surface S = (1,0); nous avons deux vecteurs de vitesse d'impact V1 = (3,4) frappant d'en haut, devrait faire tourner la balle dans le sens horaire et V2 = (3, -4) frappant d'en bas, devrait faire tourner la balle dans le sens antihoraire. Maintenant, les normales pour les deux vecteurs seraient respectivement (3 / 5,4 / 5) et (3/5, -4 / 5). Le produit scalaire pour les deux vecteurs serait désormais 3/5. l'angle généré serait arccos (3/5) = 53 degrés pour les DEUX vecteurs. C'est vrai, mais sur des côtés opposés! donc si j'utilise cette méthode, je finirai toujours par provoquer la rotation dans le sens horaire. Tu vois mon dilema?
codemonkey
3 solutions possibles. 1) N'utilisez pas la normale mais la direction du côté et soustrayez 90 degrés comme mentionné ci-dessus. 2) Simulez la même chose en échangeant x et y de la normale et en inversant (multipliez par -1). 3) Multipliez l'angle par le signe du produit croisé des deux vecteurs car le produit croisé représente le péché de l'angle qui n'est pas symétrique autour de 0 degrés.
Kaj
Le produit scalaire ne vous donne pas l'angle, seulement l'amplitude de l'angle, vous avez également besoin de la direction de l'angle. Les 3 façons ci-dessus simulent en utilisant le sinus vous donnant le côté. Vous pouvez également utiliser un trig de base pour obtenir l'angle. Sin (alpha) = longueur côté opposé / longueur côté incliné (basé sur un triangle avec un angle de 90 degrés entre le côté opposé et le côté incliné). Cela et pythagore pour calculer les longueurs des côtés feront l'affaire.
Kaj
Au fait, relisez ma réponse originale, car elle résout le dilemme en prenant l'angle avec l'avion au lieu de la normale et en soustrayant 90 degrés.
Kaj
0

La première chose à laquelle vous devez répondre est de savoir si la vitesse de rotation ou la rotation avant de toucher le mur; disons Si; est supérieur, égal ou inférieur à la valeur nécessaire pour maintenir le même spin après avoir frappé, par exemple Ss. Avec cela, vous pouvez obtenir le réel après avoir frappé le spin, disons Se, en utilisant une valeur de frottement entre la balle et la surface

Obtenez la composante de vitesse à travers la surface de rebond Vxi = Vi dot Vx, étant Vx un vecteur parallèle à la surface de magnitude 1.

La valeur que vous recherchez est Ss = Vxi / r, c'est pour transformer Vxi en vitesse angulaire. Si Si est inférieur à Ss, la balle devrait gagner positivement en spin. Si Si est égal à Ss, la balle devrait conserver approximativement la même rotation, à ce sujet plus tard. Si Si est supérieur à Ss, la balle devrait perdre sa rotation

les pertes et le gain de vitesse dépendent de la valeur de frottement Fr. En fait, c'est un croisement entre le rayon et la force de friction, mais vous pouvez définir cette valeur comme vous le souhaitez.

Vous devez également remarquer qu'en plus du rebond, la balle perd de l'énergie en raison d'un frottement entre la balle et la surface, donc Vxi est affecté négativement. Je dirais que le rebond coef affecte Vy et le frottement affecte Vx.

Vous devez prendre en compte la déformation de la balle. Cela affectera le temps ou les cadres où la balle est collée au mur, ainsi la force de friction exercera pendant une plus longue période affectant la vitesse de rotation et de sortie. Cette déformation dépend de la façon dont vous souhaitez que votre modèle soit.

Aprah
la source