[WPF] Animations : accélérations

Hello la zone,

J’ai un petit soucis avec WPF.

J’aimerais faire une application qui est capable de déplacer un objet de manière “réaliste” d’après une vitesse maximale et une accélération donnée.

Par exemple, imaginons que j’entre que je veux un objet qui fasse du 0 à 100km/h en 2.7s et 352Km/h en vitesse de pointe (une plaque de chocolat Suisse à celui qui trouve à quelle machine de la mort ces caractéristiques correspondent :)).

Je voudrais donc déplacer mon objet en calculant l’accélération linéaire jusqu’à atteindre sa vitesse de pointe, puis le faire continuer en vitesse linéaire jusqu’à l’arrivée.

J’ai trouvé comment faire un storyboard qui a ce qu’il faut pour déplacer l’objet en utilisant une “DoubleAnimationUsingKeyFrame” qui contient une “LinearDoubleKeyFrame” pour la partie linéaire et “SplineDoubleKeyFrame” pour la partie accélération.

C’est là que vient mon soucis… comment calculer les valeurs de la B-Spline pour que mon accélération corresponde à l’accélération calculée?

Pour ceux qui sont intéressés, mon code ressemble beaucoup à celui-ci tiré de MSDN:

[code]

	   <!-- Using a LinearDoubleKeyFrame, the rectangle moves 
			  steadily from its starting position to 500 over 
			  the first 3 seconds.  -->
	   <LinearDoubleKeyFrame Value="500" KeyTime="0:0:3" />

	   <!-- Using a SplineDoubleKeyFrame, the rectangle moves 
			  back to its starting point. The
			  animation starts out slowly at first and then speeds up. 
			  This KeyFrame ends after the 6th
			  second. -->
	   <SplineDoubleKeyFrame KeySpline="0.6,0.0 0.9,0.00" Value="0" KeyTime="0:0:6" />
  </DoubleAnimationUsingKeyFrames>

[/code]

http://fr.wikipedia.org/wiki/Suzuki_GSX-R :slight_smile:

Hayabusa \o/

Là ca me parait plus être des maths que du WPF
En gros, tu veux une accélération constante pour arriver à 100km/h, puis une accélération qui diminue de manière constante jusqu’à attendre la vitesse 352km/h.
Comme en WPF tu animes des positions (et non pas des vitesses), il faut déjà que tu calcules quelle distance il te faut pour atteindre les 100km/h puis combien il te faut pour atteindre les 352 km/h. Une fois que tu as ca, tu fais une règle de trois pour que tes points clefs tiennent dans ton canevas, et sur la premiere partie de l’accélération du fais du mets un keyspline du genre “X1 : 1, Y1:0, X2:1, Y2:0” et pour la deuxième le contraire: “X1=0, y1 = 1, X2 = 0, y2=1”.

Si tu t’es pas gourré dans tes calculs de distances, tu auras une accélération de plus en plus forte pour atteindre 100km/h, puis de plus en plus faible jusqu’à 352 km/h.

A noter que ca donnera un mouvement fluide, mais pas forcément réalliste par rapport au comportement réel de la voiture (l’accélération se fait par à coups à cause des passages de rapports, et suivant les caractéristiques du moteur, l’accélération de pointe ne se fait pas forcément à 100 km/h)

Faut choper les courbes du couple du moteur, et les ratio des differents rapports et ca donnera un truc plus realiste :slight_smile:

Ahah c’est bien cet engin de fous :slight_smile: . Envoie-moi un PM avec ton adresse et tes préférences en chocolat (au lait, noir, aux noisettes), je t’enverrais ta plaque :cry:.

Ah oui pas bête l’accélération qui diminue après les 100Km/h, à la base je pensais simplement faire une accélération constante jusqu’à la vitesse maximum. Mais c’est en effet peut-être plus réaliste avec une seconde partie de l’accélération qui diminue.

OK, c’est bien sur ce que j’étais parti au niveau des calculs, là où j’étais perdu c’est pour la keyspline à choisir pour avoir une accélération constante. Mais en effet avec celle que tu m’as donné ça me semble faire la blague. Faut que je vérifie avec 2 3 calculs.

J’avais aussi pensé aux courbes de couple, le problème c’est que comme je voulais faire ça sur pas mal de véhicules différents, ça risque d’être difficile à trouver.

Mais dans le cas où je trouve, je devrais bien créer une keyframe pour chaque « stade » de la courbe, en calculant à chaque fois la distance et le temps pour atteindre ce stade, c’est correct?

Exacte… Le mieux étant de faire une AnimFactory qui prends une source de données (genre xml) et qui te fait ca de manière générique