Wie man ein Objekt dazu bringt, mit zunehmender Geschwindigkeit weniger Geschwindigkeit zu verlieren


11

Ich entwickle ein Spiel in Flash und brauche ein wenig Hilfe. Es kann als mathematisches Problem angesehen werden.

Mein Objekt fliegt mit Geschwindigkeit Xund mein Objekt kann mit Steinen kollidieren. Wenn es mit einem Stein kollidiert, muss mein Objekt den Stein brechen und fortfahren, aber mit geringerer Geschwindigkeit. Es ist einfach, es fest zu codieren und so etwas wie: zu schreiben myVelocity -= 10;, aber mein Hauptproblem ist, dass ich möchte, dass es weniger Geschwindigkeit verliert, je höher die Anfangsgeschwindigkeit ist.

Zum Beispiel: Wenn die Geschwindigkeit 300 ist, möchte ich, dass sie 10 verliert, und wenn es 200 war, möchte ich, dass sie 20 verliert.

Kann das mit einer Formel gemacht werden?


1
Wie wäre es mit etwas Einfachem wie log(myVelocity + 1) * N?
Jonathan Connell

Antworten:


6

Ich würde die Geschwindigkeit umkehren und mit etwas multiplizieren, das Ihnen gefällt:

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;

Dieses Beispiel zeigt folgende Effekte:

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

Was ist "Rückerstattung"?
jprete

Die Restitution erholt sich. Welches ist realistisch.
Martijn Courteaux

30

Das System, das Sie und andere beschreiben, erzeugt keine wirklich aussehende Physik. Die Hauptformel besteht darin, 0,5 * m * v ^ 2 (kinematische Energie) um einen konstanten Wert zu verringern, wenn ein Objekt irgendwo aufschlägt.

Wenn also ein Objekt mit einem Gewicht von 2 kg auf einen Block trifft, der 16 j Energie benötigt, bevor er bricht, ändert sich die Bewegungsgeschwindigkeit des Objekts gemäß dieser Tabelle:

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
Dies sollte akzeptiert werden - es ist korrekt, realistisch, einfach zu implementieren und behandelt alle Fälle von Objekt- und Blockmasse und -geschwindigkeit.
Tesserex

3
Wenn Sie nicht einen bestimmten "Cartoon-Physik" -Effekt haben, den Sie sich erhoffen, ist es fast immer eine gute Idee, ein realistischeres System zu verwenden. Es gibt nur wenige bessere Möglichkeiten, um sicherzustellen, dass Sie keine potenziell bahnbrechenden Fälle erhalten.
Steven Stadnicki

1
Diese Antwort war gut, ich weiß. Aber mein Spiel spielt in einer Cartoon-Welt und muss nicht realistisch sein. Ich hätte genauer sein sollen, wenn ich die Frage gestellt hätte.
Afra

1
Dies ist ein Gemeinschaftsprojekt, die Leute waren hier, um die Frage zu beantworten, und für die gestellte Frage ist dies die beste Antwort. Nur weil Sie die hackige Lösung für Ihren speziellen Fall bevorzugen, heißt das nicht, dass diese Antwort nicht die beste Antwort ist. Wenn jemand anderes auf der Website nach der Antwort auf diese Art von Frage sucht, wird er davon ausgehen, dass die unrealistische Antwort die bessere ist, wenn er die hackige Antwort als Lösung auswählt.
Richard Fabian

1
@Richard Die andere Lösung ist nicht hacky, nur weil sie keine realistische Physik verwendet. Ist Tetris hacky, weil die Blöcke nicht reibungslos fallen? Wenn Leute annehmen, dass eine akzeptierte Antwort die "bessere" ist, anstatt anzunehmen, dass es die Antwort ist, die den Fragesteller zufriedenstellt, ist es ihre Schuld. Alle Antworten und Stimmen sind noch offensichtlich.
CiscoIPPhone

2

Sie haben nicht wirklich genug Informationen angegeben, um zu sagen, welche Art von Bereich Sie möchten, dh ob er begrenzt ist, ob Sie einen geometrischen Verlauf wünschen usw.

Als erstes möchten Sie eine Zahl ableiten, die proportional zur Geschwindigkeit ist, die Sie verlieren möchten (sie muss nicht gleich sein, sollte jedoch mit zunehmender Geschwindigkeit abnehmen, um sie proportional zu Ihrem Verlust zu machen). Der Standardweg, dies zu tun, ist das Gegenteil :

temp = 1 / currentVelocity;

Jetzt haben Sie für 100 0,01, für 200 0,005, für 300 0,0033 und so weiter.

Jetzt müssen Sie diese Zahl nur noch an das anpassen, was Sie wirklich wollen, indem Sie sie multiplizieren. So

k = 3000;
newVelocity = temp * k;

Sie erhalten 20 für 300, aber 15 für 200 statt 10. Dies kann für Sie in Ordnung sein. In diesem Fall müssen Sie nicht weiter lesen. Sie können k nach Belieben anpassen, aber Sie erhalten möglicherweise keine Zahlen, wie Sie sie mögen, es sei denn, Sie tun etwas mehr, z. B. implementieren Sie eine geometrische Progression oder ändern Sie die Basis für die Erhöhung. Ich werde hier nicht auf geometrische Progressionen eingehen, aber wenn Sie die Basis ändern möchten, gehen Sie wie folgt vor:

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)

Dadurch erhalten Sie den Bereich, nach dem Sie ursprünglich in Ihrer Frage gefragt haben: 300 -> Verlust von 10, 200 -> Verlust von 20. FYI 100 -> Verlust von 40 und 50 -> Verlust von 80 (!), Was bedeutet, dass Sie Ich müsste Ihre Subtraktion einschränken - was ich in den Zeilen (1) und (2) getan habe.

Es gibt natürlich auch andere Möglichkeiten, dieses ganze Problem anzugehen, und ich bin sicher, dass diejenigen, die mathematisch versierter sind als ich, hier posten werden.


0

Ich denke, Sie können nur eine einfache Division durch die Geschwindigkeit verwenden. Zum Beispiel: verloren = 3 000 / myVelocity. Wenn die Geschwindigkeit 300 beträgt, verlieren Sie 10, wenn es 200 ist, verlieren Sie 15. Es liegt an Ihnen, die richtigen Konstanten zu wählen.

Wenn Sie möchten, können Sie eine komplexere Formel verwenden, wie: Konstante / (Konstante2 * Geschwindigkeit ^ 2 + Konstante3 * Geschwindigkeit). Wieder - wählen Sie einfach Konstanten, die zu Ihnen passen.


Es ist völlig umgekehrt, was er verlangt hat und was in der realen Physik passiert.
Ali1S232

Ich verstehe dich nicht Was ist umgekehrt?
Zacharmarz

Ich glaube, ich habe deine Antwort falsch verstanden, meine schlechte.
Ali1S232
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.