Jak symulować wahadło wahadłowe?

9

Chcę symulować linę z przymocowanym ciężarem, kołyszącą się w przód iw tył jak wahadło. Każda faktyczna fizyka to przesada; po prostu bez końca powtarza ten sam ruch.

JQuery ma łatwość „huśtania się” podobną do tego, czego szukam. Jak to działa?

Myślałem o obracaniu się pod jednym kątem Math.easeOutExpo, ale prawdziwe wahadła zmieniają się inaczej ...

mjanisz1
źródło
2
Poprowadź krzywą sinusoidalną do prędkości kątowej wahadła, tak aby punkt zerowy znajdował się na szczytach, a najwyższa wartość prędkości na dole.
Shotgun Ninja

Odpowiedzi:

10

Cóż, będziesz musiał użyć odrobiny fizyki, ale nie musisz symulować żadnej fizyki. Istnieją formuły ruchu wahadła, których można łatwo użyć do ustawienia obrotu wahadła. W przypadku małych wahań ruch można aproksymować prostym ruchem harmonicznym .

Przemieszczenie kątowe w określonym czasie można aproksymować za pomocą:

wprowadź opis zdjęcia tutaj

Jest to najdokładniejsze dla małego maksimum θ, ale prawdopodobnie będzie wystarczająco dokładne dla twoich celów. Utwórz funkcję, która pobiera bieżący czas i podaje kąt, o jaki należy obrócić wahadło, i obróć duszka o tę wartość.

MichaelHouse
źródło
4

Oto obliczenia bez wyzwalania, pochodzące z prostego Trig 11 i fizyki klasy 11. Zakłada się, że początkiem jest najniższy punkt zawieszenia wahadła, że ​​L jest długością wahadła i przyjęto normalną konwencję graficzną y zwiększającą się w dół, a x zwiększającą się w prawo:

Aktualizacja: Na początku pomieszałem yAcceleration; to jest łatwiejsze.
Aktualizacja nr 2 : Dodano wyraźną kontrolę czasu i dodano jednostki miary.

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;
}
Pieter Geerkens
źródło
2
W równaniu brakuje czasu.
Maik Semder
@ MaikSemder: Jednostką czasu jest cykl animacji, cokolwiek to jest. Dlaczego miałoby to robić inaczej?
Pieter Geerkens
W tej chwili twoja integracja przyspieszenia używa domyślnego czasu 1 jednostki. Jeśli jednostką czasu w grze są sekundy, możesz mieć tylko 1 klatkę symulacji na sekundę, po prostu podłącz czas wyraźnie i pozbądź się tego problemu. Czas już tam jest, po prostu wyraź go. Na przykład czas klatki jest różny, ale potrzebujesz stabilnej stałej prędkości animacji niezależnie od czasu klatki, również między różnymi platformami, lub chcesz efektu slomo, z wielu powodów.
Maik Semder
1
To był mój punkt, g pochodzi z zewnątrz lub „gra”. Teraz masz jednostkę czasu. Delta t obecnie wynosi 1 tej jednostki czasu. Dla symulacji w czasie rzeczywistym nie jest to zbyt wygodne, ponieważ twoja gra ma swój „pomysł” na upływ czasu. Uczynienie go jawnym parametrem zamiast niejawnej stałej może uczynić twoją odpowiedź przydatną w grze.
Maik Semder
2
Fajnie :) prędkość należy również pomnożyć przez „deltaT”, aby uzyskać „przemieszczenie” z prędkości, dzięki czemu można ją dodać do „x”, głosowano
Maik Semder