Comment empêcher les roues de voiture raycast de glisser latéralement?

11

J'ai écrit un moteur de physique automobile non réaliste comme exercice d'apprentissage, en utilisant cet article comme référence.

J'ai une voiture qui entre correctement en collision avec un terrain et applique les forces de suspension correctes pour chaque roue. Mon prochain problème est d'empêcher le mouvement latéral des roues. Par exemple, si je laisse tomber ma voiture sur une pente, elle glissera latéralement sur la pente et ne cessera jamais de glisser latéralement (car il n'y a aucun frottement d'aucune sorte).

L'article lié dit qu'une "force latérale" doit être appliquée, combinée avec la force vers l'avant, mais il passe sous silence la façon dont cette force latérale est calculée.

Compte tenu des informations de collision pour chaque roue (intersection normale, etc.) et des informations sur la carrosserie rigide de la voiture, comment puis-je calculer la force latérale appropriée à appliquer à la carrosserie rigide pour éviter tout mouvement latéral?

Kazade
la source

Réponses:

10

Cette force latérale est la composante horizontale de la normale de la route par rapport au mouvement vers l'avant de la voiture. Les routes sont inclinées comme vous en discutez pour faciliter les virages à des vitesses plus élevées sans voler hors de la piste de l'élan les poussant vers le coin extérieur. La banque repousse dans une direction où les pneus ne tournent pas librement et peuvent, espérons-le, résister; si l'inclinaison était assez raide, le centre de gravité assez élevé ou la vitesse assez lente, la voiture elle-même agirait comme une roue et roulerait simplement.

Les pneus ont une gamme limitée de direction. Les forces agissant perpendiculairement à l'axe longitudinal (de l'avant vers l'arrière) sont résistées en partie parce que les pneus ne tourneront pas de cette façon. Vous pouvez calculer la force agissant latéralement contre la route à partir de la gravité et de la vitesse avant, puis calculer la force restante après que le pneu a éliminé une partie de ce frottement. Si la force restante est suffisamment grande pour vaincre la force qui pousse la voiture sur la route, la voiture glissera / dérapera.

Ce qui suit illustre cela et est discuté ici (avec et sans friction) :

   https://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Banked_turn.svg/375px-Banked_turn.svg.png

La force agissant horizontalement présente ici un intérêt particulier. Au repos (seule la force agissant sur elle est due à la gravité), la voiture ne va pas glisser sur une pente perpendiculaire à moins que le coefficient de frottement ne soit exceptionnellement bas ( par exemple une route glacée).

Andon M. Coleman
la source
7

La réponse d'Andon ne m'a pas vraiment donné de solution, mais elle m'a définitivement mis sur la bonne voie!

Une fois que j'ai commencé à penser que les roues se trouvaient sur leur propre plan (la normale étant le vecteur qui sort du centre - je vais appeler cela la "normale" de la roue), j'ai réalisé que la force latérale n'était que le vecteur requis pour «pousser» la vitesse de la voiture sur cet avion. Ce vecteur est simplement la "normale" de la roue multipliée par un scalaire qui est le produit scalaire entre la vitesse et la "normale".

Voici le code sur lequel je me suis installé qui fonctionne parfaitement:

            // Now calculate the side force. Get the linear velocity
            auto vel = car->body()->linear_velocity();
            auto side_force = car->wheel_right_axis(i, closest_normal);

            // Find the length of the vector necessary to nullify the horizontal movement
            auto dot = kmVec3Dot(&vel, &side_force);

            // Scale the right vector to that length
            kmVec3Scale(&side_force, &side_force, -dot);

Dans le code ci-dessus, "le plus proche_normal" est la normale du terrain avec lequel la roue est entrée en collision et qui est utilisée comme vecteur "haut" lors du calcul de la "normale" de la roue.

Kazade
la source
2
Ouais, je ne pensais pas vraiment que ça allait vous donner la réponse dont vous aviez besoin, mais c'était beaucoup trop long pour mettre un commentaire;)
Andon M. Coleman