Wie simuliere ich ein schwingendes Pendel?


9

Ich möchte ein Seil mit einem Gewicht simulieren, das wie ein Pendel hin und her schwingt. Jede tatsächliche Physik ist übertrieben; es wiederholt nur endlos die gleiche Bewegung.

JQuery hat eine "Swing" Leichtigkeit ähnlich der, die ich suche. Wie funktioniert es?

Ich dachte daran, mich von einem Winkel zum anderen zu drehen Math.easeOutExpo, aber echte Pendel lassen sich anders lösen ...


2
Lassen Sie eine Sinuskurve in die Winkelgeschwindigkeit des Pendels einspeisen, sodass der Nullpunkt an den Spitzen und der höchste Geschwindigkeitswert unten liegt.
Schrotflinte Ninja

Antworten:


10

Nun, Sie müssen ein wenig Physik verwenden, aber Sie müssen keine Physik simulieren . Es gibt Formeln für die Pendelbewegung , mit denen Sie leicht die Drehung Ihres Pendels einstellen können. Bei kleinen Schwüngen kann die Bewegung mit einer einfachen harmonischen Bewegung angenähert werden .

Die Winkelverschiebung zu einem bestimmten Zeitpunkt kann angenähert werden mit:

Geben Sie hier die Bildbeschreibung ein

Dies ist für ein kleines Maximum θ am genauesten, wird aber wahrscheinlich für Ihre Zwecke genau genug sein. Erstellen Sie eine Funktion, die die aktuelle Zeit benötigt und den Winkel ausgibt, um den Ihr Pendel gedreht werden soll, und drehen Sie Ihr Sprite um diesen Betrag.


4

Hier ist eine No-Trig-Berechnung, die aus dem einfachen Trig und der Physik der Klasse 11 abgeleitet wurde. Es wird angenommen, dass der Ursprung der niedrigste Punkt der Pendelaufhängung ist, dass L die Länge des Pendels ist und dass die normale Grafikkonvention von y nach unten und x nach rechts zunimmt übernommen wird:

Update: Ich habe yAcceleration anfangs durcheinander gebracht. das ist einfacher.
Update Nr. 2 : Explizite Zeitsteuerung und Maßeinheiten hinzugefügt.

const float gravity = 9.8;     // units of metres/sec/sec
const float deltaT  = 0.001;   // equals 0.001 sec or 1 millisecond

var xVelocity = 0.010;         // units metres/sec equals 10 cm/sec 
var x = 0.0;                   // units metres
var y = 0.0;                   // units metres

while (true) {
  var xAcceleration = -gravity * (x/L) * (L-y)/L;

  x += (xVelocity + (xAcceleration/2 * deltaT)) * deltaT;
  y  = Math.SQRT(L*L - x*x) - L; 

  xVelocity += xAcceleration * deltaT;
}

2
In der Gleichung fehlt Zeit.
Maik Semder

@MaikSemder: Die Zeiteinheit ist definiert als der Animationszyklus, was auch immer das ist. Warum sollte man es anders machen?
Pieter Geerkens

Im Moment verwendet Ihre Beschleunigungsintegration eine implizite Zeit von 1 Einheit. Wenn Ihre Spielzeiteinheit Sekunden beträgt, können Sie nur 1 Simulationsframe pro Sekunde haben. Geben Sie einfach die Zeit explizit ein und Sie werden dieses Problem beseitigen. Die Zeit ist schon da, machen Sie es einfach explizit. Zum Beispiel variiert die Frame-Zeit, aber Sie benötigen eine stabile konstante Geschwindigkeit der Animation unabhängig von der Frame-Zeit, auch zwischen verschiedenen Plattformen, oder Sie möchten aus vielen Gründen einen Slomo-Effekt.
Maik Semder

1
Das war mein Punkt, g kommt von außen oder "das Spiel". Jetzt haben Sie die Zeiteinheit. Delta t ist momentan 1 dieser Zeiteinheit. Für eine Echtzeitsimulation ist das einfach nicht sehr praktisch, da Ihr Spiel eine eigene "Vorstellung" von der verstrichenen Zeit hat. Wenn Sie es als expliziten Parameter und nicht als implizite Konstante festlegen, kann Ihre Antwort für ein Spiel nützlich sein.
Maik Semder

2
Schön :) Geschwindigkeit muss auch mit "deltaT" multipliziert werden, um die "Verschiebung" aus der Geschwindigkeit herauszuholen, damit sie zu "x" hinzugefügt werden kann, hochgestuft
Maik Semder
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.