Come posso simulare un pendolo oscillante?


9

Voglio simulare una corda con un peso attaccato, oscillando avanti e indietro come un pendolo. Qualsiasi fisica reale è eccessiva; sta ripetendo all'infinito lo stesso movimento.

JQuery ha uno stile "swing" simile a quello che sto cercando. Come funziona?

Stavo pensando di ruotare da un angolo all'altro Math.easeOutExpo, ma i pendoli reali si allentano in modo diverso ...


2
Avere una curva sinusoidale immettersi nella velocità angolare del pendolo, in modo che il punto zero sia ai picchi e il valore della velocità più alta sia nella parte inferiore.
Fucile Ninja

Risposte:


10

Bene, dovrai usare un po 'di fisica, ma non devi simulare alcuna fisica. Esistono formule per il pendolo movimento del che puoi facilmente utilizzare per impostare la rotazione del pendolo. Per piccole oscillazioni, il movimento può essere approssimato con un semplice movimento armonico .

Lo spostamento angolare in un momento specifico può essere approssimato con:

inserisci qui la descrizione dell'immagine

Questo è più preciso per un piccolo massimo θ, ma probabilmente sarà abbastanza preciso per i tuoi scopi. Crea una funzione che richiede l'ora corrente e genera l'angolo per il quale il pendolo dovrebbe essere ruotato e ruota la tua sprite di tale importo.


4

Ecco un calcolo no-trig, derivato da Trig 11 elementare e fisica semplici. Presuppone che l'origine sia il punto più basso della sospensione del pendolo, che L sia la lunghezza del pendolo e che sia adottata la normale convenzione grafica di y che aumenta in basso e che x aumenta a destra:

Aggiornamento: inizialmente ho incasinato yAcceleration; questo è più facile.
Aggiornamento n. 2 : aggiunto controllo del tempo esplicito e unità di misura aggiunte.

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
Manca il tempo nell'equazione.
Maik Semder,

@MaikSemder: l'unità di tempo è definita come il ciclo di animazione, qualunque esso sia. Perché uno dovrebbe fare diversamente?
Pieter Geerkens,

In questo momento l'integrazione di accelerazione utilizza un tempo implicito di 1 unità. Se la tua unità di tempo di gioco è di secondi, potresti avere solo 1 fotogramma di simulazione al secondo, basta collegare il tempo esplicitamente e ti libererai di quel problema. Il tempo è già lì, basta renderlo esplicito. Ad esempio, il tempo dei fotogrammi varia, ma è necessaria una velocità costante stabile dell'animazione indipendentemente dal tempo dei fotogrammi, anche tra piattaforme diverse o si desidera un effetto slomo, molte ragioni.
Maik Semder,

1
Quello era il mio punto, g viene dall'esterno o "il gioco". Ora hai l'unità di tempo. Delta t in questo momento è 1 di quell'unità di tempo. Per una simulazione in tempo reale non è molto conveniente, dal momento che il tuo gioco ha una sua "idea" del tempo trascorso. Renderlo un parametro esplicito piuttosto che una costante implicita può rendere la tua risposta utile per un gioco.
Maik Semder,

2
Bello :) anche la velocità deve essere moltiplicata con "deltaT", al fine di ottenere lo "spostamento" fuori dalla velocità, in modo che possa essere aggiunto a "x", potenziato
Maik Semder
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.