Comment faire pour que l'objet perde moins de vitesse à mesure que sa vitesse augmente


11

Je développe un jeu en Flash et j'ai besoin d'un peu d'aide. Cela peut être considéré comme un problème mathématique.

Mon objet vole avec vitesse Xet mon objet peut entrer en collision avec des pierres. Quand il entre en collision avec une pierre, j'ai besoin que mon objet brise la pierre et continue, mais avec moins de vitesse. Il est facile de le coder en dur et d'écrire quelque chose comme:, myVelocity -= 10;mais mon principal problème est que je veux qu'il perde moins de vitesse plus la vitesse initiale est élevée.

Par exemple: si la vitesse est de 300, je veux qu'elle perde 10 et si elle était de 200, je veux qu'elle perde 20.

Cela peut-il être fait avec une sorte de formule?


1
Que diriez-vous de quelque chose de simple comme log(myVelocity + 1) * N?
Jonathan Connell

Réponses:


6

Je voudrais inverser la vitesse et multiplier par quelque chose que vous aimez:

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

Cet exemple donne ces effets:

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution

Qu'est-ce que la «restitution»?
jprete

La restitution rebondit. Ce qui est réaliste.
Martijn Courteaux

30

Ces systèmes que vous et d'autres décrivez ne généreront pas de physique réelle. la formule principale est de diminuer 0,5 * m * v ^ 2 (énergie cinématique) d'une valeur constante chaque fois qu'un objet frappe quelque part.

donc si un objet avec un poids 2Kg frappe un bloc, qui a besoin de 16j d'énergie avant de se casser: la vitesse de déplacement de l'objet changera selon ce tableau:

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s

7
Cela doit être accepté - il est correct, réaliste, facile à mettre en œuvre et gérera tous les cas de masse et de vitesse d'objet et de bloc.
Tesserex

3
À moins que vous n'ayez un effet spécifique de «physique de bande dessinée» que vous espérez obtenir, opter pour un système plus réaliste est presque toujours une bonne idée; il y a peu de meilleures façons de vous assurer que vous n'obtiendrez pas de cas de bord potentiellement cassants.
Steven Stadnicki

1
Cette réponse était bonne, je sais. Mais mon jeu se déroule dans un monde de dessin animé et il n'a pas besoin d'être réaliste. J'aurais dû être plus précis en posant la question.
Afra

1
c'est un projet communautaire, les gens étaient là pour répondre à la question et pour la question posée, c'est la meilleure réponse. Ce n'est pas parce que vous préférez la solution hacky pour votre cas particulier que cette réponse n'est pas la meilleure. En sélectionnant la réponse hacky comme solution, lorsque quelqu'un cherche sur le site la réponse à ce type de question, il suppose que la réponse non réaliste est la meilleure.
Richard Fabian

1
@Richard L'autre solution n'est pas hacky simplement parce qu'elle n'utilise pas de physique réaliste, Tetris est-il hacky parce que les blocs ne tombent pas en douceur? Si les gens supposent qu'une réponse acceptée est la «meilleure» au lieu de supposer que c'est la réponse qui satisfait le demandeur, c'est leur faute. Toutes les réponses et votes sont encore évidents.
CiscoIPPhone

2

Vous n'avez pas vraiment donné suffisamment d'informations pour dire quel type de plage vous voulez, c'est-à-dire s'il est plafonné, si vous voulez une progression géométrique, etc.

La première chose que vous voulez faire est de dériver un nombre proportionnel à la quantité de vitesse que vous voulez perdre (il ne doit pas nécessairement être le même, mais il devrait diminuer à mesure que la vitesse augmente pour le rendre proportionnel à votre perte). La manière standard de le faire est de prendre la réciproque :

temp = 1 / currentVelocity;

Maintenant, pour 100, vous aurez 0,01, pour 200, vous aurez 0,005, pour 300, vous aurez 0,0033 et ainsi de suite.

Maintenant, il vous suffit d'ajuster ce nombre à tout ce que vous voulez vraiment, en le multipliant. Donc

k = 3000;
newVelocity = temp * k;

vous donnera votre 20 pour 300, mais il vous en donnera 15 pour 200 plutôt que 10. Cela peut vous convenir, dans ce cas, vous n'avez pas besoin de lire plus loin. Vous pouvez ajuster k comme vous le souhaitez, mais vous n'obtiendrez peut-être pas les chiffres comme vous les aimez, sauf si vous en faites un peu plus, comme implémenter la progression géométrique ou modifier la base pour augmenter. Je ne vais pas entrer ici dans les progressions géométriques, mais si vous voulez changer la base, vous le faites comme suit:

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

Cela vous fournira la plage que vous aviez initialement demandée dans votre question, 300 -> perte de 10, 200 -> perte de 20. Pour info 100 -> perte de 40 et 50 -> perte de 80 (!) Ce qui signifie que vous aurais besoin de restreindre votre soustraction - ce que j'ai fait dans les lignes (1) et (2).

Il y a bien sûr d'autres façons d'aborder ce problème, que je suis sûr que ceux qui sont plus habiles mathématiquement que moi publieront ici.


0

Je pense que vous pouvez utiliser une simple division par vitesse. Par exemple: perdu = 3 000 / myVelocity. Lorsque la vélocité est de 300, vous en perdrez 10, lorsqu'elle sera de 200, vous en perdrez 15. C'est à vous de choisir les constantes correctes.

Si vous le souhaitez, vous pouvez utiliser une formule plus complexe, comme: constante / (constante2 * vitesse ^ 2 + constante3 * vitesse). Encore une fois, choisissez simplement des constantes qui vous conviendront.


c'est complètement inversé de ce qu'il a demandé et de ce qui se passe en physique réelle.
Ali1S232

Je ne te comprends pas. Qu'est-ce qui est inversé?
zacharmarz

Je suppose que j'ai mal compris votre réponse, ma mauvaise.
Ali1S232
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.