Gleichung für springenden Graphen?


7

Grundsätzlich möchte ich, dass sich meine Kamera in 3D automatisch bewegt. Momentan habe ich eine lineare Bewegung, die ziemlich dumm ist, also würde ich gerne eine springende Bewegung machen.

Was ist jedoch eine gute Gleichung für das Hüpfen? Ich meine, für einen Kreis können Sie das tun y = sqrt(1 - x^2), aber wenn ich einen springenden Graphen hätte, wie würde die entsprechende Formel lauten? Ich denke, es ist etwas mit, absda es "springen" muss. So etwas wie (ich habe das mit Paint erfunden): springender Graph

Was ist eine gute Gleichung, die zu einem solchen Diagramm führt? Die Transformationen, die ich selbst machen kann, denke ich, aber ich suche nur nach der Art von Gleichung.


3
Vielleicht könnten Sie etwas in der Art von verwenden: y = abs (cos (x * 5) * max (1-x, 0))
Kromster

6
Die Verwendung einer grafischen Gleichung hilft Ihnen nicht dabei, natürlich aussehende Beschleunigungen auf das System anzuwenden. Sie werden überrascht sein, wie einfach es wäre, hier einfach Newtonsche Grundgleichungen zu verwenden. Geben Sie dem Objekt ein wenig Masse und Impuls und lassen Sie die Schwerkraft und Newton die Beschleunigungen und Positionsänderungen bewältigen. Es ist viel einfacher als Sie vielleicht denken.
Steve H

1
@SteveH Du solltest dies beantworten.
Notabene

@notabene ja, ich saß damit auf dem Zaun und du hast mich auf diese Seite geschoben. Vielen Dank. Ich zögerte, weil ich die 15 Minuten nicht damit verbringen wollte, eine Pseudocode-Lösung bereitzustellen.
Steve H

@Krom: Danke, ich habe momentan : y = abs(cos((x+18)/6.2)/((x+18)/6.2))*149. @SteveH: Könnten Sie möglicherweise die Schlüsselbegriffe in Newtonschen Lösungen angeben? Ich verwende anscheinend die falschen, da ich kein gutes Beispiel für die Implementierung finden kann.
Pimvdb

Antworten:


8

Die Verwendung einer grafischen Gleichung hilft Ihnen nicht dabei, natürlich aussehende Beschleunigungen auf das System anzuwenden. Sie werden überrascht sein, wie einfach es wäre, hier einfach Newtonsche Grundgleichungen zu verwenden. Geben Sie dem Objekt ein wenig Masse und Impuls und lassen Sie die Schwerkraft und Newton die Beschleunigungen und Positionsänderungen bewältigen. Es ist viel einfacher als Sie vielleicht denken


Beispiel der besagten Gleichung in Ihrer Antwort wäre großartig :)
Kromster


2
Hier ist das Beispiel: xna.multigan.com/pastebin/?page=view&id=1301401080 Ich habe es in XNA geschrieben, aber ich denke, es kann auch als Pseudocode gelesen werden
Steve H

Vielen Dank! Sie verdienen definitiv die Antwort als die akzeptierte :)
pimvdb

1
Am Ende hatte ich (JavaScript): jsfiddle.net/Cf9H4 .
Pimvdb

4

Anstatt eine direkte Antwort zu geben, möchte ich Sie in die richtige Richtung weisen. Wenn Sie nach KI suchen, um Objekte zu bewegen, finden Sie Algorithmen, die Variablen wie Geschwindigkeit, Masse, Geschwindigkeit und Beschleunigung verwenden. Wenn Sie die Gravitationskraft in die Gleichung einfügen, sollten Sie ein realistisches Verhalten erhalten.

Wie in einem der Kommentare zu Ihren Fragen angegeben, ist es nicht so kompliziert.

Ich empfehle, das Spiel AI anhand eines Beispiels zu programmieren, was ich sehr hilfreich fand.

Ich habe auch diesen Link gefunden , der die Kräfte erklärt, die für einen springenden Ball erforderlich sind.


2

Wenn Ihre Bewegung Ihrem Diagramm sehr ähnlich sein sollte, können Sie eine Bounce-Lockerungsgleichung wie diese ( Quelle ) verwenden:

// BOUNCE EASING: exponentially decaying parabolic bounce
easeOutBounce = function (t, b, c, d) {
    if ((t/=d) < (1/2.75)) {
        return c*(7.5625*t*t) + b;
    } else if (t < (2/2.75)) {
        return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
    } else if (t < (2.5/2.75)) {
        return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
    } else {
        return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
    }
};

easeInBounce = function (t, b, c, d) {
    return c - Math.easeOutBounce (d-t, 0, c, d) + b;
};

Die Bewegung würde in diesem Diagramm aussehen (easyIn): Bounce Leichtigkeit in


Ich muss sagen, das funktioniert einfach großartig. Anscheinend ist es nicht nur ein Diagramm, sondern eine Kombination von x^2Varianten. Wenn ich benutze, easeOutBounce(50, 0, 50, 50)bekomme ich den Bouncing-Effekt mit 50 Schritten im Bereich von 0 bis 50. Danke!
Pimvdb

1

Wenn Sie springen möchten, schauen Sie in den Restitutionskoeffizienten . Es ist ein Wert zwischen 0 und 1, der die "Sprungkraft" der Kamera darstellt. Ein Wert von 0 bedeutet, dass kein Aufprall auftritt, wenn das Objekt mit dem Boden kollidiert, und 1 bedeutet, dass die Kamera nach ihrer Kollision mit dem Boden wieder auf ihre ursprüngliche Höhe zurückspringt (in diesem Szenario sowieso).

Der einfachste Weg, dies zu implementieren, besteht darin, Ihrer Kamera einen anfänglichen Geschwindigkeitsvektor zu geben (nennen Sie es u), und Sie möchten den endgültigen Geschwindigkeitsvektor finden, nachdem die Kamera kollidiert ist (nennen wir dies v). Rufen wir den AdR an. E.

e = v / u

Alles, was Sie tun müssen, ist, Ihre Anfangsgeschwindigkeit mit dem Koeffizienten zu multiplizieren, diese Geschwindigkeit zu negieren (damit sie sich in die entgegengesetzte Richtung bewegt) und voila, Sie haben Ihre Endgeschwindigkeit und wenn Sie dies für jedes Mal tun, wenn sie kollidiert, haben Sie Ihre springende Bewegung. Dies setzt voraus, dass Sie eine flache Ebene haben, gegen die Sie springen möchten. Wenn Sie ein komplexes Netz haben, gegen das Sie kollidieren, multiplizieren Sie den Vektor nicht mit dem Normalen, sondern mit der Normalen des Polygons, mit dem Sie kollidieren (was im Wesentlichen der Fall ist) was Negation auf einer flachen Ebene macht).

Verwenden Sie eine Art Positionsaktualisierungsfunktion (Euler, Verlet oder sogar RK4 - siehe diesen Link ), um diese Aufgabe erheblich zu vereinfachen.

Hoffe das hilft (und ich hoffe meine Mathematik ist nicht zu weit weg: P)


1

Wenn Sie nach einer Gleichung suchen, die einen Sprung genau beschreibt, aber grob beschreibt, können Sie Folgendes versuchen:

y=(e^-x)*abs(4cos(5x))

wo

  • "4" ist der Koeffizient für die Höhe des Tropfens und der nachfolgenden Sprünge.
  • "5" ist die Häufigkeit der Bounces und
  • Der "abs" -Teil soll dem unteren Teil des Sprunges eine scharfe Flugbahn geben.

Nett. Warum wird das nicht mehr positiv bewertet?
JohannesA
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.