¿Cómo simulo un péndulo oscilante?

9

Quiero simular una cuerda con un peso unido, balanceándose hacia adelante y hacia atrás como un péndulo. Cualquier física real es exagerada; simplemente repite sin cesar el mismo movimiento.

JQuery tiene una facilidad de "swing" similar a la que estoy buscando. ¿Como funciona?

Estaba pensando en rotar de un ángulo a otro con Math.easeOutExpo, pero los péndulos reales se alivian de manera diferente ...

mjanisz1
fuente
2
Haga que una curva sinusoidal alimente la velocidad angular del péndulo, de modo que el punto cero esté en los picos y el valor de velocidad más alto esté en la parte inferior.
Shotgun Ninja

Respuestas:

10

Bueno, tendrás que usar un poco de física, pero no necesitas simular ninguna física. Existen fórmulas para el movimiento del péndulo que puede usar fácilmente para establecer la rotación de su péndulo. Para oscilaciones pequeñas, el movimiento se puede aproximar con un movimiento armónico simple .

El desplazamiento angular en un momento específico se puede aproximar con:

ingrese la descripción de la imagen aquí

Esto es más preciso para un pequeño máximo θ, pero probablemente será lo suficientemente preciso para sus propósitos. Cree una función que tome el tiempo actual y genere el ángulo por el cual debe rotar su péndulo, y gire su sprite en esa cantidad.

MichaelHouse
fuente
4

Aquí hay un cálculo sin trigonometría, derivado de Trig y Física de Grado 11. Se supone que el origen es el punto más bajo de la suspensión del péndulo, que L es la longitud del péndulo y que se adopta la convención gráfica normal de y aumentando hacia abajo yx aumentando a la derecha:

Actualización: me equivoqué y Aceleración inicialmente; Esto es más fácil.
Actualización n. ° 2 : Se agregó control de tiempo explícito y se agregaron unidades de medida.

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
fuente
2
Falta tiempo en la ecuación.
Maik Semder
@MaikSemder: la unidad de tiempo se define como el ciclo de animación, sea lo que sea. ¿Por qué uno lo haría de otra manera?
Pieter Geerkens
En este momento, su integración de aceleración utiliza un tiempo implícito de 1 unidad. Si su unidad de tiempo de juego es segundos, solo podría tener 1 cuadro de simulación por segundo, solo conecte el tiempo explícitamente y se librará de ese problema. El tiempo ya está allí, solo explícalo. Por ejemplo, el tiempo de fotograma varía, pero necesita una velocidad constante estable de la animación independiente del tiempo de fotograma, también entre diferentes plataformas, o si desea un efecto slomo, hay muchas razones.
Maik Semder
1
Ese era mi punto, g viene de afuera o "el juego". Ahora tienes la unidad de tiempo. Delta t en este momento es 1 de esa unidad de tiempo. Para una simulación en tiempo real, eso no es muy conveniente, ya que su juego tiene su propia "idea" del tiempo transcurrido. Convertirlo en un parámetro explícito en lugar de una constante implícita puede hacer que su respuesta sea útil para un juego.
Maik Semder
2
Niza :) la velocidad también debe multiplicarse con "deltaT", para poder sacar el "desplazamiento" de la velocidad, de modo que pueda agregarse a "x", votada
Maik Semder