Pacejka, ODE, et bruits de moteur

Pacejka et ODE

Après une semaine de boulot, je tiens enfin une implémentation de Pacejka que j’arrive à faire cohabiter avec ODE, le moteur physique utilisé dans Raydium. La dernière fois que j’avais posté ici à ce sujet, plusieurs questions persistaient :

– Plus on presse un pneu sur la route (charge verticale), plus il est efficace (jusqu’à son explosion, en clair). Alors pourquoi lors d’un virage très serré, ce sont toujours les pneus les plus « chargés » qui dérapent ?

– Les équations de Pacejka permettent de calculer la force maximum qu’un pneu est capable de générer/restituer en fonction d’une situation donnée. Comment gérer les écarts entre ce que la situation demande et ce que pneu permet à ce moment là ? De manière générale, comment faire interagir ODE et Pacejka ?

– Comment gérer les instabilités des équations magiques à très basse vitesse ?

J’ai maintenant des réponses claires et des solutions intéressantes à ces problématiques. Je ferais probablement très prochainement un article « très orienté code » pour expliquer tout cela, car je n’ai trouvé aucune documentation, aucun exemple d’intégration de Pacejka avec ODE sur le net.

Pour l’heure, voilà ce que ça donne en images :

Raydium Pacejka ODE debug

Chaque point représente un contact entre le pneu et la route. La voiture est en train de prendre un virage à gauche à grande vitesse, qui va se finir dans le mur puisque nous sommes très manifestement dans un cas de sous-virage sévère. Info importante : la voiture est une propulsion (ouais, des Fiesta à propulsion moteur central, y en a pas eu des tonnes 🙂

Voilà comment lire les informations de debug :

SR = Slip Ratio, en %. Il s’agit d’un rapport entre la vitesse de la route et la vitesse du pneu, dans le sens longitudinal (vers l’avant du pneu en question, donc). Quand le pneu ne dérape pas (à l’accélération ou au freinage, puisque nous sommes dans le sens longitudinal encore une fois), le rapport est à 0%, et à 100% si le pneu va deux fois plus vite que la route (sérieux dérapage) ou si la route va deux fois fois plus que le pneu (freinage de barbare).

SA = Slip Angle, en degrés. Angle entre le sens longitudinal du pneu et son « déplacement ». En pleine ligne droite, parfaitement stable, la valeur doit être de 0°. Dès que vous tournez un petit peu vos roues, vous mettez un petit peu de SA, votre pneu se tord et se cisaille, imperceptiblement, ce qui génère la force qui vous fait changer de direction.

Vous trouverez quelques explications supplémentaires dans le précédent article (voir lien plus haut) sur ces deux valeurs qui servent de paramètres d’entrée aux formules magiques de Pacejka, tout comme l’information suivante :

load = charge verticale du pneu. Pacejka demande une info en kN, elle est ici exprimée dans une unité propre au jeu (l’échelle n’est pas d’une unité = un mètre, pour le dire autrement).

Les infos suivantes sont les sorties des équations de Pacejka :

fx et fy correspondent aux forces, en Newton, que le pneu est capable de générer en fonction des paramètres au dessus. Assez logiquement, fx s’applique dans le sens longitudinal et fy dans le sens latéral du pneu.

mu1 et mu2 sont simplement des remises à l’échelle de fx et fy, utilisés pour alimenter les contacts ODE.

Du coup, il est possible de « lire » l’image, de l’interpréter. Si on commence par la charge, on imagine très facilement dans quelle situation est la voiture … les pneus extérieurs (droite, donc, dans ce virage) sont très chargés (à la différence des deux autres, on a donc une vision très claire de la violence du virage.

Du coté du Slip Ratio, tout semble aller bien : les pneus extérieurs ne glissent quasiment pas, l’avant gauche est à moins de 10% … mais le problème est à l’arrière gauche : 90%, ça ressemble à un burn. Et si l’on se souvient que la voiture est une propulsion, c’est probablement que le conducteur est en train d’accélérer. L’autre possibilité serait un freinage, mais seul le frein moteur agit sur les roues arrières de cette voiture, et il n’a pas la force d’engendrer 90% de SR. Un indice confirme cette théorie : si cette roue arrive à patiner alors que l’autre roue arrière semble OK (SR=2%), c’est parce qu’elle n’est que très peu chargée, avec 550 (pseudo) Newton … mais nettement plus que l’autre roue intérieure ! (78 pseudo N) La masse de la voiture semble donc être plutôt à l’arrière, signe d’une accélération.

Enfin, l’interprétation du Slip Angle révèle l’ampleur du problème pour le conducteur à ce moment là : tout va bien à l’arrière, mais à l’avant, on est pas loin des 30° ! C’est plus que l’angle de braquage des roues, ce qui signifie tout simplement que la voiture est en train de faire un tout droit.

Pour ma défense, la voiture est équipée de pneus 135/80/13 … ce sont ceux d’une Fiat Panda de 1982 🙂

J’ai donc passé des heures à tester toutes sortes de situations comme celle çi, pour implémenter et valider le modèle de Pacejka. C’est très instructif, et c’est assez génial de voir fonctionner ces formules. Il reste encore de nombreuses choses à faire autour de ce sujet pour ManiaCrash, en particulier du coté de l’équilibre de la voiture et de tout ce qui concerne la suspension. La barre anti-roulis, notamment, semble être le prochain passage obligé.

Reproduction du son moteur

Histoire de varier les plaisirs, je me suis penché depuis hier sur la problématique de la reproduction du bruit moteur. Pour ManiaCrash, je souhaite m’appliquer au niveau de l’audio, avec un son réaliste pour le moteur, en intérieur et en extérieur, des bruits de roulement, des crissements, du vent, etc. Dans une simulation auto, une grande partie du feeling se fait par la partie audio. Il m’est déjà arrivé dans certains très bon mods rFactor, de lâcher un petit « woaw » craintif en écrasant l’accélérateur d’une voiture à l’arrêt, tellement le son « rendait » bien. Même chose pour la sensation de vitesse : quand on va vite, ça doit trembler de partout et faire plein de bruit. C’est à mon avis l’un des gros échecs de la série Gran Turismo, par exemple, ou la partie audio est finalement très limitée.

Dans ManiaDrive, pour le moteur, j’utilisais un seul son, qui était pitché selon la vitesse de rotation du moteur. Évidement, le son devenait très vite complètement déformé, et je devais limiter le pitch à une plage assez restreinte, et pas du tout réaliste.

Du coup, j’expérimente avec l’utilisation de plusieurs sons pour un seul moteur. C’est la méthode utilisée par beaucoup de jeux et de simus, typiquement avec un son par tranche de 1000 tours par minute. Je cherche une méthode pour mixer le tout et obtenir un résultat aussi réaliste que possible. Pour chaque son, il me faut déterminer un gain et un pitch, et j’utilise à l’heure actuelle une solution qui me semble logique. Si on est à 1200 RPM, que j’ai un son pour 1000 RPM et un autre pour 2000 RPM, le premier est joué avec un gain de 0.8, le second 0.2, et des pitchs de 1.20 et 0.60, respectivement.
Eh bien ça marche pas du tout : http://ftp.cqfd-corp.org/mc_engine1.mp3
Voilà les graphs des valeurs utilisées pendant une accélération. Pour le gain :

… et pour le pitch :

Voilà ou j’en suis pour l’instant. Si vous avez une idée, n’hésitez pas 🙂


Publié

dans

par

Étiquettes :

Commentaires

15 réponses à “Pacejka, ODE, et bruits de moteur”

  1. Avatar de Wodash
    Wodash

    – Plus on presse un pneu sur la route (charge verticale), plus il est efficace (jusqu’à son explosion, en clair). Alors pourquoi lors d’un virage très serré, ce sont toujours les pneus les plus “chargés” qui dérapent ?

    J’expliquerai ça par le fait que les forces de frottement sont effectivement proportionnelles au poids (en fait la force normal appliquée sur la surface) maintenant ce qui se passe c’est que la force tangentielle elle varie en fonction de l’angle, ou plus simplement la force centripète n’est pas nécessairement parfaite pour faire tourner correctement la voiture, la force tangentielle dépasse donc la force de frottement et le pneu dérape. Du moins de manière basique et bête c’est comme ça que je le verrais.

    EDIT: et même plus encore une fois le patinage engagné et les roues tournées il est plus difficile de rattraper le tout vu que à ce moment la on rattrape le coefficient de frottement dynamique à la place du statique. Les roues tournent dans un sens non // au sens de déplacement général de la voiture (du moins les arrières), donc il est d’autant plus dur de récupérer en fait et tout se joue essentiellement sur les roues avant (je viens de comprendre ça =P)

  2. Avatar de Wodash
    Wodash

    Putain de WP qui plante!

    EDIT: Et en plus je lis comme une merde, oublie ce que j’ai noté…

  3. Avatar de neFAST
    neFAST

    idée au pif :
    Prendre le barycentre des spectres dans Fourrier ?

  4. Avatar de skaven
    skaven

    Tu voudrais pas que je t’exporte un circuit (dump dans un .CPP) pour tester une bagnole dessus? ca peut etre drole.
    Dis moi quand tu veux passer a la maison que j’achete du coca…

  5. Avatar de Xfennec
    Xfennec

    Wodash : Heu ok. Remarque, tu as raison dans les grandes lignes 🙂

    skaven : En CPP ? Y a quel genre de choses dans un tel fichier ? (de gros tableaux ? et les textures ?) Sinon, tu as pas ça dans un format plus … adapté, genre 3DS ? Mais l’idée serait sympa, ouais.

  6. Avatar de PositiveFunk
    PositiveFunk

    Ce que j’aime bien dans Rfactor c’est la reverberation dans la caisse. Comment il font??? Est-ce qu’il calcul vraiment le fait que la tete du conducteur soit a gauche???

  7. Avatar de protonux
    protonux

    pour le son, tu crois qu’il est possible d’envisager simuler un son type holophonique? ça pourrait etre d’un coté geant de realisme, et plus simple en gestion (plus la peine de simuler chaque effet…)

  8. Avatar de Xfennec
    Xfennec

    protonux : Tu as un lib opensource, un document, un truc qui donne une idée de comment implémenter ça ? Note que ça ne simplifie en rien la « simulation de chaque effet » : placer le son dans l’espace est loin d’être la partie compliquée (OpenAL le fait « tout seul », par exemple)..

  9. Avatar de protonux
    protonux

    niveau lib, je pense pas que ça existe, puisque les rares personnes qui s’y risquent ont directement le matos « en dur »…. c’est comme l’AR ou même le multitouch, y’a pas des masses de simus ou outils quand t’as pas le matos, puisque les rares qui testent ont le matos, en général…

    enfin, une idee serait peut être de faire une « tète » 3d nin visible et très précise collé a celle du conducteur, et mettre la sortie son G/D dessus, enfin, je sais même pas si c’est spécialement faisable…

    (tu met tous les sons dans l’espace, le « manequin » sur la position du joueur, et tu met une sorte de « micro » pour chaque sortie gauche droite dessus…)

    pour la simulation des effets, si openal gere aussi les models d’ode, ça gere pas le reverb, par exemple?

  10. Avatar de vimes
    vimes

    Faire du binaural changera pas le fait que tu devras trouver un bon mixage pour les bruits de ton moteur, par contre la spacialisation sera bien supérieure à du stéréo OpenAL.

    Si le binaural/holophonique t’intéresse encore après ça, FMod à un support basique pour les Head-Related Transfer Function qui modélisent le head shadow, l’intérieur de l’oreillle et plein d’autres trucs qui sont à la base du son holophonique et binaural. Mais bon, si tu utilises OpenAl, c’est un peu overkill.

    J’ai qu’une mini expérience en variations de son (variation de pitch d’un bruit d’ascenceur selon vitesse et facteur random), mais peut être le problème vient du fait que tes graphes ne convergent pas au moment des transitions: i.e. quand ta track pour 2000 tpm prend le pas sur celle du 1000pm tu devrais avoir le même pitch et, vu l’effet yoyo du mp3, c’est sans doute pas le cas.

  11. Avatar de protonux
    protonux

    FMOD n’est pas libre… donc deja il est out, mais simuler du binaural/holophonique pourrait etre interessant si le son est bien géré par openAL, j’ai pas encore veritablement fait mumuse avec, mais si openal gere bien les effets « naturels » du genre le reverb suivant la map, ça pourrait etre geant, sans devoir refaire chaque effet pour chaque objet…

    un des trucs aussi avec le systeme de pitch: on ne gere pas les vitesses, ou alors faut faire une usine a gaz pour faire le son typique du changement de vitesse… je sais pas trop comment les dernieres simus font ça, mais je pense pas qu’ils y vont au pitch 🙂

  12. Avatar de Latpin
    Latpin

    Dans l’histoire du dérapage, il me semble que la rigidité du châssis (ou plutôt sa souplesse) rentre en compte de manière relativement importante.
    Je suis pas complètement certain, mais il me semble que c’est une affaire de ce genre :

    Lorsque la voiture est en appui, les amortisseurs peuvent exercer des forces différentes à l’avant et à l’arrière sur le châssis, ce qui va légèrement le tordre (un peu comme un linge qu’on essore).
    Cette torsion va s’exercer différemment en fonction de l’équilibrage des masses dans la voiture, et en fonction du comportement du pilote, s’il accélère ou bien s’il freine.
    Si à ce moment l’une des roues atteint sa limite de friction et qu’elle dérape, même très légèrement, elle va libérer la torsion du châssis qui va reprendre sa forme naturelle de manière très violente, exerçant toute sorte de forces chaotiques sur les amortisseurs, chamboulant alors le relatif équilibre entre les quatre liaisons pneu-sol, ce qui provoque le dérapage.

    Je ne suis pas à 100% certain que ce soit parfaitement exact ni précis ni que ça apporte grand chose à ta question, mais ça explique en partie les variétés de comportement entre différentes voitures, et ça explique aussi l’importance de la rigidité du châssis dans les voitures sportives.

  13. Avatar de sigri44

    Salut fennec :!
    Stp contact moi a mon e-mail, c’est urgent ! =)
    ++ merci

    $igri_44

    (désolé, je n’ai trouver nul part ou te contacter !)

  14. Avatar de Djulio74
    Djulio74

    salut Xfennec!

    Moi c’est julien et tout comme toi je fait de la 3D et du temps réel pour « passer le temps »
    bon on se connais pas mais j’aurais quelque question si possible..
    je suis en train d’essayer de faire une simulation auto (sur base d’un prototype que j’ai fait en 3d) dans Unity3D si tu connais. il y a bien un système de prefab conçu pour les pneu mais c’est pas grandiose de réalisme.
    j’aimerais savoir comment tu a codé la magic formule dans ton cas.. si tu veux bien partager l’info…
    je peut recupérer directement dans le soft des infos comme forwardSlip (slip ratio), sidewaysSlip (slip angle), la charge sur le pneu, vitesse des roues, de la voiture…

    merci si tu peux m’aider, ou meme juste m’aiguiller ce serai sympa de ta part!

    a la revoyure!
    Julien

Laisser un commentaire