incompréhension rotation*timedelta

Bonjour,

Mon interrogation porte sur ceci :

Quand je fais un déplacement avec *timedelta, l’objet accélère de plus en plus.
Quand je fais une rotation avec *timedelta, l’objet tourne à vitesse constante.

Pourquoi la rotation n’accélère t-elle pas comme dans le cas du déplacement ?
En principe avec la commande timedelta, l’information se stock et s’ajoute seconde après seconde en principe non ?

Salut,

Les forces utilisent déjà TimeDelta() en interne car la vitesse de la force est exprimée en pixel/s. Alors que l’action de rotation fait une rotation d’un certain de degrés directement (il faut donc utiliser TimeDelta() pour la rotation, et non pour les forces).

C’est une histoire de sur quoi tu agit. :slight_smile:
Ici, tu augmente de façon progressive et constante ( avec TimeDelta, que tu utilises correctement ) la variable volant. Tu augmente donc progressivement l’angle de la voiture.
Par contre, tu augmente de façon progressive et constante la variable accélération, qui agit ensuite sur la longueur de la force: En augmentant accélération, tu augmente la force, donc la voiture va progressivement plus vite.

Si tu souhaite une accélération également pour la rotation, il te faut une variable “AccelerationRotation”, que tu augmente ou réduit régulièrement. Ensuite, avec cette variable, tu augmente progressivement la variable “volant”, et là tu aura une accélération ( ou décéleration suivant le signe ) de la rotation.

( Si tu est un peu à l’aise avec les unités et les concepts de physiques, une accélération linéaire c’est en pixels par seconde par seconde, et une vitesse c’est en pixels par secondes. Le *TimeDelta() correspond à un “par seconde”. )

Je ne suis pas sûr de comprendre, tu dis que timedelta est gérer par les forces, mais qu’on ne peut utiliser timedelta, qu’avec les forces :blush: DAns ce cas puisque les forces gerent timedelta, à quoi sert-il de le rajouter … :laughing: ??

Si je met si clicl gauche = appliquer une force d’angle X de pixels X, à mon clic gauche le sprite va se déplacer de façon constante de x pixels … Si je met *timedelta(), le X va etre multiplié à chaque seconde et par le nombre de seconde : 100 à la 1ere, puis 200 à la 2eme, puis 300 pixels/seconde à la 3eme ect …

Donc non, je n’ai pas l’impression que les forces gerent le time delta déjà …
Ou alors je n’ai pas bien saisi ce que tu voulais dire ?

Et bien non, quand je teste la scène avec cette config de “code”(qui est aussi une partie du tuto 3Dracing dans les exemples), la voiture tourne tout de suite à vitesse régulière de 200 px constants, sans accélération …

Ca oui, et c’est là où je ne comprend pas.
Que j’applique une force ou une rotation (qui est aussi une force), et les 2 renvoyant à une variable qui devrait augmenter pour les deux, ça devrait le faire dans les deux cas.

Hors ça ne le fait que sur les forces et non sur les rotations … :confused:
si je laisse appuyer sur A la voiture accélère là à l’infini, car y est ajouté +500/sec à la variable"acceleration" …
Si j’appuie sur Q elle tourne à gauche sans accélérer, d’où ma question, malgré qu’il y soit ajouté aussi dans la variable"volant" +200/sec …

Etrange non ?
Ou c’est moi ? :laughing:

Et en fait effectivement ! Là dans mon exemple qu’on mette ou non *timedelta dans les rotations ou non, ça ne change rien …
5il faut juste remplacer 200 par 2 sinon ça tourne trop vite)

En gros:

Faire +200*TimeDelta() à l’angle d’un objet.

C’est équivalent à faire :
Faire +200*TimeDelta() à la position X d’un objet.

Or les forces agissent déjà comme ceci ( Ajouter une force de 200 pixels équivaut à écrire : Faire +200*TimeDelta() à la position X d’un objet. )
Ici, ce que tu fais est donc équivalent à :

Faire +200*TimeDelta() à la variable acceleration.
Faire +Variable(acceleration)*TimeDelta() à la position X d’un objet.

Tu as donc “deux” TimeDelta() qui entrent en compte.

Le fait que “ça tourne trop vite” est un signe que tu modifie une valeur sans tenir compte du temps : En gros, si tu ne met pas TimeDelta(), tu ajoute une valeur ( 2 ) qui n’a pas d’unité à une variable qui a une unité ( pixels/secondes ou degrés/seconde ). Ca donne des résultats qui varient suivant la vitesse du PC, c’est très mauvais.
C’est le TimeDelta() qui créé le “par seconde”.

Ok …

Bon, je ne comprend pas tout mais je prend p-e timedelta pour ce qu’il n’est pas vraiment …
En tout cas merci pour votre présence et votre réactivité ! :wink:

Et désolé Victor pour le twist ^^ , je vois ce que tu veux dire, mais j’étudie le fonctionnement des actions et ça ne me paraissait pas logique que ça agisse comme ça …

Je m’y remet, à bientôt. :slight_smile:

Bonsoir,

Ok, j’ai compris …

En fait la fonction timedelta permet de garder en mémoire une information par seconde.
Dans le cas d’un ajout de force via une pression de touche, il va être entré une donnée d’X unités/sec …

pour les ajouts de force cela fait accélérer dans le temps parce que dans ce cas il s’agit d’augmenter une variable “nb de px/sec”
alors que dans le cas de la rotation, il s’agit d’augmenter une variable en “°/sec” …

Et en affichant la variable “volant” on voit bien le nombre de degrés augmenter autant que si est affiché la variable “accélération”, cependant il s’agit de degrés en “position”, apres un tour 0 devient 360, puis 720, 1080 ect ect …

Donc pas d’effet d’accélération :blush:

Voilà le pourquoi du comment.
Merci à 4ian et Victor.
Bons projets :wink:

[edit: passé en résolu]