[WIP] Simu Course réaliste + Map + Volant
Publié : 30 Août 2018 12:33
Salut a tous. Cela faisait une éternité que je n'avais pas posté ici. ^^
Je me suis un peu remis sur Unity ces derniers temps, et pour changer je suis resté sur une idée fixe de base : la simulation auto. lol. Pour ceux qui se souviennent, javais déjà fait un post ou deux sur le sujet.
Mais je suis totalement reparti de zéro, avec pas mal d'ajout, mais pas que :
Info importante , je suis sous unity 4.0, et charpentier donc unity par loisir en autodidacte
1 - utilisation de la magic formule ( pacejka 2002) pour l'adhérence des pneu( +130 paramètres).
2 - Collider + raycast pour le contact au sol ( configurable)
3 - train roulant simulé complet ( triangles, amortisseurs, fusées... chaque axe, chaque pivot)
4 - gestion traction( couple, inertie, frein moteur, 4x2 , 4x4 , différentiel avant-arrière-central, antipatinage, ABS)
5 - shader carrosserie perso, avec un fake realtime global illumination.
6 - procédural circuit.
7 - fabrication Vollant FFB : retour de force
8- Et plus a venir... (procedural map entre autre)
1 - Les Pneu avec Pacejka :
Pour ceux qui ne connaissent pas, les formules pour simuler l'adhérence des pneu sont des formules empirique : avec de machines et nombres de capteurs, les ingénieurs ont relevé les mesures des forces appliqué à un pneu dans toute les situations possibles, et ont cherché les équations permettant d’approcher au mieux les valeurs relevées. Les plus connue etant la "magic formula" de Hans Pacejka. Exempe
C'est cette formule que j'utilise dans ce projet. J'ai crée des fichier texte pour différent type de pneu avec tout les paramètres. Un script ( sur chaque roue) extrait les données (dun fichier) et fait les calculs en fonction de la charge sur le pneu, l'inclinaison de la roue par rapport au sol, angle de dérive du pneu( dérapage latéral) et le slip ratio ( patinage de la roue). le fixed TimeStep est a 0.001 (oui, les calculs sont fait 1000x par seconde , ^^)
J'ai fait un petit projet unity pour visualiser les courbes et l'influence de chaque changement dans les parametres.Je peux ainsi modifier le fichier texte directement avec celui ci :
2 - Contact au sol :
il y a quelques années, j'avais testé les wheelcollider, vraiment déçu car rien de réaliste a mon gout, ou pas trouvé la bonne façon de faire.. ils ne tenaient pas compte du poids de la voiture, les courbes de friction latéral et longitudinal etaient indépendante et non combinée, pas de retour de force...
Ensuite j'avais testé les raycast. un par roue, du centre de celle ci, vers le bas. C’était pas trop mal, ça me permettait les relevé qu'il me fallait ( distance du sol, détection contact...) pour la magic formula. C’était suffisant oui, mais sur une route assez plate. Mais dès qu'il y avait un obstacle "saillant" ça coinçait. Par exemple, monter un trottoir, détectant un seul point de contact, l'angle du trottoir "pénétrait" la roue avant que celle ci ne monte dessus.
J'ai Donc crée un système un peu plus complexe pour palier ce problème.
Une roue comporte plusieurs box collider ( trigger ) de la largeur du pneu, et définissant le contour de celui ci. chacun avec un OnTriggerStay renvoyant l'info de contact ou non au script de la roue. et au lieu de faire un seul Raycast, il y en a plusieurs couvrant la portion du pneu en contact avec un obstacle. Chacun renvoyant ses infos ( distance sol, angle..etc), je fais la moyenne et calcul la magic formula. Je peux donc gérer plusieur contact en simultané ( par exemple la route en bas de la roue ET l'angle du trottoir que je touche)
Voila a quoi ça ressemble : (la "résolution" de la détection et paramétrable, ici 20 collider, résolution de 4 sur la largeur )
3 - Train Roulant
Bon Ok, tout ça c'est bien, Mais bon, les roues fixes a la voiture, le seul amortissement serait alors celui des pneu ( oui, l’élasticité des pneu est simulée), donc a moins de monter des pneu de monster-truc, c'est un peu tape cul a conduire et pas très stable.. ^^.
Avant, mon unique raycast vertical me permettait de simuler en même les couple ressort/amortisseur, avec un déplacement des roues uniquement dans le plan vertical de la voiture, sans inclinaison par rapport à celle ci. Pas très réaliste..
Simulons donc les train roulant, d'autant plus que dans mes recherches j'ai appris qu'a centre de gravité égal, qu'a amortissement égal et qu'a voie et empattement égal, la variation de position de chaque point d'ancrage des trains roulant pouvaient avoir un effet considérable sur la prise de roulis et de tangage de la voiture, et sur la variation de l'angle de la roue par rapport au sol, et donc de l'adhérence des pneu. Comme pour les paramètres des pneu, tout est inscrit dans un fichier texte lu par un script. au lancement d'unity, la voiture est juste composé de sa carrosserie et d'une roue a instancier. Les script génère chaque pièce mobile en fonction du fichier, les places, crée tout les joint nécessaire, les limites etc.. c'est pas très visible mais ça donne ça :
on y voit les point de chaque configurable joint. il y en a 8 par demi train ( par roue)
Les barre anti-roulis sont aussi générées, porr limiter la prise de roulis de la voiture en virage.
4 - transmission :
Pas grand chose a développer la dessus. je gère le moteur ( couple, vitesse, inertie, frein moteur..etc), ensuite il y a l’embrayage ( phase embrayé, débrayé, patinage, auto ou manuel), le boite de vitesse à 6 rapport a changement auto ou manuel, la transmission se fait en 4x2 ( traction ou propulsion) ou 4x4 (intégrale) et en fonction possède 1 ou 3 différentiels à glissement ajustable( du totalement libre à fixe). L'antipatinage et l'ABS sont ajustable également. Je récupère les données des pneu pour savoir le niveau de glissement de chaque pneu.
5 - shader carrosse :
Bon OK, ça se conduit, voir pilote, pas trop mal a mon gout pour l'instant. Mais j'aime bien aussi quand c'est un peu plaisant a l’œil. Pour la partie modèle, c'est une Lamborghini gallardo, et c'est la seul chose qui viens du net déjà tout fait, donc je ne l'ai pas modélisée. je l'ai un peu dépouillée pour ne garder que le plus important ( vitres et carrosserie). Juste la base pour m'essayer au shader. une cubeMap dynamique et une simple reflection ne me convenaient pas vraiment, ou pas assez plutôt. hormis pour un miroir, le reflection d'un objet n'est pas constante en fonction de l'angle de vue. J'ai alors ajouter a la reflection un Fresnel. plus l'angle de vue est tangent a la surface plus le reflet est important.
Tout objet capte la lumière ambiante, et ayant l'idée de faire route et map de façon procédurale, les light probe ne me convenaient pas. Alors hop les mains dans le cambouis, ajoutons un petit effet global illumination au shader. Vu que grâce au rendu HDR, on peu capter un niveau de couleur supérieur a 1, je m'en sert. le shader procède a plusieurs itérations de blur ( floue) de la cubeMap qui me servent a "éclairer" la voiture. Pas trop mal pour un débutant :
Ici la voiture est " a l'ombre" dans un tunnel, aucune source de lumière, juste quelques cubes au plafond avec un self Illumination diffuse.
et quelques autres vues :
6 - La route :
Pour ne pas avoir a modéliser des km de route, je me suis dit que le procédurale pourrait m'aider. j'ai donc pris ce chemin, ou cette route. ^^
j'ai défini un profil pour le tracé (la route, trottoir, bas coté et mur) et le script génère aléatoirement des portions de route les un après les autres jusqu'a une certaines distance de la voiture, dans un sens comme dans l'autre. Plus on roule, plus la route se cré devant, mais aussi plus elle s'efface derrière. Ça peut aller de la petite courbe légère a l'épingle a demi tour, du plat comme de la cote, du vallonné ou champ de bosse ^^.
Du coup ce qui est fun est qu'on ne sait jamais a quoi s'attendre, comme une spéciale sans reconnaissance, et que même si on fait demi tour, la route ne sera jamais la même que celle qu'on a pris quelques secondes avant.
7 - Un volant home Made :
Jouer au clavier, pas toujours super simple, au gamePad, c'est déjà mieux, on se fait bien plaisir mais ça manque de réalisme, c'est pas un volant quoi! lol.
ah mais ça existe les volant pour jouer sur ordi, mais bon c'est du tout fait, cher pour moi et puis bon, faut avouer j'aime bien me compliquer la vie, et bricoler ailleurs que sur l'ordi. Quelques réflexion plus tard, le projet a murit dans ma tête, les idées sont la, il n'y a plus qu'a.. Je me met a la tache. Un petit a la casse du coin, je démonte et récupère un bloc de direction assisté de voiture (15€), ressort ma carte Arduino qui m'avait initié a la robotique mais laissé de coté par manque d'idées concrète. une bonne base déjà. Mince faut pouvoir récupérer la position du volant inGame, un petit tour sur le net, les vieilles imprimante sont source d’électronique parait-il. Un tout a la déchetterie et j'en ramène deux. démonte et récupère le encodeur rotatif a quadrature. Bon faut alimenter tout ça, je fouille et hop, retrouve une ancienne alim de PC, 12V 40A un peu faible mais devrait faire l'affaire en la modifiant un peu. Pour le Moteur, je désosse une visseuse 12V ramenée avec les imprimantes. Un bout d'aluminium et de tuyau pour le volant, quelques jours d'adaptations, de test et de code et voila un beau volant ( plus fonctionnel que beau.. ^^), utilisable avec unity et avec un couple de camion ( presque 80nM) et pour moins de 60€
Ça commence a faire une bonne tartine à lire pour un premier poste, J’espère qu'il y en aura quand même qui seront arrivé jusque là. ^^
attention spoiler :
Voilà pour aujourd'hui, pas mis d'exemple de code volontairement pour ne pas alourdir la chose. J’espère que le sujet vous intéressera. A vos Clavier!!!!
Je me suis un peu remis sur Unity ces derniers temps, et pour changer je suis resté sur une idée fixe de base : la simulation auto. lol. Pour ceux qui se souviennent, javais déjà fait un post ou deux sur le sujet.
Mais je suis totalement reparti de zéro, avec pas mal d'ajout, mais pas que :
Info importante , je suis sous unity 4.0, et charpentier donc unity par loisir en autodidacte
1 - utilisation de la magic formule ( pacejka 2002) pour l'adhérence des pneu( +130 paramètres).
2 - Collider + raycast pour le contact au sol ( configurable)
3 - train roulant simulé complet ( triangles, amortisseurs, fusées... chaque axe, chaque pivot)
4 - gestion traction( couple, inertie, frein moteur, 4x2 , 4x4 , différentiel avant-arrière-central, antipatinage, ABS)
5 - shader carrosserie perso, avec un fake realtime global illumination.
6 - procédural circuit.
7 - fabrication Vollant FFB : retour de force
8- Et plus a venir... (procedural map entre autre)
1 - Les Pneu avec Pacejka :
Pour ceux qui ne connaissent pas, les formules pour simuler l'adhérence des pneu sont des formules empirique : avec de machines et nombres de capteurs, les ingénieurs ont relevé les mesures des forces appliqué à un pneu dans toute les situations possibles, et ont cherché les équations permettant d’approcher au mieux les valeurs relevées. Les plus connue etant la "magic formula" de Hans Pacejka. Exempe
C'est cette formule que j'utilise dans ce projet. J'ai crée des fichier texte pour différent type de pneu avec tout les paramètres. Un script ( sur chaque roue) extrait les données (dun fichier) et fait les calculs en fonction de la charge sur le pneu, l'inclinaison de la roue par rapport au sol, angle de dérive du pneu( dérapage latéral) et le slip ratio ( patinage de la roue). le fixed TimeStep est a 0.001 (oui, les calculs sont fait 1000x par seconde , ^^)
J'ai fait un petit projet unity pour visualiser les courbes et l'influence de chaque changement dans les parametres.Je peux ainsi modifier le fichier texte directement avec celui ci :
2 - Contact au sol :
il y a quelques années, j'avais testé les wheelcollider, vraiment déçu car rien de réaliste a mon gout, ou pas trouvé la bonne façon de faire.. ils ne tenaient pas compte du poids de la voiture, les courbes de friction latéral et longitudinal etaient indépendante et non combinée, pas de retour de force...
Ensuite j'avais testé les raycast. un par roue, du centre de celle ci, vers le bas. C’était pas trop mal, ça me permettait les relevé qu'il me fallait ( distance du sol, détection contact...) pour la magic formula. C’était suffisant oui, mais sur une route assez plate. Mais dès qu'il y avait un obstacle "saillant" ça coinçait. Par exemple, monter un trottoir, détectant un seul point de contact, l'angle du trottoir "pénétrait" la roue avant que celle ci ne monte dessus.
J'ai Donc crée un système un peu plus complexe pour palier ce problème.
Une roue comporte plusieurs box collider ( trigger ) de la largeur du pneu, et définissant le contour de celui ci. chacun avec un OnTriggerStay renvoyant l'info de contact ou non au script de la roue. et au lieu de faire un seul Raycast, il y en a plusieurs couvrant la portion du pneu en contact avec un obstacle. Chacun renvoyant ses infos ( distance sol, angle..etc), je fais la moyenne et calcul la magic formula. Je peux donc gérer plusieur contact en simultané ( par exemple la route en bas de la roue ET l'angle du trottoir que je touche)
Voila a quoi ça ressemble : (la "résolution" de la détection et paramétrable, ici 20 collider, résolution de 4 sur la largeur )
3 - Train Roulant
Bon Ok, tout ça c'est bien, Mais bon, les roues fixes a la voiture, le seul amortissement serait alors celui des pneu ( oui, l’élasticité des pneu est simulée), donc a moins de monter des pneu de monster-truc, c'est un peu tape cul a conduire et pas très stable.. ^^.
Avant, mon unique raycast vertical me permettait de simuler en même les couple ressort/amortisseur, avec un déplacement des roues uniquement dans le plan vertical de la voiture, sans inclinaison par rapport à celle ci. Pas très réaliste..
Simulons donc les train roulant, d'autant plus que dans mes recherches j'ai appris qu'a centre de gravité égal, qu'a amortissement égal et qu'a voie et empattement égal, la variation de position de chaque point d'ancrage des trains roulant pouvaient avoir un effet considérable sur la prise de roulis et de tangage de la voiture, et sur la variation de l'angle de la roue par rapport au sol, et donc de l'adhérence des pneu. Comme pour les paramètres des pneu, tout est inscrit dans un fichier texte lu par un script. au lancement d'unity, la voiture est juste composé de sa carrosserie et d'une roue a instancier. Les script génère chaque pièce mobile en fonction du fichier, les places, crée tout les joint nécessaire, les limites etc.. c'est pas très visible mais ça donne ça :
on y voit les point de chaque configurable joint. il y en a 8 par demi train ( par roue)
Les barre anti-roulis sont aussi générées, porr limiter la prise de roulis de la voiture en virage.
4 - transmission :
Pas grand chose a développer la dessus. je gère le moteur ( couple, vitesse, inertie, frein moteur..etc), ensuite il y a l’embrayage ( phase embrayé, débrayé, patinage, auto ou manuel), le boite de vitesse à 6 rapport a changement auto ou manuel, la transmission se fait en 4x2 ( traction ou propulsion) ou 4x4 (intégrale) et en fonction possède 1 ou 3 différentiels à glissement ajustable( du totalement libre à fixe). L'antipatinage et l'ABS sont ajustable également. Je récupère les données des pneu pour savoir le niveau de glissement de chaque pneu.
5 - shader carrosse :
Bon OK, ça se conduit, voir pilote, pas trop mal a mon gout pour l'instant. Mais j'aime bien aussi quand c'est un peu plaisant a l’œil. Pour la partie modèle, c'est une Lamborghini gallardo, et c'est la seul chose qui viens du net déjà tout fait, donc je ne l'ai pas modélisée. je l'ai un peu dépouillée pour ne garder que le plus important ( vitres et carrosserie). Juste la base pour m'essayer au shader. une cubeMap dynamique et une simple reflection ne me convenaient pas vraiment, ou pas assez plutôt. hormis pour un miroir, le reflection d'un objet n'est pas constante en fonction de l'angle de vue. J'ai alors ajouter a la reflection un Fresnel. plus l'angle de vue est tangent a la surface plus le reflet est important.
Tout objet capte la lumière ambiante, et ayant l'idée de faire route et map de façon procédurale, les light probe ne me convenaient pas. Alors hop les mains dans le cambouis, ajoutons un petit effet global illumination au shader. Vu que grâce au rendu HDR, on peu capter un niveau de couleur supérieur a 1, je m'en sert. le shader procède a plusieurs itérations de blur ( floue) de la cubeMap qui me servent a "éclairer" la voiture. Pas trop mal pour un débutant :
Ici la voiture est " a l'ombre" dans un tunnel, aucune source de lumière, juste quelques cubes au plafond avec un self Illumination diffuse.
et quelques autres vues :
6 - La route :
Pour ne pas avoir a modéliser des km de route, je me suis dit que le procédurale pourrait m'aider. j'ai donc pris ce chemin, ou cette route. ^^
j'ai défini un profil pour le tracé (la route, trottoir, bas coté et mur) et le script génère aléatoirement des portions de route les un après les autres jusqu'a une certaines distance de la voiture, dans un sens comme dans l'autre. Plus on roule, plus la route se cré devant, mais aussi plus elle s'efface derrière. Ça peut aller de la petite courbe légère a l'épingle a demi tour, du plat comme de la cote, du vallonné ou champ de bosse ^^.
Du coup ce qui est fun est qu'on ne sait jamais a quoi s'attendre, comme une spéciale sans reconnaissance, et que même si on fait demi tour, la route ne sera jamais la même que celle qu'on a pris quelques secondes avant.
7 - Un volant home Made :
Jouer au clavier, pas toujours super simple, au gamePad, c'est déjà mieux, on se fait bien plaisir mais ça manque de réalisme, c'est pas un volant quoi! lol.
ah mais ça existe les volant pour jouer sur ordi, mais bon c'est du tout fait, cher pour moi et puis bon, faut avouer j'aime bien me compliquer la vie, et bricoler ailleurs que sur l'ordi. Quelques réflexion plus tard, le projet a murit dans ma tête, les idées sont la, il n'y a plus qu'a.. Je me met a la tache. Un petit a la casse du coin, je démonte et récupère un bloc de direction assisté de voiture (15€), ressort ma carte Arduino qui m'avait initié a la robotique mais laissé de coté par manque d'idées concrète. une bonne base déjà. Mince faut pouvoir récupérer la position du volant inGame, un petit tour sur le net, les vieilles imprimante sont source d’électronique parait-il. Un tout a la déchetterie et j'en ramène deux. démonte et récupère le encodeur rotatif a quadrature. Bon faut alimenter tout ça, je fouille et hop, retrouve une ancienne alim de PC, 12V 40A un peu faible mais devrait faire l'affaire en la modifiant un peu. Pour le Moteur, je désosse une visseuse 12V ramenée avec les imprimantes. Un bout d'aluminium et de tuyau pour le volant, quelques jours d'adaptations, de test et de code et voila un beau volant ( plus fonctionnel que beau.. ^^), utilisable avec unity et avec un couple de camion ( presque 80nM) et pour moins de 60€
Ça commence a faire une bonne tartine à lire pour un premier poste, J’espère qu'il y en aura quand même qui seront arrivé jusque là. ^^
attention spoiler :
► Afficher le texte