Pregunta

Quiero mover algo de una distancia determinada. Sin embargo, en mi sistema no es la inercia / arrastre / accelaration negativo. Estoy usando un cálculo simple como esto para él:

v = oldV + ((targetV - oldV) * inertia)

La aplicación de que más de un número de cuadros hace que el movimiento 'rampa ascendente' o descomposición, por ejemplo:

v = 10 + ((0 - 10) * 0.25) = 7.5 // velocity changes from 10 to 7.5 this frame

Así que sé la distancia quiero viajar y la aceleración, pero no la velocidad inicial que me va a llegar allí. Tal vez una mejor explicación es que quiero saber lo difícil para golpear una bola de billar para que se detenga en un punto determinado.

He estado buscando en las ecuaciones de movimiento ( http://en.wikipedia.org/wiki / Equations_of_motion), pero no puede llegar a lo que es la correcta para mi problema ...

¿Alguna idea? Gracias - Soy de un diseño no es ciencia de fondo

.

Actualización: Fiirhok tiene una solución con un valor de aceleración fija; HTML + jQuery demo:
http://pastebin.com/ekDwCYvj
¿Hay alguna manera de hacer esto con un valor fraccionario o una función de aceleración? La ventaja de que en mi experiencia es que la aceleración fija y animación basada en marco a veces rebasa el punto final y debe ser forzada, creando un pequeño problema de rotura.

¿Fue útil?

Solución

Este es un simple problema de cinemática.

En algún momento t, la velocidad (v) de un objeto bajo aceleración constante se describe mediante:

v = v0 + at

Cuando v0 es la velocidad inicial y a es la aceleración. En su caso, la velocidad final es cero (el objeto se detiene) por lo que puede despejar t:

t = -v0/a

Para ver la diferencia total recorrida, tomamos la integral de la velocidad (la primera ecuación) en el tiempo. No he hecho una integral en años, pero estoy bastante seguro de que éste funciona a:

d = v0t + 1/2 * at^2

Podemos sustituir en la ecuación para T desarrollamos ealier:

d = v0^2/a + 1/2 * v0^2 / a

Y la solución para v0:

v0 = sqrt(-2ad)

O, en un formato más programación en:

initialVelocity = sqrt( -2 * acceleration * distance );

La aceleración en este caso es negativo (el objeto se está desacelerando), y estoy suponiendo que es constante, de lo contrario esta se vuelve más complicado.

Si desea utilizar esta dentro de un bucle con un número finito de pasos, que tendrá que ser un poco cuidadoso. Cada iteración del bucle representa un período de tiempo. El objeto se moverá una cantidad igual a la promedio veces la velocidad de la longitud de tiempo. Un bucle de muestra con la longitud de tiempo de una iteración igual a 1 sería algo como esto:

position = 0;
currentVelocity = initialVelocity;
while( currentVelocity > 0 )
{
    averageVelocity = currentVelocity + (acceleration / 2);
    position = position + averageVelocity;
    currentVelocity += acceleration;
}

Otros consejos

Si desea mover una distancia determinada, utilice la siguiente:

text alt

Distancia recorrida es simplemente la integral de la velocidad con respecto al tiempo. Es necesario integrar su expresión con respecto al tiempo con los límites [v, 0] y esto le dará una expresión para la distancia en términos de v (velocidad inicial).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top