Rompower
31/01/2007, 21h48
Bonsoir les amis,
comme vous le savez peut être, j'aime bien les voitures :mrgreen: (scoop de l'année ^^ )
comme vous le savez aussi peut être, je travaille depuis un certain temps sur un projet de court métrage, qui met en scène des voitures qui roulent ( :shock: si si! :!: ), seulement voilà, pour animer toute cette histoire y a pas 36 solutions, il me faut un expresso qui me permette de travailler de manière plus précise. Les objectifs sont les suivants:
=> 1 Gestion simplifiée (Curseurs User Data) de la voiture, comprenant :
- Direction
- Portes
- Phares
- Capot
- Vitres
=> 2 Calcul automatique réaliste de la rotation de chaque roue individuellement, dans n'importe quelle position/mouvement, même en dérapage. :coup:
=> 3 Calcul automatique du roulis en fonction de l'intensité de l'accélération horizontale (les "G" latéraux) :poucehaut:
=> 4 Calcul automatique de l'inclinaison de la voiture dans le sens de la conduite (accélération, freinage) :poucehaut:
=> 5 Un réglage "Burnout", un curseur User Data qui fait "patiner" les roues en les faisant tourner X fois plus vite que ce qu'elles devraient (d'après le calcul automatique cité plus haut), couplé à des émetteurs de particules, qui vont produire de la fumée de manière proportionnelle au patinage des roues.
et peut être plus à venir...
Pour ce qui est de la gestion simplifiée, je sais le faire, pour les G latéraux j'ai ma petite idée, pour l'inclinaison il y a toujours l'excellent tuto de base (http://www.base80.com/index.php/2005/11/07/p95#more95) ;) , pour le "burnout", je me suis déjà fait une telle formule, mais c'est encore perfectible.
En fait ça fait déjà un certain temps que ça me trotte dans la tête, j'avais déjà fait des essais d'Xpressos sur la Evo en 2005:
http://www.hiboox.com/images/0507/3476223d.jpg
Le gros problème vient du calcul automatique de la rotation des roues en fonction du déplacement du véhicule. J'avais utilisé un Expresso assez simple pour ma dernière animation de la supra:
http://www.hiboox.com/images/0507/9abe5b8e.jpg (http://video.google.fr/videoplay?docid=-806380449538726888)
http://www.hiboox.com/images/0507/6ddc33fd.jpg
Il reprenait le principe de Blazouf selon lequel il suffit de mettre en relation la distance parcourue et le périmètre de la roue pour connaître sa rotation. Plus simple tu moeurs! :poucehaut: ça marche super bien, mais seulement pour les MRU (Mouvement Réctiligne Uniforme) :arg:
Bref, voici les conclusions que j'ai tirées de mes expérimentations diverses:
- Tout d'abord le problème du MRUA (Mouvement Réctiligne Uniformément Accéléré) : dès qu'il y a accélération il y a variation de vitesse, donc on doit inclure la notion de temps d'une manière ou d'une autre.
- Ensuite le problème géométrique: une voiture a 4 roues, dont 2 qui peuvent pivoter, chaque roue tourne à une vitesse différente (sauf en ligne droite), il est donc indispensable que la rotation de chaque roue soit calculée indépendamment des autres.
- Finalement les difficultés liées aux dérapages, patinages, etc... : une roue ne peut pivoter que dans un seul sens, le fait de la faire glisser latéralement ne la fera pas tourner, il faut donc mesurer sa distance parcourue dans une certaine direction uniquement.
Voilà, le problème est posé. Je me suis amusé récemment à réfléchir à comment le résoudre, avec un peu de trigo et de logique, je pense avoir trouvé une solution.
http://www.hiboox.com/images/0507/b3664b3d.jpg
http://www.hiboox.com/images/0507/6253d944.jpg
ça peut parraîte compliqué comme ça mais en fait c'est simple:
pour établir la distance parcourue par la roue dans la direction de rotation:
soient:
X1 = position sur X de la roue au temps 1
X2 = position sur X de la roue au temps 2 (une image plus loin)
Z1 = position sur Z de la roue au temps 1
Z2 = position sur Z de la roue au temps 2 (une image plus loin)
X2-X1 = la distance parcourue sur l'axe X
Z2-Z1 = la distance parcourue sur l'axe Z
pour obtenir la distance parcourue par la roue dans le sens de rotation, il suffit d'utiliser l'angle global "alpha" de la roue (rotation sur l'axe Y):
si le sens de rotation est dirigé sur l'axe X lorsque "alpha" = 90° , alors il suffit de poser:
[(X2-X1) * Sin (alpha)] + [(Z2-Z1) * Cos (alpha)] = distance parcourue dans la bonne direction (étant donné que Sin (90°) = 1 )
sous expresso ça donne ça:
http://www.hiboox.com/images/0507/4fc27655.jpg
J'ai testé et ça marche niquel :poucehaut:
Cela nous donne la distance parcourue dans le sens de rotation depuis l'image précédente, et par conséquent la rotation effectuée par la roue depuis l'image précédente, appelons celle ci "delta alpha".
Hors, la coordonée de rotation de la roue que le programme doit recracher est composée de :
- "delta alpha"
+
- l'angle de la roue à l'image précédente.
il faudrait donc additionner le total des "delta alpha" depuis le début de l'animation, pour que la coordonnée soit juste :| :?:
ou éventuellement refaire le tout de manière vectorielle, mais ça je m'y connais pas du tout :arg:
Voilà, toute aide est la bienvenue!
je posterai ici l'avancée de mes recherches,
l'expresso calculant la rotation des roues sera mis dans les ressources du site. :wink:
D'avance merci! :prie:
comme vous le savez peut être, j'aime bien les voitures :mrgreen: (scoop de l'année ^^ )
comme vous le savez aussi peut être, je travaille depuis un certain temps sur un projet de court métrage, qui met en scène des voitures qui roulent ( :shock: si si! :!: ), seulement voilà, pour animer toute cette histoire y a pas 36 solutions, il me faut un expresso qui me permette de travailler de manière plus précise. Les objectifs sont les suivants:
=> 1 Gestion simplifiée (Curseurs User Data) de la voiture, comprenant :
- Direction
- Portes
- Phares
- Capot
- Vitres
=> 2 Calcul automatique réaliste de la rotation de chaque roue individuellement, dans n'importe quelle position/mouvement, même en dérapage. :coup:
=> 3 Calcul automatique du roulis en fonction de l'intensité de l'accélération horizontale (les "G" latéraux) :poucehaut:
=> 4 Calcul automatique de l'inclinaison de la voiture dans le sens de la conduite (accélération, freinage) :poucehaut:
=> 5 Un réglage "Burnout", un curseur User Data qui fait "patiner" les roues en les faisant tourner X fois plus vite que ce qu'elles devraient (d'après le calcul automatique cité plus haut), couplé à des émetteurs de particules, qui vont produire de la fumée de manière proportionnelle au patinage des roues.
et peut être plus à venir...
Pour ce qui est de la gestion simplifiée, je sais le faire, pour les G latéraux j'ai ma petite idée, pour l'inclinaison il y a toujours l'excellent tuto de base (http://www.base80.com/index.php/2005/11/07/p95#more95) ;) , pour le "burnout", je me suis déjà fait une telle formule, mais c'est encore perfectible.
En fait ça fait déjà un certain temps que ça me trotte dans la tête, j'avais déjà fait des essais d'Xpressos sur la Evo en 2005:
http://www.hiboox.com/images/0507/3476223d.jpg
Le gros problème vient du calcul automatique de la rotation des roues en fonction du déplacement du véhicule. J'avais utilisé un Expresso assez simple pour ma dernière animation de la supra:
http://www.hiboox.com/images/0507/9abe5b8e.jpg (http://video.google.fr/videoplay?docid=-806380449538726888)
http://www.hiboox.com/images/0507/6ddc33fd.jpg
Il reprenait le principe de Blazouf selon lequel il suffit de mettre en relation la distance parcourue et le périmètre de la roue pour connaître sa rotation. Plus simple tu moeurs! :poucehaut: ça marche super bien, mais seulement pour les MRU (Mouvement Réctiligne Uniforme) :arg:
Bref, voici les conclusions que j'ai tirées de mes expérimentations diverses:
- Tout d'abord le problème du MRUA (Mouvement Réctiligne Uniformément Accéléré) : dès qu'il y a accélération il y a variation de vitesse, donc on doit inclure la notion de temps d'une manière ou d'une autre.
- Ensuite le problème géométrique: une voiture a 4 roues, dont 2 qui peuvent pivoter, chaque roue tourne à une vitesse différente (sauf en ligne droite), il est donc indispensable que la rotation de chaque roue soit calculée indépendamment des autres.
- Finalement les difficultés liées aux dérapages, patinages, etc... : une roue ne peut pivoter que dans un seul sens, le fait de la faire glisser latéralement ne la fera pas tourner, il faut donc mesurer sa distance parcourue dans une certaine direction uniquement.
Voilà, le problème est posé. Je me suis amusé récemment à réfléchir à comment le résoudre, avec un peu de trigo et de logique, je pense avoir trouvé une solution.
http://www.hiboox.com/images/0507/b3664b3d.jpg
http://www.hiboox.com/images/0507/6253d944.jpg
ça peut parraîte compliqué comme ça mais en fait c'est simple:
pour établir la distance parcourue par la roue dans la direction de rotation:
soient:
X1 = position sur X de la roue au temps 1
X2 = position sur X de la roue au temps 2 (une image plus loin)
Z1 = position sur Z de la roue au temps 1
Z2 = position sur Z de la roue au temps 2 (une image plus loin)
X2-X1 = la distance parcourue sur l'axe X
Z2-Z1 = la distance parcourue sur l'axe Z
pour obtenir la distance parcourue par la roue dans le sens de rotation, il suffit d'utiliser l'angle global "alpha" de la roue (rotation sur l'axe Y):
si le sens de rotation est dirigé sur l'axe X lorsque "alpha" = 90° , alors il suffit de poser:
[(X2-X1) * Sin (alpha)] + [(Z2-Z1) * Cos (alpha)] = distance parcourue dans la bonne direction (étant donné que Sin (90°) = 1 )
sous expresso ça donne ça:
http://www.hiboox.com/images/0507/4fc27655.jpg
J'ai testé et ça marche niquel :poucehaut:
Cela nous donne la distance parcourue dans le sens de rotation depuis l'image précédente, et par conséquent la rotation effectuée par la roue depuis l'image précédente, appelons celle ci "delta alpha".
Hors, la coordonée de rotation de la roue que le programme doit recracher est composée de :
- "delta alpha"
+
- l'angle de la roue à l'image précédente.
il faudrait donc additionner le total des "delta alpha" depuis le début de l'animation, pour que la coordonnée soit juste :| :?:
ou éventuellement refaire le tout de manière vectorielle, mais ça je m'y connais pas du tout :arg:
Voilà, toute aide est la bienvenue!
je posterai ici l'avancée de mes recherches,
l'expresso calculant la rotation des roues sera mis dans les ressources du site. :wink:
D'avance merci! :prie: