Quiero simular una caída libre y una colisión con el suelo (por ejemplo, una pelota que rebota). El objeto caerá en el vacío: se puede omitir la resistencia del aire. Una colisión con el suelo debería causar cierta pérdida de energía, por lo que finalmente el objeto dejará de moverse. Uso JOGL para representar un punto que es mi objeto que cae. Una gravedad es constante (-9.8 m/s^2).simulación de gravedad
he encontrado un método de Euler para calcular una nueva posición del punto:
deltaTime = currentTime - previousTime;
vel += acc * deltaTime;
pos += vel * deltaTime;
pero estoy haciendo algo mal. El punto rebota un par de veces y luego se mueve hacia abajo (muy lento).
Aquí es un pseudocódigo (inicial pos = (0.0f, 2.0f, 0.0f), vel inicial (0.0f, 0.0f, 0.0f), la gravedad = -9.8f):
display()
{
calculateDeltaTime();
velocity.y += gravity * deltaTime;
pos.y += velocity.y * deltaTime;
if(pos.y < -2.0f) //a collision with the ground
{
velocity.y = velocity.y * energyLoss * -1.0f;
}
}
¿Cuál es la mejor manera de lograr un efecto realista? ¿Cómo se refiere el método euler a las ecuaciones de aceleración constante?
¿Qué sucede si simplemente elimina la pérdida de energía de la ecuación? – redbmk
aparte de la respuesta de Yochai, puede considerar establecer 'pos.y' en el nivel del suelo en su caso de colisión para evitar errores de recorte –
Sin pérdida de energía, el punto también deja de rebotar después de un período de tiempo y baja muy lentamente. – Vert